diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index ebe51d3b..00000000
--- a/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-# EditorConfig is awesome: https://EditorConfig.org
-
-# top-most EditorConfig file
-root = true
-
-[*]
-indent_style = space
-indent_size = 2
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = false
-insert_final_newline = false
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000..22159469
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,18 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true
+  },
+  'extends': [
+    'plugin:vue/essential',
+    'eslint:recommended'
+  ],
+  rules: {
+    'no-console': 'off',
+    'vue/return-in-computed-property': 'off',
+  },
+  parserOptions: {
+    parser: 'babel-eslint'
+  },
+  ignorePatterns: ['**/*spec.js']
+}
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 205021e4..00000000
--- a/.gitattributes
+++ /dev/null
@@ -1,2 +0,0 @@
-# Enforce Unix newlines
-* text=auto eol=lf
diff --git a/.github/.stale.yml b/.github/.stale.yml
deleted file mode 100644
index c2b8bcee..00000000
--- a/.github/.stale.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Number of days of inactivity before an issue becomes stale
-daysUntilStale: 360
-# Number of days of inactivity before a stale issue is closed
-daysUntilClose: 7
-# Issues with these labels will never be considered stale
-exemptLabels:
-  - pinned
-  - security
-# Label to use when marking an issue as stale
-staleLabel: wontfix
-# Comment to post when marking an issue as stale. Set to `false` to disable
-markComment: >
-  This issue has been automatically marked as stale because it has not had
-  recent activity. It will be closed if no further activity occurs. Thank you
-  for your contributions.
-# Comment to post when closing a stale issue. Set to `false` to disable
-closeComment: false
\ No newline at end of file
diff --git a/.github/COMMIT_CONVENTION.md b/.github/COMMIT_CONVENTION.md
index 261c7ca2..fc436da5 100644
--- a/.github/COMMIT_CONVENTION.md
+++ b/.github/COMMIT_CONVENTION.md
@@ -10,10 +10,10 @@ Appears under "Features" header, `compiler` subheader:
 feat(compiler): add 'comments' option
 ```
 
-Appears under "Bug Fixes" header, `sidebar` subheader, with a link to issue #28:
+Appears under "Bug Fixes" header, `v-model` subheader, with a link to issue #28:
 
 ```
-fix(sidebar): handle events on blur
+fix(v-model): handle events on blur
 
 close #28
 ```
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 77fd8019..37d6ae2a 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,178 +1,34 @@
-# Contributing to CoreUI
+# Contributing
 
-Looking to contribute something to CoreUI? **Here's how you can help.**
+## Usage
 
-Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved.
+```bash
+# Install dependencies
+npm install
 
-Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue or assessing
-patches and features.
+# Build 
+npm run build
 
-## Using the issue tracker
+# Run all tests with lint/jest
+npm run test
 
-The [issue tracker](https://github.com/coreui/coreui-vue/issues) is
-the preferred channel for [bug reports](#bug-reports), [features requests](#feature-requests)
-and [submitting pull requests](#pull-requests), but please respect the following
-restrictions:
+# Run test in watch mode
+npm run test:watch
 
-* Please **do not** use the issue tracker for personal support requests.
+# Update test snapshot
+npm run test:update
 
-* Please **do not** post comments consisting solely of "+1" or ":thumbsup:".
-  Use [GitHub's "reactions" feature](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments)
-  instead.
+# Run linter
+npm run lint
 
-## Bug reports
+# Run linter with auto fix
+npm run lint:fix
+```
+## Workflow
 
-A bug is a _demonstrable problem_ that is caused by the code in the repository.
-Good bug reports are extremely helpful, so thanks!
-
-Guidelines for bug reports:
-
-0. **Validate and lint your code** &mdash; to ensure your problem isn't caused by a simple error in your own code.
-
-1. **Use the GitHub issue search** &mdash; check if the issue has already been reported.
-
-2. **Check if the issue has been fixed** &mdash; try to reproduce it using the latest `master` or development branch in the repository.
-
-3. **Isolate the problem** &mdash; ideally create a [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live example. [This JS Bin](http://jsbin.com/lefey/1/edit?html,output) is a helpful template.
-
-
-A good bug report shouldn't leave others needing to chase you up for more
-information. Please try to be as detailed as possible in your report. What is
-your environment? What steps will reproduce the issue? What browser(s) and OS
-experience the problem? Do other browsers show the bug differently? What
-would you expect to be the outcome? All these details will help people to fix
-any potential bugs.
-
-Example:
-
-> Short and descriptive example bug report title
->
-> A summary of the issue and the browser/OS environment in which it occurs. If
-> suitable, include the steps required to reproduce the bug.
->
-> 1. This is the first step
-> 2. This is the second step
-> 3. Further steps, etc.
->
-> `<url>` - a link to the reduced test case
->
-> Any other information you want to share that is relevant to the issue being
-> reported. This might include the lines of code that you have identified as
-> causing the bug, and potential solutions (and your opinions on their
-> merits).
-
-## Feature requests
-
-Feature requests are welcome. Before opening a feature request, please take a
-moment to find out whether your idea fits with the scope and aims of the
-project. It's up to *you* to make a strong case to convince the project's
-developers of the merits of this feature. Please provide as much detail
-and context as possible.
-
-
-## Pull requests
-
-Good pull requests—patches, improvements, new features—are a fantastic
-help. They should remain focused in scope and avoid containing unrelated
-commits.
-
-**Please ask first** before embarking on any significant pull request (e.g.
-implementing features, refactoring code, porting to a different language),
-otherwise you risk spending a lot of time working on something that the
-project's developers might not want to merge into the project.
-
-Adhering to the following process is the best way to get your work
-included in the project:
-
-1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork,
-   and configure the remotes:
-
-   ```bash
-   # Clone your fork of the repo into the current directory
-   git clone https://github.com/<your-username>/coreui-react.git
-   # Navigate to the newly cloned directory
-   cd coreui
-   # Assign the original repo to a remote called "upstream"
-   git remote add upstream https://github.com/coreui/coreui-vue.git
-   ```
-
-2. If you cloned a while ago, get the latest changes from upstream:
-
-   ```bash
-   git checkout master
-   git pull upstream master
-   ```
-
-3. Create a new topic branch (off the main project development branch) to
-   contain your feature, change, or fix:
-
-   ```bash
-   git checkout -b <topic-branch-name>
-   ```
-
-4. Commit your changes in logical chunks. Please adhere to these [git commit
-   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
-   or your code is unlikely to be merged into the main project. Use Git's
-   [interactive rebase](https://help.github.com/articles/interactive-rebase)
-   feature to tidy up your commits before making them public.
-
-5. Locally merge (or rebase) the upstream development branch into your topic branch:
-
-   ```bash
-   git pull [--rebase] upstream master
-   ```
-
-6. Push your topic branch up to your fork:
-
-   ```bash
-   git push origin <topic-branch-name>
-   ```
-
-7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
-    with a clear title and description against the `master` branch.
-
-**IMPORTANT**: By submitting a patch, you agree to allow the project owners to
-license your work under the terms of the [MIT License](LICENSE).
-
-### Semantic Git commit messages
-
-Inspired by Sparkbox's awesome article on
-[semantic commit messages](http://seesparkbox.com/foundry/semantic_commit_messages).
-Please use following commit message format.
-
-* chore (updating npm tasks etc; no production code change) -> ```git test -m 'chore: commit-message-here'```
-* docs (changes to documentation) -> ```git commit -m 'docs: commit-message-here'```
-* feat (new feature) -> ```git commit -m 'feat: commit-message-here'```
-* fix (bug fix) -> ```git commit -m 'fix: commit-message-here'```
-* refactor (refactoring production code) -> ```git commit -m 'refactor: commit-message-here'```
-* style (formatting, missing semi colons, etc; no code change) -> ```git commit -m 'style: commit-message-here'```
-* test (adding missing tests, refactoring tests; no production code change) -> ```git test -m 'refactor: commit-message-here'```
-
-## Code guidelines
-
-### HTML
-
-[Adhere to the Code Guide.](http://codeguide.co/#html)
-
-- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags).
-- 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://`.
-- Use [WAI-ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) attributes in documentation examples to promote accessibility.
-
-### CSS
-
-[Adhere to the Code Guide.](http://codeguide.co/#css)
-
-- When feasible, default color palettes should comply with [WCAG color contrast guidelines](http://www.w3.org/TR/WCAG20/#visual-audio-contrast).
-- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](http://a11yproject.com/posts/never-remove-css-outlines) for more details.
-
-### JS
-
-- No semicolons (in client-side JS)
-- 2 spaces (no tabs)
-- strict mode
-- "Attractive"
-- Don't use [jQuery event alias convenience methods](https://github.com/jquery/jquery/blob/master/src/event/alias.js) (such as `$().focus()`). Instead, use [`$().trigger(eventType, ...)`](http://api.jquery.com/trigger/) or [`$().on(eventType, ...)`](http://api.jquery.com/on/), depending on whether you're firing an event or listening for an event. (For example, `$().trigger('focus')` or `$().on('focus', function (event) { /* handle focus event */ })`) We do this to be compatible with custom builds of jQuery where the event aliases module has been excluded.
-
-## License
-
-By contributing your code, you agree to license your contribution under the [MIT License](LICENSE).
\ No newline at end of file
+- Create a component in the src/components folder
+- Add tests in the src/components/\_\_tests\_\_ folder
+- Register this component in src/index.js
+- Run lint and tests before commiting anything
+- Commit using [Commit Convention](./COMMIT_CONVENTION.md) 
+- PR on github
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 544d42d2..00000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-# These are supported funding model platforms
-
-custom: "https://coreui.io/pricing/?support=true"
-open_collective: coreui
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000..39ff2963
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,26 @@
+Before opening an issue:
+
+- [Search for duplicate or closed issues](https://github.com/coreui/coreui-vue/issues?utf8=%E2%9C%93&q=is%3Aissue)
+- Prepare a [reduced test case](https://css-tricks.com/reduced-test-cases/) for any bugs
+- Read the [contributing guidelines](./CONTRIBUTING.md)
+
+When asking general "how to" questions:
+
+- Please do not open an issue here
+- Post your question here - https://community.coreui.io/c/support/coreui-for-vue/16
+
+When reporting a bug, include:
+
+- Operating system and version (Windows, Mac OS X, Android, iOS, etc...)
+- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
+- Reduced test cases and potential fixes using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
+
+When suggesting a feature:
+
+- Please do not open an issue here, 
+- Post your feature request here - https://community.coreui.io/c/feature-requests/12
+- Include:
+  - As much detail as possible for what we should add and why it's important to CoreUI for Vue.js
+  - Relevant links to prior art, screenshots, or live demos whenever possible
+
+**Please use GitHub only when reporting a bug, all issues with the general "how to" questions will be automatically closed.**
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 7600be55..00000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: Bug report
-about: Tell us about a bug you may have identified in Bootstrap.
-title: ''
-labels: ''
-assignees: ''
-
----
-
-Before opening:
-
-- [Search for duplicate or closed issues](https://github.com/coreui/coreui-vue/issues?utf8=%E2%9C%93&q=is%3Aissue)
-- [Validate](https://html5.validator.nu/) any HTML to avoid common problems
-- Read the [contributing guidelines](https://github.com/coreui/coreui-vue/blob/main/.github/CONTRIBUTING.md)
-
-Bug reports must include:
-
-- Operating system and version (Windows, macOS, Android, iOS)
-- Browser and version (Chrome, Firefox, Safari, Microsoft Edge, Opera, Android Browser)
-- A [reduced test case](https://css-tricks.com/reduced-test-cases/) or suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 5b09443c..00000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for a new feature in CoreUI.
-title: ''
-labels: feature
-assignees: ''
-
----
-
-Before opening:
-
-- [Search for duplicate or closed issues](https://github.com/coreui/coreui-vue/issues?utf8=%E2%9C%93&q=is%3Aissue)
-- Read the [contributing guidelines](https://github.com/coreui/coreui-vue/blob/main/.github/CONTRIBUTING.md)
-
-Feature requests must include:
-
-- As much detail as possible for what we should add and why it's important to Bootstrap
-- Relevant links to prior art, screenshots, or live demos whenever possible
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..e3286a13
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,35 @@
+<!--
+Please make sure to read the Pull Request Guidelines:
+https://github.com/coreui/coreui-vue/.github/CONTRIBUTING.md#pull-request-guidelines
+-->
+
+<!-- PULL REQUEST TEMPLATE -->
+<!-- (Update "[ ]" to "[x]" to check a box) -->
+
+**What kind of change does this PR introduce?** (check at least one)
+
+- [ ] Bugfix
+- [ ] Feature
+- [ ] Code style update
+- [ ] Refactor
+- [ ] Build-related changes
+- [ ] Other, please describe:
+
+**Does this PR introduce a breaking change?** (check one)
+
+- [ ] Yes
+- [ ] No
+
+If yes, please describe the impact and migration path for existing applications:
+
+**The PR fulfills these requirements:**
+
+- [ ] It's submitted to the `develop` branch (or to a previous version branch), _not_ the `master` branch
+- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number)
+- [ ] All tests are passing
+- [ ] New/updated tests are included
+
+If adding a **new feature**, the PR's description includes:
+- [ ] A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it)
+
+**Other information:**
diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
deleted file mode 100644
index 74584c95..00000000
--- a/.github/SUPPORT.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Bug reports
-
-See the [contributing guidelines](CONTRIBUTING.md) for sharing bug reports.
-
-### How-to
-
-For general troubleshooting or help getting started:
-
-- Join [GitHub Discussions](https://github.com/coreui/coreui-vue/discussions).
diff --git a/.github/workflows/daily-project-check.yml b/.github/workflows/daily-project-check.yml
index 5776ce77..dcfb1aa4 100644
--- a/.github/workflows/daily-project-check.yml
+++ b/.github/workflows/daily-project-check.yml
@@ -12,7 +12,7 @@ jobs:
 
     strategy:
       matrix:
-        node-version: [12.x]
+        node-version: [14.x]
         os: [ubuntu-latest, windows-latest, macOS-latest]
 
     steps:
@@ -21,11 +21,9 @@ jobs:
       uses: actions/setup-node@v1
       with:
         node-version: ${{ matrix.node-version }}
-    - name: npm install, build, test and lint
+    - name: npm install, build, test:coverage and lint
       run: |
         npm i
-        npm run build
-        npm run jest:test
-        npm run lint
+        npm run release
       env:
         CI: true
diff --git a/.github/workflows/project-check.yml b/.github/workflows/project-check.yml
index 854186a4..dd849d89 100644
--- a/.github/workflows/project-check.yml
+++ b/.github/workflows/project-check.yml
@@ -5,8 +5,6 @@ on:
     branches:
       - master
   pull_request:
-    branches:
-      - master
 
 jobs:
   build:
@@ -15,7 +13,7 @@ jobs:
 
     strategy:
       matrix:
-        node-version: [12.x]
+        node-version: [14.x]
         os: [ubuntu-latest, windows-latest, macOS-latest]
 
     steps:
@@ -24,11 +22,9 @@ jobs:
       uses: actions/setup-node@v1
       with:
         node-version: ${{ matrix.node-version }}
-    - name: npm install, build, test and lint
+    - name: npm install, build, test:coverage and lint
       run: |
         npm i
-        npm run build
-        npm run jest:test
-        npm run lint
+        npm run release
       env:
         CI: true
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
deleted file mode 100644
index 93e2ebb1..00000000
--- a/.github/workflows/stale.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
-#
-# You can adjust the behavior by modifying this file.
-# For more information, see:
-# https://github.com/actions/stale
-name: Mark stale issues and pull requests
-
-on:
-  schedule:
-  - cron: '17 14 * * *'
-
-jobs:
-  stale:
-
-    runs-on: ubuntu-latest
-    permissions:
-      issues: write
-      pull-requests: write
-
-    steps:
-    - uses: actions/stale@v3
-      with:
-        repo-token: ${{ secrets.GITHUB_TOKEN }}
-        stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions'
-        stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions'
-        stale-issue-label: 'no-issue-activity'
-        stale-pr-label: 'no-pr-activity'
diff --git a/.gitignore b/.gitignore
index 054fb7a7..e87d4b4c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,42 +1,39 @@
-# Folders to ignore
+# Dependency directories
+node_modules/
+package-lock.json
+
+# Coverage directory
 coverage/
+
+# Generated code
 dist/
-node_modules/
-yarn.lock
 
-# local env files
-.env.local
-.env.*.local
+### Node ###
+# Logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
 
-# OS or Editor folders
-._*
-.cache
-.temp
-.DS_Store
+# Integrity files
+.yarn-integrity
+
+# Optional npm cache directory
+.npm
+
+# Editor directories and files
 .idea
-.project
-.settings
-.tmproj
-*.esproj
-*.sublime-project
-*.sublime-workspace
+.vscode
 *.suo
 *.ntvs*
 *.njsproj
 *.sln
-*.sw?
-nbproject
-Thumbs.db
-/.vscode/
-
-# Numerous always-ignore extensions
-*.diff
-*.err
-*.log
-*.orig
-*.rej
-*.swo
-*.swp
-*.vi
-*.zip
-*~
+
+# Misc
+.DS_Store
+
+# Optional eslint cache
+.eslintcache
+
+# dotenv environment variables file
+.env
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 0aa07a72..00000000
--- a/.gitmodules
+++ /dev/null
@@ -1,8 +0,0 @@
-[submodule "packages/coreui-icons-vue"]
-	path = packages/coreui-icons-vue
-	url = https://github.com/coreui/coreui-icons-vue.git
-  	branch = main
-[submodule "packages/coreui-vue-chartjs"]
-	path = packages/coreui-vue-chartjs
-	url = https://github.com/coreui/coreui-vue-chartjs.git
-  	branch = main
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 567609b1..00000000
--- a/.prettierignore
+++ /dev/null
@@ -1 +0,0 @@
-build/
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 27a44689..00000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "editor.defaultFormatter": "esbenp.prettier-vscode"
-  }
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..cfb17154
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,280 @@
+# Changelog
+
+## [3.2.11](https://github.com/coreui/coreui-vue/compare/3.2.9...3.2.11)
+
+> 21 May 2021
+
+### Changed
+
+- chore: dependencies update [`da10ba8`](https://github.com/coreui/coreui-vue/commit/da10ba852759a3b7e96cd8ca848e91439d457c38)
+- test(CDataTable): snapshot update [`d1198cd`](https://github.com/coreui/coreui-vue/commit/d1198cd331038d366fc4bedb223c442310f900b0)
+- test(CDropdown): emits click on split button click [`807eba6`](https://github.com/coreui/coreui-vue/commit/807eba6771d4d8e37ec4dbe4c940491c3b937654)
+- Add new function to emit on splitButtonPress [`adba664`](https://github.com/coreui/coreui-vue/commit/adba664fdd16e623f2b40cae1ff9876bf75ef23c)
+- fix(CDataTable): rtl margins for labels and cleaner icon [`578a76c`](https://github.com/coreui/coreui-vue/commit/578a76cb1b18ca9292ea6be0b10633dc86dd3e39)
+- feat: additional dialog classes property for CModal.vue [`0253d98`](https://github.com/coreui/coreui-vue/commit/0253d98594528cf19d734bfdaee4d7b6edce7777)
+- chore: 3.2.11 version release [`f0c5210`](https://github.com/coreui/coreui-vue/commit/f0c5210816e9fa1b798c72ba6faac3bfe22d6907)
+- Fix RTL direction margin [`3b9ea32`](https://github.com/coreui/coreui-vue/commit/3b9ea32f3ab8751be8b52b3d6f1ac6d6d09ba0b7)
+- fix(CModal): add scrollable prop to index.d.ts [`f9d15ba`](https://github.com/coreui/coreui-vue/commit/f9d15bab5cb7fac519865af9c504098242687b28)
+
+
+### Fixed
+
+- feat(CDropdown): emit event on split dropdown button click - close #134 close #135 - thanks @rabrowne85 [`#134`](https://github.com/coreui/coreui-vue/issues/134) [`#135`](https://github.com/coreui/coreui-vue/issues/135)
+- fix(CDataTable): striped style not working with details slot [`#127`](https://github.com/coreui/coreui-vue/issues/127) [`#77`](https://github.com/coreui/coreui-vue/issues/77)
+- fix(CDataTable): v-else without v-if breaking Parcel - thanks @adamshaylor [`#143`](https://github.com/coreui/coreui-vue/issues/143) [`#144`](https://github.com/coreui/coreui-vue/issues/144)
+- Merge fix(CDataTable): rtl margins - closes #145 thanks @seddighi78 [`#145`](https://github.com/coreui/coreui-vue/issues/145)
+## [3.2.9](https://github.com/coreui/coreui-vue/compare/3.2.7...3.2.9)
+
+> 11 March 2021
+
+### Changed
+
+- chore: dependencies update [`58808fc`](https://github.com/coreui/coreui-vue/commit/58808fca45cd275ea12db7a0713746af521ee4ca)
+- chore: 3.2.9 version release [`9ffeb6a`](https://github.com/coreui/coreui-vue/commit/9ffeb6add72ed77a43fd8a4c16d4dc7792872b07)
+- chore(workflows): update [`bb86013`](https://github.com/coreui/coreui-vue/commit/bb86013f324c51b810ee1af39a86a1f1d662830a)
+- chore: merge user pull request #141 [`45483c5`](https://github.com/coreui/coreui-vue/commit/45483c5afabb7f41ce2c4dcfcd995d92b6e93167)
+- fix(CDataTable): fixed issue with loading/no-items-slot [`91024bc`](https://github.com/coreui/coreui-vue/commit/91024bc759c9b0b17ab28dd2739bd9a2b1023db3)
+
+## [3.2.7](https://github.com/coreui/coreui-vue/compare/3.1.6...3.2.7)
+
+> 17 December 2020
+
+### Changed
+
+- chore: 3.2.7 version release [`94bb062`](https://github.com/coreui/coreui-vue/commit/94bb062091ff4c7bf3d3e22de8237f3aa1640a7b)
+- fix(CToast): add missing color prop [`1401dee`](https://github.com/coreui/coreui-vue/commit/1401dee57c1e7fea8ee0c0a4045294931d402a0e)
+- chore: dependencies udate [`b54b77f`](https://github.com/coreui/coreui-vue/commit/b54b77fc718a83bd192beb2ef5b75c728ae9c0d9)
+- fix(CToast): rtl margins for header and CButtonClose [`0d0c6c0`](https://github.com/coreui/coreui-vue/commit/0d0c6c0168d7495e26cc36f506c65855900560d5)
+
+## [3.1.6](https://github.com/coreui/coreui-vue/compare/3.1.5...3.1.6)
+
+> 11 December 2020
+
+### Changed
+
+- fix(CTooltip): tooltip shows up on title update [`6d1ba6c`](https://github.com/coreui/coreui-vue/commit/6d1ba6c4a0512466707ca07166e8525e0e650786)
+- chore: 3.1.6 version release [`85dfea5`](https://github.com/coreui/coreui-vue/commit/85dfea53e8b6dd2e2179ca1b08be2b4d290a2522)
+
+## [3.1.5](https://github.com/coreui/coreui-vue/compare/3.1.4...3.1.5)
+
+> 7 December 2020
+
+### Changed
+
+- chore: dependencies update [`dd02660`](https://github.com/coreui/coreui-vue/commit/dd02660767c8dc64bd9d50e77a70df685df3f2d3)
+- chore: project checks update [`599dc2e`](https://github.com/coreui/coreui-vue/commit/599dc2e09a012c234239b39424a77917404a356d)
+- fix(CTooltip): add missing updateTitle functionality [`ae9d901`](https://github.com/coreui/coreui-vue/commit/ae9d90113dab4253e84ee60bb729d7f9b1b0992a)
+- chore: 3.1.5 version release [`9d64c71`](https://github.com/coreui/coreui-vue/commit/9d64c71d249b43d644a7570e91d61889839787c5)
+
+## [3.1.4](https://github.com/coreui/coreui-vue/compare/3.1.3...3.1.4)
+
+> 26 October 2020
+
+### Changed
+
+- chore: dependencies update [`1054b62`](https://github.com/coreui/coreui-vue/commit/1054b62a757d13200e9d09f6e8e7795515bfecff)
+- chore: changelog fix [`f960204`](https://github.com/coreui/coreui-vue/commit/f960204203bedf2bb1505e92a24a815ad4e025f2)
+- fix: Add onKey to index.d.ts [`d5de0bf`](https://github.com/coreui/coreui-vue/commit/d5de0bf7747e9c79c47c3e7c854c751b1e9fc074)
+
+## [3.1.3](https://github.com/coreui/coreui-vue/compare/3.1.2...3.1.3)
+
+> 26 October 2020
+
+### Changed
+
+- fix: CCol and CModal [`539bc2e`](https://github.com/coreui/coreui-vue/commit/539bc2ecd96b01c1a7d62a9d1f6966fc84d504c9)
+- Update ISSUE_TEMPLATE.md [`898c9fa`](https://github.com/coreui/coreui-vue/commit/898c9fa54547237011330b87515f66b2f06a4bc6)
+- Update ISSUE_TEMPLATE.md [`93211e0`](https://github.com/coreui/coreui-vue/commit/93211e0245c70baf70b48f9f92733d080791a3af)
+- chore: 3.1.3 version release [`9c4da02`](https://github.com/coreui/coreui-vue/commit/9c4da021c48d66be632621a1ecf4fbf98fab7002)
+
+## [3.1.2](https://github.com/coreui/coreui-vue/compare/3.1.1...3.1.2)
+
+> 24 July 2020
+
+### Changed
+
+- chore: 3.1.2 version release [`3c8c082`](https://github.com/coreui/coreui-vue/commit/3c8c082f61f2daaa367c84ff6443fc0a207600d8)
+- fix: CDataTable disable auto removing  columnFilter #113 [`f2c6ebe`](https://github.com/coreui/coreui-vue/commit/f2c6ebe6fccbf9de9667351aabec76a3f04de0bd)
+
+## [3.1.1](https://github.com/coreui/coreui-vue/compare/3.1.0...3.1.1)
+
+> 8 July 2020
+
+### Changed
+
+- chore: 3.1.1 version release: update dependencies and changelog [`4fff8d2`](https://github.com/coreui/coreui-vue/commit/4fff8d27eb00382856f5a195f95da48c7ac62be3)
+- chore: update changelog to 3.1.0 [`a504c71`](https://github.com/coreui/coreui-vue/commit/a504c71c8649bd9fd2241717ce55e17faf9aa323)
+- fix: CModal: 'update:show' event - add third argument 'accept' #92 [`a91e4fd`](https://github.com/coreui/coreui-vue/commit/a91e4fdcfce3d0f88e239526f81b50699b2900f1)
+
+## [3.1.0](https://github.com/coreui/coreui-vue/compare/3.0.12...3.1.0)
+
+> 3 July 2020
+
+### Changed
+
+- chore: 3.1.0 version release: update dependencies and changelog [`b95424f`](https://github.com/coreui/coreui-vue/commit/b95424f5f401e0a6698ec1afa5b73ab787fb4f26)
+- feat: CDataTable: replace cleaner prop object with slot [`8976054`](https://github.com/coreui/coreui-vue/commit/89760547ca1a029588dbb8a8f18d05f1127f798a)
+- feat: CDataTable: add cleaner prop, update @coreui/icons [`cf58305`](https://github.com/coreui/coreui-vue/commit/cf583051863dfec9472bd2c449b4e29da6e3b355)
+- feat: CProgress: add size prop [`a056973`](https://github.com/coreui/coreui-vue/commit/a056973fbc22998b12b825d1f590f8df27ce108b)
+- fix: CDataTable: add aria-label attributes to inputs [`ede894f`](https://github.com/coreui/coreui-vue/commit/ede894f2fb695462e21ebe639c6cfebcddec1731)
+- feat: CListGroup: add accent functionality [`94256a1`](https://github.com/coreui/coreui-vue/commit/94256a16d98912f70007abc27956d0bbbb77c4b5)
+- chore: fix VSCode hints generator [`433a574`](https://github.com/coreui/coreui-vue/commit/433a574335701865a167a3f7817055d49e390140)
+- fix: CSidebarNavItem: fix icon computation [`02d5ffd`](https://github.com/coreui/coreui-vue/commit/02d5ffd2852a57af61f22afdf14ff10c31cc877a)
+- feat: CNav component: add tag prop and vertical breakpoint option [`9aa2400`](https://github.com/coreui/coreui-vue/commit/9aa2400218db0ae2d0e54f8184236ed7bce979ee)
+- feat: add CListGroupItemDivider wrapper component [`1a64352`](https://github.com/coreui/coreui-vue/commit/1a643520251c1630a001ad3c94d67acf8f37e2e6)
+- feat: CSidebarNavItem: add color prop [`3bb6c1f`](https://github.com/coreui/coreui-vue/commit/3bb6c1f366d57aadd73853619361f8f8e7df2217)
+- chore: update eslint rules and snapshots [`833d98a`](https://github.com/coreui/coreui-vue/commit/833d98a1ee004e9adb7ac121c773ea149186d20a)
+- fix: CDropdown: fix split button dropdowns positioning [`7bc7f96`](https://github.com/coreui/coreui-vue/commit/7bc7f964a5e7301891eade4cfd864af93ff90334)
+- chore: update workflows [`04efc0f`](https://github.com/coreui/coreui-vue/commit/04efc0f56e2279ab4d8254f4bc1b6184a663f57b)
+- refactor: CPagination: correct item key assignment [`2b1828c`](https://github.com/coreui/coreui-vue/commit/2b1828c05e3d39152051384e3f4289b57467d126)
+- chore: update snapshot [`5fa9531`](https://github.com/coreui/coreui-vue/commit/5fa95318937cab2a9e082103a6bbbc83cecd1b39)
+- feat: CWidgetIcon: add footer slot [`0e63428`](https://github.com/coreui/coreui-vue/commit/0e63428fccf3e21598750186b4378fd94c3e3815)
+
+## [3.0.12](https://github.com/coreui/coreui-vue/compare/3.0.11...3.0.12)
+
+> 2 June 2020
+
+### Changed
+
+- chore: 3.0.12 release: fix dependency @coreui/icons-vue [`a3c90f3`](https://github.com/coreui/coreui-vue/commit/a3c90f3f00392206cf73d8f100969d0a5f257642)
+
+## [3.0.11](https://github.com/coreui/coreui-vue/compare/3.0.10...3.0.11)
+
+> 28 May 2020
+
+### Changed
+
+- chore: 3.0.11 release: update packages [`0b4e388`](https://github.com/coreui/coreui-vue/commit/0b4e388ccc705760e4e7f01f2344055e3277e5af)
+- chore: update eslint-plugin-vue [`95d59a1`](https://github.com/coreui/coreui-vue/commit/95d59a1f224c093f2e497518ba7fdf818e7e6c68)
+- chore: downgrade eslint [`dd5544e`](https://github.com/coreui/coreui-vue/commit/dd5544e3710773d0bfe4da665b1cc899b5bfbcdf)
+- chore: lock @vue/test-utils version [`2c954b5`](https://github.com/coreui/coreui-vue/commit/2c954b51ac3636709c910d61f13882ec7f8e1362)
+- fix: CSelect: change input event to change, due to IE/edge support lack [`ef84a23`](https://github.com/coreui/coreui-vue/commit/ef84a23ca4a5f46c6854c8438d8a096505f14166)
+
+## [3.0.10](https://github.com/coreui/coreui-vue/compare/3.0.9...3.0.10)
+
+> 19 May 2020
+
+### Changed
+
+- chore: 3.0.10 release: fix typings [`98f53db`](https://github.com/coreui/coreui-vue/commit/98f53db11e268495e28cd1e0e1fac7d2fabf54af)
+
+## [3.0.9](https://github.com/coreui/coreui-vue/compare/3.0.8...3.0.9)
+
+> 18 May 2020
+
+### Changed
+
+- fix: update package-lock.json [`7062b4a`](https://github.com/coreui/coreui-vue/commit/7062b4a5eba014b812923ede70b108b297097ef9)
+- chore: 3.0.9 release: update dependencies, fix typings [`2bd63ff`](https://github.com/coreui/coreui-vue/commit/2bd63ffd32b3cfb3210b7401122645684996af87)
+- fix: CTooltip, CPopover: add legacy styles [`f3e81d5`](https://github.com/coreui/coreui-vue/commit/f3e81d5969f03417cde2505334a01935795dd900)
+- test: update [`080843f`](https://github.com/coreui/coreui-vue/commit/080843fbfb90474b2b647910771fdb748f0c37d6)
+- fix: downgrade eslint [`7acfab3`](https://github.com/coreui/coreui-vue/commit/7acfab3ad53f18d4a918d4c1cc23f1548873fd8b)
+- fix: fix hints generating script [`5bfe25c`](https://github.com/coreui/coreui-vue/commit/5bfe25c0a87544506a2a27dcfc6e6a446df62ec5)
+
+## [3.0.8](https://github.com/coreui/coreui-vue/compare/3.0.7...3.0.8)
+
+> 5 May 2020
+
+### Changed
+
+- chore: 3.0.8 release [`40a6ca9`](https://github.com/coreui/coreui-vue/commit/40a6ca90ccc429f288ea738ebd1c56e8f63c7be9)
+- fix: CSidebarNavItem: allow adding 'size' prop in 'icon' object #76 [`a1a8203`](https://github.com/coreui/coreui-vue/commit/a1a820385e8b2f190afa9c91628e9b1b0edf9fec)
+- fix: CSidebarNavDropdown: allow adding 'size' prop in 'icon' object #76 [`30ae677`](https://github.com/coreui/coreui-vue/commit/30ae6774b1983486c986593ccca2b751f1864645)
+- chore: update CSelect snapshot [`d5c600b`](https://github.com/coreui/coreui-vue/commit/d5c600b5d3f35b65ce216ac396db1a8be3fe21ee)
+- fix: CSelect: fix assigning falsy value #83 [`00574cf`](https://github.com/coreui/coreui-vue/commit/00574cf03d6008d86d96a01237dfd316fcd96c08)
+- fix: CSelect: allow restoring placeholder after reseting value [`02b0e5a`](https://github.com/coreui/coreui-vue/commit/02b0e5acf5ad4f90ee6f12949c0d695aee1b9d89)
+
+## [3.0.7](https://github.com/coreui/coreui-vue/compare/3.0.6...3.0.7)
+
+> 8 April 2020
+
+### Changed
+
+- chore: 3.0.7 release - update dependencies [`44244fd`](https://github.com/coreui/coreui-vue/commit/44244fdb65b90d3a61e64fb30791df98292d3863)
+- chore: 3.0.7 version release - update typings #80 [`58f3e45`](https://github.com/coreui/coreui-vue/commit/58f3e45f093e3284f8ff9c1a0afe26f00a6c60f3)
+
+## [3.0.6](https://github.com/coreui/coreui-vue/compare/3.0.5...3.0.6)
+
+> 7 April 2020
+
+### Changed
+
+- chore: 3.0.6 release - update dependencies [`2c6927e`](https://github.com/coreui/coreui-vue/commit/2c6927e1dbc080a3f34b855235af773b1760056a)
+- fix: CDataTable: fix header styles: [`603af02`](https://github.com/coreui/coreui-vue/commit/603af02123e9df76a3e8c1ab4740944f8ee02c89)
+- fix: CDropdownItem: fix closing dropdown when item is router link #79 [`0492be9`](https://github.com/coreui/coreui-vue/commit/0492be948091b81eb6ec34322096ff60b35bc58d)
+- feat: CDataTable, row-clicked event - add event object as argument [`89c1f8b`](https://github.com/coreui/coreui-vue/commit/89c1f8b70d3bc53507bae0a7940640bc500100f7)
+- chore: CBadge: delete doubled classes [`4c29500`](https://github.com/coreui/coreui-vue/commit/4c29500a94c15120ccc00a8ff0d8b8af7af4e6a8)
+- fix: CInputCheckbox: always render even empty label in custom mode [`f74ec0a`](https://github.com/coreui/coreui-vue/commit/f74ec0ad758e3a18666ba8f6d02146284f0e150a)
+- fix: CDataTable: 'fixed' prop class name correction [`ea4a5bd`](https://github.com/coreui/coreui-vue/commit/ea4a5bdf43e5b1df1f59edb651bc4bf39f62edcb)
+
+## [3.0.5](https://github.com/coreui/coreui-vue/compare/3.0.4...3.0.5)
+
+> 18 March 2020
+
+### Changed
+
+- chore: delete build files [`269128b`](https://github.com/coreui/coreui-vue/commit/269128bc3a34e12131aecd458dedc0976b07d451)
+- chore: 3.0.5 version release - update dependencies [`dd2971f`](https://github.com/coreui/coreui-vue/commit/dd2971f31477e5bbb5ff510c5b34d0889f4c8019)
+- feat: add CInputRadioGroup component [`af899f5`](https://github.com/coreui/coreui-vue/commit/af899f5a0f46c96aa7804f7b5711fdd59dc9d943)
+- feat: CCollapse: add possibility of different duration of show and hide [`288fcc9`](https://github.com/coreui/coreui-vue/commit/288fcc98e48ae3200f4bc8f9bc5155576573f75e)
+- feat: CDataTable: add noItemsView prop #67 [`79d6e11`](https://github.com/coreui/coreui-vue/commit/79d6e113745f9f9ce298f2ed1fe990f1a9ffe8aa)
+- test: CDataTable tests update [`4d658b2`](https://github.com/coreui/coreui-vue/commit/4d658b2bc383122c84d399c4bfa8268b95879ae7)
+- fix: CCollapse: fix blinking when animation duration is 0ms [`ed0d5fa`](https://github.com/coreui/coreui-vue/commit/ed0d5fafab2c23c6cc78ca9042a1e7e66855dc3b)
+- feat: CDataTable: add 'external' key to itemsPerPageSelect prop object [`2323eaa`](https://github.com/coreui/coreui-vue/commit/2323eaa3c523b32e40b20d9628b0e45ecb82aec8)
+- fix: CInputRadioGroup: add inline styling option [`9f8aeec`](https://github.com/coreui/coreui-vue/commit/9f8aeec4f9072711caea197377f5cc987ee71225)
+- feat: CPagination: add arg 'reduced' to the 'update:activePage' event [`c94cb09`](https://github.com/coreui/coreui-vue/commit/c94cb09462763128fc68e5d42aa10c7c66a9ae06)
+- feat: CDataTable: add thead-top slot [`f130496`](https://github.com/coreui/coreui-vue/commit/f1304966a2fb95aa0e0b7d75e85fc6beb35f1594)
+- chore: fix typings [`ce18118`](https://github.com/coreui/coreui-vue/commit/ce1811858c4c13adb6c02f115178c4449aea2667)
+
+## [3.0.4](https://github.com/coreui/coreui-vue/compare/3.0.3...3.0.4)
+
+> 9 March 2020
+
+### Changed
+
+- fix: fix package dependencies [`2cdd679`](https://github.com/coreui/coreui-vue/commit/2cdd679f00cc47eb37432c67bc53447b2a685bb2)
+- chore: update build files [`df938ef`](https://github.com/coreui/coreui-vue/commit/df938ef479b7b6cda9e121170ab7bdfb2a7cefdf)
+- chore: update project, add comment [`fd7f075`](https://github.com/coreui/coreui-vue/commit/fd7f0753fd6ea69ccf7e2b3644ce49ad3998bebd)
+
+## [3.0.3](https://github.com/coreui/coreui-vue/compare/3.0.2...3.0.3)
+
+> 9 March 2020
+
+### Changed
+
+- chore: 3.0.3 release - update dependencies and build files [`fe1a61b`](https://github.com/coreui/coreui-vue/commit/fe1a61bd948b509659d48cacef68149cd941b6fc)
+- fix: CDropdownItem: restore functional component events #73 [`311d18e`](https://github.com/coreui/coreui-vue/commit/311d18edaf2cd0ccfe17ba2ca75578b666e01dff)
+
+## [3.0.2](https://github.com/coreui/coreui-vue/compare/3.0.1...3.0.2)
+
+> 6 March 2020
+
+### Changed
+
+- chore: 3.0.2 release: update dependencies and build files [`31ffedb`](https://github.com/coreui/coreui-vue/commit/31ffedb905447eddf43ead9ad6a617c9460179d2)
+- fix: CDropdown: close dropdown on every dropdown-item-click event #71 [`ed04296`](https://github.com/coreui/coreui-vue/commit/ed042960b812244b98f167d0a066b91967f6e86e)
+- fix: CDropdown: close dropdown on every dropdown-item-click event #72 [`cffd7c4`](https://github.com/coreui/coreui-vue/commit/cffd7c454bdfabb6523eb34404a84b52f65ed8ac)
+- chore: fix typings [`67f7cef`](https://github.com/coreui/coreui-vue/commit/67f7cef03d2059dcb5e2d5713e09e56fd2d1c49b)
+- fix: do not emit update:value in case of 'multiple' attribute #64 [`73d2b3f`](https://github.com/coreui/coreui-vue/commit/73d2b3f874dad7bb4e350da997dcb9de9af5e4bc)
+- refactor: change CDropdown closing event name [`26c2f7d`](https://github.com/coreui/coreui-vue/commit/26c2f7d4c492e5861716dbc48c1e8d3b31f85aa8)
+
+## [3.0.1](https://github.com/coreui/coreui-vue/compare/3.0.0...3.0.1)
+
+> 28 February 2020
+
+### Changed
+
+- chore: 3.0.1 release -  update dependencies and build files [`b6f44c9`](https://github.com/coreui/coreui-vue/commit/b6f44c9dbb140d39cba89529962fdc399082e9c7)
+- refactor: CDropdown: optimize dropdown hiding, update tests [`b295f71`](https://github.com/coreui/coreui-vue/commit/b295f7188742240bda3d1d86afa17ff13a34414d)
+- feat: CDataTable row-clicked event modification #59 [`2a89938`](https://github.com/coreui/coreui-vue/commit/2a899387e95fffeff47291fb3aff2b14d480e945)
+- fix: always close overlaid sidebar on outside click [`1b43afa`](https://github.com/coreui/coreui-vue/commit/1b43afa0908b9e3a19f66ff85664db4c06261e62)
+- feat: add CClickaway directive [`a78fd14`](https://github.com/coreui/coreui-vue/commit/a78fd1476e0c3ee4005131527e5c0bac5b65f11a)
+- refactor: remove listners function from form-mixins [`149c6c6`](https://github.com/coreui/coreui-vue/commit/149c6c6c7a9fc79ad81a69b5e890f28aa529f6f8)
+- fix: form components - add missing events [`7eaec17`](https://github.com/coreui/coreui-vue/commit/7eaec170d95e030e4bf29c338fbe5d3f7dcb03b8)
+- feat: CDataTable: add page-change event [`9161fd6`](https://github.com/coreui/coreui-vue/commit/9161fd601930766221949c255154b454c42e47a0)
+- chore: update readme and issue template [`9779c01`](https://github.com/coreui/coreui-vue/commit/9779c01224f56b45fb5e92706debf86f08c5fa6f)
+- chore: update typings [`bdb4b64`](https://github.com/coreui/coreui-vue/commit/bdb4b643ca01b474be8a78c2e47c77c877f0cb74)
+- chore: update build worklow shield in README [`7aad5d4`](https://github.com/coreui/coreui-vue/commit/7aad5d4f18762dad5d936bbd395cc2d0973ddf78)
+- chore: merge user pull request [`31315c6`](https://github.com/coreui/coreui-vue/commit/31315c667e99e4631a1d25890a51c44d4c9e074a)
+- chore: update README [`ad9f36c`](https://github.com/coreui/coreui-vue/commit/ad9f36c5bff5f9466bf1ebc8653228d1af659eef)
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..cb8b24b4
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,176 @@
+# Contributing to CoreUI Vue
+
+Looking to contribute something? **Here's how you can help.**
+
+Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved.
+
+Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue or assessing patches and features.
+
+## Using the issue tracker
+
+The [issue tracker](https://github.com/coreui/coreui-vue/issues) is the preferred channel for [bug reports](#bug-reports), [features requests](#feature-requests) and [submitting pull requests](#pull-requests), but please respect the following restrictions:
+
+- Please **do not** use the issue tracker for personal support requests.
+
+- Please **do not** post comments consisting solely of "+1" or ":thumbsup:".
+  Use [GitHub's "reactions" feature](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments)
+  instead.
+
+- Please **do not** open issues or pull requests regarding the code in: 
+
+  - [`@coreui/vue`](https://github.com/coreui/coreui-vue)
+  - [`@coreui/coreui`](https://github.com/coreui/coreui)
+  - [`@coreui/coreui-icons-vue`](https://github.com/coreui/coreui-icons-vue)
+  - [`@coreui/coreui-vue-chartjs`](https://github.com/coreui/coreui-vue-chartjs)
+
+Open them in their respective repositories.
+
+## Bug reports
+
+A bug is a _demonstrable problem_ that is caused by the code in the repository.
+Good bug reports are extremely helpful, so thanks!
+
+Guidelines for bug reports:
+
+0. **Validate and lint your code** &mdash; to ensure your problem isn't caused by a simple error in your own code.
+
+1. **Use the GitHub issue search** &mdash; check if the issue has already been reported.
+
+2. **Check if the issue has been fixed** &mdash; try to reproduce it using the latest `master` or `dev` branch in the repository.
+
+3. **Isolate the problem** &mdash; ideally create a [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live example. [This JS Bin](http://jsbin.com/lefey/1/edit?html,output) is a helpful template.
+
+A good bug report shouldn't leave others needing to chase you up for more
+information. Please try to be as detailed as possible in your report. What is
+your environment? What steps will reproduce the issue? What browser(s) and OS
+experience the problem? Do other browsers show the bug differently? What
+would you expect to be the outcome? All these details will help people to fix
+any potential bugs.
+
+Example:
+
+> Short and descriptive example bug report title
+>
+> A summary of the issue and the browser/OS environment in which it occurs. If
+> suitable, include the steps required to reproduce the bug.
+>
+> 1. This is the first step
+> 2. This is the second step
+> 3. Further steps, etc.
+>
+> `<url>` - a link to the reduced test case
+>
+> Any other information you want to share that is relevant to the issue being
+> reported. This might include the lines of code that you have identified as
+> causing the bug, and potential solutions (and your opinions on their
+> merits).
+
+## Feature requests
+
+Feature requests are welcome. Before opening a feature request, please take a moment to find out whether your idea
+fits with the scope and aims of the project. It's up to *you* to make a strong
+case to convince the project's developers of the merits of this feature. Please
+provide as much detail and context as possible.
+
+## Pull requests
+
+Good pull requests—patches, improvements, new features—are a fantastic
+help. They should remain focused in scope and avoid containing unrelated
+commits.
+
+**Please ask first** before embarking on any significant pull request (e.g.
+implementing features, refactoring code, porting to a different language),
+otherwise you risk spending a lot of time working on something that the
+project's developers might not want to merge into the project.
+
+Adhering to the following process is the best way to get your work
+included in the project:
+
+1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork,
+   and configure the remotes:
+
+   ```bash
+   # Clone your fork of the repo into the current directory
+   git clone https://github.com/<your-username>/coreui-vue.git
+   # Navigate to the newly cloned directory
+   cd coreui-vue
+   # Assign the original repo to a remote called "upstream"
+   git remote add upstream https://github.com/coreui/coreui-vue.git
+   ```
+
+2. If you cloned a while ago, get the latest changes from upstream:
+
+   ```bash
+   git checkout dev
+   git pull upstream dev
+   ```
+
+3. Create a new topic branch (off the development branch "dev") to
+   contain your feature, change, or fix:
+
+   ```bash
+   git checkout -b <topic-branch-name>
+   ```
+
+4. Commit your changes in logical chunks. Please adhere to these [git commit
+   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
+   or your code is unlikely to be merged into the main project. Use Git's
+   [interactive rebase](https://help.github.com/articles/interactive-rebase)
+   feature to tidy up your commits before making them public.
+
+5. Locally merge (or rebase) the upstream development branch into your topic branch:
+
+   ```bash
+   git pull [--rebase] upstream dev
+   ```
+
+6. Push your topic branch up to your fork:
+
+   ```bash
+   git push origin <topic-branch-name>
+   ```
+
+7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) with a clear title and description into the `dev` branch.
+
+**IMPORTANT**: By submitting a patch, you agree to allow the project owners to license your work under the terms of the [MIT License](LICENSE).
+
+### Semantic Git commit messages
+
+Inspired by Sparkbox's awesome article on [semantic commit messages](http://seesparkbox.com/foundry/semantic_commit_messages). Please use following commit message format.
+
+- chore (updating npm tasks etc; no production code change) -> ```git test -m 'chore: commit-message-here'```
+- docs (changes to documentation) -> ```git commit -m 'docs: commit-message-here'```
+- feat (new feature) -> ```git commit -m 'feat: commit-message-here'```
+- fix (bug fix) -> ```git commit -m 'fix: commit-message-here'```
+- refactor (refactoring production code) -> ```git commit -m 'refactor: commit-message-here'```
+- style (formatting, missing semi colons, etc; no code change) -> ```git commit -m 'style: commit-message-here'```
+- test (adding missing tests, refactoring tests; no production code change) -> ```git test -m 'refactor: commit-message-here'```
+
+## Code guidelines
+
+### HTML
+
+[Adhere to the Code Guide.](http://codeguide.co/#html)
+
+- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags).
+- 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://`.
+- Use [WAI-ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) attributes in documentation examples to promote accessibility.
+
+### CSS
+
+[Adhere to the Code Guide.](http://codeguide.co/#css)
+
+- When feasible, default color palettes should comply with [WCAG color contrast guidelines](http://www.w3.org/TR/WCAG20/#visual-audio-contrast).
+- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](http://a11yproject.com/posts/never-remove-css-outlines) for more details.
+
+### JS
+
+- No semicolons (in client-side JS)
+- 2 spaces (no tabs)
+- strict mode
+- "Attractive"
+- Don't use [jQuery event alias convenience methods](https://github.com/jquery/jquery/blob/master/src/event/alias.js) (such as `$().focus()`). Instead, use [`$().trigger(eventType, ...)`](http://api.jquery.com/trigger/) or [`$().on(eventType, ...)`](http://api.jquery.com/on/), depending on whether you're firing an event or listening for an event. (For example, `$().trigger('focus')` or `$().on('focus', function (event) { /* handle focus event */ })`) We do this to be compatible with custom builds of jQuery where the event aliases module has been excluded.
+
+## License
+
+By contributing your code, you agree to license your contribution under the [MIT License](LICENSE).
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000..98d5cee7
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,19 @@
+# Before opening an issue
+
+- [Search for duplicate or closed issues](https://github.com/coreui/coreui-vue/issues?q=is%3Aissue+is%3Aclosed)
+- Read the [contributing guidelines](https://github.com/coreui/coreui-vue/blob/master/CONTRIBUTING.md)
+
+When asking general "how to" questions:
+
+- Please do not open an issue here
+
+When reporting a bug, include:
+
+- Operating system and version (Windows, Mac OS X, Android, iOS, Win10 Mobile)
+- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
+- Reduced test cases and potential fixes using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
+
+When suggesting a feature, include:
+
+- As much detail as possible for what we should add and why it's important to CoreUI Vue library
+- Relevant links to prior art, screenshots, or live demos whenever possible
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index fbb053e0..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2025 creativeLabs Łukasz Holeczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 00000000..352eefb2
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,7 @@
+Copyright (c) 2020 Łukasz Holeczek
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index ee29f9de..14d787a3 100644
--- a/README.md
+++ b/README.md
@@ -1,233 +1,113 @@
-<p align="center">
-  <a href="https://coreui.io/">
-    <img
-      src="https://coreui.io/images/brand/coreui-signet.svg"
-      alt="CoreUI logo"
-      width="200"
-    />
-  </a>
-</p>
-
-<h3 align="center">CoreUI for Vue.js</h3>
-
-<p align="center">
-  Vue.js Components Library built on top of Bootstrap 5 and TypeScript.
-  <br>
-  <a href="https://coreui.io/vue/docs/getting-started/introduction"><strong>Explore CoreUI for Vue.js docs »</strong></a>
-  <br>
-  <br>
-  <a href="https://github.com/coreui/coreui-vue/issues/new?template=bug_report.md">Report bug</a>
-  ·
-  <a href="https://github.com/coreui/coreui-vue/issues/new?template=feature_request.md">Request feature</a>
-  ·
-  <a href="https://coreui.io/blog/">Blog</a>
-</p>
-
-
-## Table of contents
-
-- [Quick start](#quick-start)
-- [Components](#components)
-- [Status](#status)
-- [Bugs and feature requests](#bugs-and-feature-requests)
-- [Documentation](#documentation)
-- [Frameworks](#frameworks)
-- [Templates](#templates)
-- [Contributing](#contributing)
-- [Community](#community)
-- [Versioning](#versioning)
-- [Creators](#creators)
-- [Support CoreUI Development](#support-coreui-development)
-- [Copyright and license](#copyright-and-license)
-
-## Quick start
-
-### Instalation
-
-Several quick start options are available:
-
-- [Download the latest release](https://github.com/coreui/coreui-vue/archive/v5.5.0.zip)
-- Clone the repo: `git clone https://github.com/coreui/coreui-vue.git`
-- Install with [npm](https://www.npmjs.com/): `npm install @coreui/vue`
-- Install with [yarn](https://yarnpkg.com/): `yarn add @coreui/vue`
-
-Read the [Getting started page](https://coreui.io/vue/docs/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
-
-### Stylesheets
-
-Vue components are styled using `@coreui/coreui` CSS library, but you can use them also with bootstrap CSS library. That is possible because `@coreui/coreui` library is compatible with bootstrap, it just extends its functionalities. The only exception are custom CoreUI components, which don't exist in the Bootstrap ecosystem.
-
-#### CoreUI CSS files
-
-##### Installation
-
-```bash
-yarn add @coreui/coreui
-```
+# CoreUI Vue components library
 
-or
+[![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=CoreUI%20-%20Free%20Vue%20Admin%20Template%20&url=http://coreui.io/vue/&hashtags=bootstrap,admin,template,dashboard,panel,free,angular,react,vue)
+[![NPM][npm-coreui-vue-badge-latest]][npm-coreui-vue]
+[![Downloads](https://img.shields.io/npm/dm/@coreui/vue.svg?style=flat-square)][coreui]
+[![Build](https://img.shields.io/github/workflow/status/coreui/coreui-vue/Project%20check?style=flat-square)][coreui]
+[![License](https://img.shields.io/npm/l/@coreui/vue?style=flat-square)][coreui]
+[![Coverage](https://img.shields.io/badge/test%20coverage%203.0.12%20version-100%25-yellowgreen)][coreui]
+![Daily project check](https://github.com/coreui/coreui-vue/workflows/Daily%20project%20check/badge.svg)
 
-```bash
-npm install @coreui/coreui --save
-```
+[npm-coreui-vue]: https://www.npmjs.com/package/@coreui/vue
+[npm-coreui-vue-badge-latest]: https://img.shields.io/npm/v/@coreui/vue/latest?style=flat-square&color=brightgreen  
+[coreui]: https://coreui.io/vue
 
-##### Basic usage
+> A @coreui/vue `v3` components library project
 
-```js
-import '@coreui/coreui/dist/css/coreui.min.css'
-```
+## Over 90 bootstrap based Vue.js components and directives!
 
-#### Bootstrap CSS files
+### For library guide please visit our [Documentation site »](https://coreui.io/vue/docs)
 
-##### Installation
+Check out demo of components usage: [CoreUI Vue Admin Template »](https://coreui.io/vue/demo)
 
-```bash
-yarn add bootstrap
-```
+![Template](https://coreui.io/images/github/vue-free-template-3.gif)
 
-or
+## Installation
 
-```bash
-npm install bootstrap
-```
-
-##### Basic usage
-
-```js
-import "bootstrap/dist/css/bootstrap.min.css";
+Before installation you need to install [node and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) on your machine.
+```shell
+npm install @coreui/vue
 ```
 
-## Components
-
-- [Vue Accordion](https://coreui.io/vue/docs/components/accordion.html)
-- [Vue Alert](https://coreui.io/vue/docs/components/alert.html)
-- [Vue Autocomplete](https://coreui.io/vue/docs/forms/autocomplete.html) **PRO**
-- [Vue Avatar](https://coreui.io/vue/docs/components/avatar.html)
-- [Vue Badge](https://coreui.io/vue/docs/components/badge.html)
-- [Vue Breadcrumb](https://coreui.io/vue/docs/components/breadcrumb.html)
-- [Vue Button](https://coreui.io/vue/docs/components/button.html)
-- [Vue Button Group](https://coreui.io/vue/docs/components/button-group.html)
-- [Vue Callout](https://coreui.io/vue/docs/components/callout.html)
-- [Vue Card](https://coreui.io/vue/docs/components/card.html)
-- [Vue Carousel](https://coreui.io/vue/docs/components/carousel.html)
-- [Vue Checkbox](https://coreui.io/vue/docs/forms/checkbox.html)
-- [Vue Close Button](https://coreui.io/vue/docs/components/close-button.html)
-- [Vue Collapse](https://coreui.io/vue/docs/components/collapse.html)
-- [Vue Date Picker](https://coreui.io/vue/docs/forms/date-picker.html) **PRO**
-- [Vue Date Range Picker](https://coreui.io/vue/docs/forms/date-range-picker.html) **PRO**
-- [Vue Dropdown](https://coreui.io/vue/docs/components/dropdown.html)
-- [Vue Floating Labels](https://coreui.io/vue/docs/forms/floating-labels.html)
-- [Vue Footer](https://coreui.io/vue/docs/components/footer.html)
-- [Vue Header](https://coreui.io/vue/docs/components/header.html)
-- [Vue Image](https://coreui.io/vue/docs/components/image.html)
-- [Vue Input](https://coreui.io/vue/docs/forms/input.html)
-- [Vue Input Group](https://coreui.io/vue/docs/forms/input-group.html)
-- [Vue List Group](https://coreui.io/vue/docs/components/list-group.html)
-- [Vue Loading Button](https://coreui.io/vue/docs/components/loading-button.html) **PRO**
-- [Vue Modal](https://coreui.io/vue/docs/components/modal.html)
-- [Vue Multi Select](https://coreui.io/vue/docs/forms/multi-select.html) **PRO**
-- [Vue Navs & Tabs](https://coreui.io/vue/docs/components/navs-tabs.html)
-- [Vue Navbar](https://coreui.io/vue/docs/components/navbar.html)
-- [Vue Offcanvas](https://coreui.io/vue/docs/components/offcanvas.html)
-- [Vue Pagination](https://coreui.io/vue/docs/components/pagination.html)
-- [Vue Placeholder](https://coreui.io/vue/docs/components/placeholder.html)
-- [Vue Popover](https://coreui.io/vue/docs/components/popover.html)
-- [Vue Progress](https://coreui.io/vue/docs/components/progress.html)
-- [Vue Radio](https://coreui.io/vue/docs/forms/radio.html)
-- [Vue Range](https://coreui.io/vue/docs/forms/range.html)
-- [Vue Range Slider](https://coreui.io/vue/docs/forms/range-slider.html) **PRO**
-- [Vue Rating](https://coreui.io/vue/docs/forms/rating.html)
-- [Vue Select](https://coreui.io/vue/docs/forms/select.html)
-- [Vue Sidebar](https://coreui.io/vue/docs/components/sidebar.html)
-- [Vue Smart Pagination](https://coreui.io/vue/docs/components/smart-pagination.html) **PRO**
-- [Vue Smart Table](https://coreui.io/vue/docs/components/smart-table.html) **PRO**
-- [Vue Spinner](https://coreui.io/vue/docs/components/spinner.html)
-- [Vue Stepper](https://coreui.io/vue/docs/forms/stepper.html) **PRO**
-- [Vue Switch](https://coreui.io/vue/docs/forms/switch.html)
-- [Vue Table](https://coreui.io/vue/docs/components/table.html)
-- [Vue Textarea](https://coreui.io/vue/docs/forms/textarea.html)
-- [Vue Time Picker](https://coreui.io/vue/docs/forms/time-picker.html) **PRO**
-- [Vue Toast](https://coreui.io/vue/docs/components/toast.html)
-- [Vue Tooltip](https://coreui.io/vue/docs/components/tooltip.html)
-
-## Status
-
-[![npm version](https://img.shields.io/npm/v/@coreui/vue)](https://www.npmjs.com/package/@coreui/vue)
-
-## Bugs and feature requests
-
-Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/coreui/coreui-vue/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/coreui/coreui-vue/issues/new).
-
-## Documentation
-
-The documentation for the CoreUI & CoreUI PRO is hosted at our website [CoreUI for Vue](https://coreui.io/vue/docs/getting-started/introduction)
-
-### Running documentation locally
-
-1. Run `yarn install` or `npm install` to install the Node.js dependencies.
-2. Run `yarn bootstrap` or `npm run bootstrap` to link local packages together and install remaining package dependencies.
-3. From the root directory, run `yarn docs:dev` or `npm run docs:dev` (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets.
-4. Open `http://localhost:8000/` in your browser, and voilà.
+### Styling
 
-## Frameworks
+Components are styled using @coreui/coreui CSS library, but you can use them also with bootstrap CSS library. That is possible because @coreui/coreui library is compatible with bootstrap, it just extends its functionalities. The only exception is custom CoreUI components, which don't exist in the Bootstrap ecosystem (template components, callout, switch).
 
-CoreUI supports most popular frameworks.
+Styles have to be imported separately! Import [CoreUI](https://github.com/coreui/coreui) CSS library (recommended), or [Bootstrap](https://getbootstrap.com/) library
 
-- [CoreUI for Angular](https://github.com/coreui/coreui-angular)
-- [CoreUI for Bootstrap (Vanilla JS)](https://github.com/coreui/coreui)
-- [CoreUI for React](https://github.com/coreui/coreui-react)
-- [CoreUI for Vue](https://github.com/coreui/coreui-vue)
-
-## Templates
-
-Fully featured, out-of-the-box, templates for your application based on CoreUI.
-
-- [Angular Admin Template](https://coreui.io/angular)
-- [Bootstrap Admin Template](https://coreui.io/)
-- [React Admin Template](https://coreui.io/react)
-- [Vue Admin Template](https://coreui.io/vue)
-
-## Contributing
-
-Please read through our [contributing guidelines](https://github.com/coreui/coreui-vue/blob/main/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
-
-Editor preferences are available in the [editor config](https://github.com/coreui/coreui-vue/blob/main/.editorconfig) for easy use in common text editors. Read more and download plugins at <https://editorconfig.org/>.
-
-## Community
-
-Stay up to date on the development of CoreUI and reach out to the community with these helpful resources.
+Installation:
+```shell
+npm install @coreui/coreui@3.4
+```
 
-- Read and subscribe to [The Official CoreUI Blog](https://coreui.io/blog/).
+Basic usage:
+```scss
+@import "~@coreui/coreui/scss/coreui";
+```
 
-You can also follow [@core_ui on Twitter](https://twitter.com/core_ui).
+### Registering components
 
-## Versioning
+```js
+// Installing whole package
+import CoreuiVue from '@coreui/vue';
+Vue.use(CoreuiVue);
+
+// Registering a single component
+import { CSwitch, CButton } from '@coreui/vue';
+
+// globally
+Vue.component('CButton', CButton)
+
+export default {
+  ...
+  // locally
+  components: {
+    CSwitch
+  },
+  ...
+}
+```
 
-For transparency into our release cycle and in striving to maintain backward compatibility, CoreUI is maintained under [the Semantic Versioning guidelines](http://semver.org/).
+### Registering directives
 
-See [the Releases section of our project](https://github.com/coreui/coreui-vue/releases) for changelogs for each release version.
+```js
+// Registering single directives
+import { CEmitRootEvent, CTooltip } from '@coreui/vue';
+
+// globally
+Vue.directive('c-emit-root-event', CEmitRootEvent)
+
+export default {
+  ...
+  // locally
+  directives: {
+    'c-tooltip': CTooltip
+  },
+  ...
+}
+```
 
-## Creators
+### Optimization
 
-**Łukasz Holeczek**
+Components are imported from CommonJS module by default, if you want to use only specific components you can import them from source to enable treeshaking.
 
-* <https://twitter.com/lukaszholeczek>
-* <https://github.com/mrholek>
+```js
+// Import components this way to allow tree shaking
+import { CDataTable } from '@coreui/vue/src';
+```
 
-**Andrzej Kopański**
+### Code autocompletion
 
-* <https://github.com/xidedix>
+If you are using [VS Code](https://code.visualstudio.com/) editor with Vetur plugin installed, then the editor would display hints for our library (component names and prop names).
 
-**CoreUI Team**
+### Changelog
 
-* <https://twitter.com/core_ui>
-* <https://github.com/coreui>
-* <https://github.com/orgs/coreui/people>
+See the GitHub [release history](https://github.com/coreui/coreui-vue/releases).
 
-## Support CoreUI Development
+### Contributing
 
-CoreUI is an MIT-licensed open source project and is completely free to use. However, the amount of effort needed to maintain and develop new features for the project is not sustainable without proper financial backing. You can support development by buying the [CoreUI PRO](https://coreui.io/pricing/?framework=vue&src=github-coreui-vue) or by becoming a sponsor via [Open Collective](https://opencollective.com/coreui/).
+See [CONTRIBUTING.md](https://github.com/coreui/coreui-vue/blob/master/CONTRIBUTING.md).
 
-## Copyright and license
+### Credits
 
-Copyright 2025 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-vue/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).
+Some design ideas and solutions in this library are inspired by [Bootstrap-Vue library](https://bootstrap-vue.js.org/)
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 00000000..bfefb06f
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    ['@babel/preset-env']
+  ]
+}
diff --git a/build/buildVscodeHints.js b/build/buildVscodeHints.js
new file mode 100644
index 00000000..eee54a00
--- /dev/null
+++ b/build/buildVscodeHints.js
@@ -0,0 +1,118 @@
+const fs = require('fs-extra')
+const types = fs.readFileSync('src/components/index.d.ts', 'utf-8')
+const classes = getTypesClasses(types)
+
+function getTypesClasses (types) {
+  let classes = {}
+  const rawClasses = types.replace(/(\n|\r)/ig, '')
+                          .split('declare')
+                          .filter(rawClass => rawClass.includes('class'))
+
+  rawClasses.forEach(rawClass => {
+    const name = rawClass.match(/(?<=class\s+).*?(?=\s+)/gs)[0]
+
+    const propsRaw = rawClass
+      .substring(rawClass.indexOf('{') + 1, rawClass.lastIndexOf('}'))
+      .replace(/{(()([^}]))+}/ig, 'custom')
+
+
+    let props = propsRaw.match(/([a-zA-Z?]+:).*?(?=[a-zA-Z?]+:|$)/g)
+
+    if (props) {
+      props = props.map(prop => prop.trim().replace('?', ''))
+    }        
+    
+    classes[name] = {
+      isExported: rawClass.includes('export'),
+      extend: rawClass.match(/(?<=extends\s+).*?(?=\s+{)/gs)[0],
+      props,
+    }
+  })
+  Object.entries(classes).forEach(([key, value]) => {
+    if (value.extend !== 'Vue') {
+      const props = classes[key].props || []
+      const extend = classes[value.extend].props || []
+      classes[key].props = [...props, ...extend]
+    }
+  })
+  return classes
+}
+
+const components = {} 
+Object.entries(classes).forEach(([key,value]) => {
+  if (value.isExported) {
+    components[key] = value
+  }
+}) 
+
+generateVeturFiles(components)
+
+function generateVeturFiles (content) {
+  const dir = 'dist/vetur'
+  if (!fs.existsSync(dir)) {
+    fs.mkdirSync(dir)
+  }
+
+  const attributes = generateAttributes(content)
+  fs.writeFile(
+    `dist/vetur/coreui-attributes.json`,
+    attributes,
+    () => ''
+  )
+
+  const tags = generateTags(content)
+  fs.writeFile(
+    `dist/vetur/coreui-tags.json`,
+    tags,
+    () => ''
+  )
+}
+
+function generateTags (content) {
+  let tags = {}
+  Object.entries(content).forEach(([name, component]) => {
+    let attributes = []
+    if (component.props) {
+      attributes = component.props.map(prop => toKebabCase(prop.split(':')[0]))
+    }
+    tags[name] = {
+      attributes,
+      description: ''
+    }
+    tags[toKebabCase(name)] = {
+      attributes,
+      description: ''
+    }
+  })
+  return JSON.stringify(tags, null, 2)
+}
+
+function generateAttributes (content) {
+  let attributes = {}
+  Object.entries(content).forEach(([name, component]) => {
+    if (component.props) {
+      component.props.forEach(prop => {
+        const propName = toKebabCase(prop.split(':')[0])
+        const key = name + '/' + propName
+        const kebabKey = toKebabCase(name) + '/' + propName
+        const type = prop.split(':')[1].trim()
+        const description = 'For API documentation please visit https://coreui.io/vue/docs'
+
+        attributes[kebabKey] = {
+          description,
+          type,
+        }
+        attributes[key] = {
+          description,
+          type,
+        }
+      })
+    }
+  })
+  return JSON.stringify(attributes, null, 2)
+}
+
+function toKebabCase (str) {
+  const camelCase = str.charAt(0).toLowerCase() + str.slice(1)
+  return camelCase.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
+}
\ No newline at end of file
diff --git a/changelog-template.hbs b/changelog-template.hbs
new file mode 100644
index 00000000..1f66e38c
--- /dev/null
+++ b/changelog-template.hbs
@@ -0,0 +1,34 @@
+# Changelog
+
+{{#each releases}}
+{{#if href}}
+## {{#unless major}}{{/unless}}[{{title}}]({{href}})
+{{else}}
+## {{title}}
+{{/if}}
+
+{{#if tag}}
+> {{niceDate}}
+{{/if}}
+{{#if summary}}
+
+{{summary}}
+{{/if}}
+{{#if commits}}
+
+### Changed
+
+{{#each commits}}
+- {{#if breaking}}**Breaking change:** {{/if}}{{subject}}{{#if href}} [`{{shorthash}}`]({{href}}){{/if}}
+{{/each}}
+
+{{/if}}
+{{#if fixes}}
+
+### Fixed
+
+{{#each fixes}}
+- {{commit.subject}}{{#each fixes}}{{#if href}} [`#{{id}}`]({{href}}){{/if}}{{/each}}
+{{/each}}
+{{/if}}
+{{/each}}
\ No newline at end of file
diff --git a/eslint.config.mjs b/eslint.config.mjs
deleted file mode 100644
index 15164bf5..00000000
--- a/eslint.config.mjs
+++ /dev/null
@@ -1,76 +0,0 @@
-import eslint from '@eslint/js'
-import eslintPluginUnicorn from 'eslint-plugin-unicorn'
-import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
-import eslintPluginVue from 'eslint-plugin-vue'
-import globals from 'globals'
-import typescriptEslint from 'typescript-eslint'
-
-export default typescriptEslint.config(
-  { ignores: ['**/*.d.ts', '**/coverage', '**/dist', '**/docs'] },
-  {
-    extends: [
-      eslint.configs.recommended,
-      ...typescriptEslint.configs.recommended,
-      ...eslintPluginVue.configs['flat/recommended'],
-      eslintPluginUnicorn.configs['flat/recommended'],
-    ],
-    files: ['packages/**/src/**/*.{js,ts,tsx}'],
-    languageOptions: {
-      ecmaVersion: 'latest',
-      sourceType: 'module',
-      globals: globals.browser,
-      parserOptions: {
-        parser: typescriptEslint.parser,
-      },
-    },
-    rules: {
-      'no-console': 'off',
-      'no-debugger': 'off',
-      'unicorn/filename-case': 'off',
-      'unicorn/no-array-for-each': 'off',
-      'unicorn/no-null': 'off',
-      'unicorn/prefer-dom-node-append': 'off',
-      'unicorn/prefer-export-from': 'off',
-      'unicorn/prefer-query-selector': 'off',
-      'unicorn/prevent-abbreviations': 'off',
-      'vue/require-default-prop': 'off',
-    },
-  },
-  {
-    files: ['**/*.mjs'],
-    languageOptions: {
-      globals: {
-        ...Object.fromEntries(Object.entries(globals.browser).map(([key]) => [key, 'off'])),
-        ...globals.node,
-      },
-
-      ecmaVersion: 'latest',
-      sourceType: 'module',
-    },
-  },
-  {
-    files: ['**/__tests__/*.{j,t}s?(x)', '**/tests/unit/**/*.spec.{j,t}s?(x)'],
-    languageOptions: {
-      globals: {
-        ...globals.jest,
-      },
-    },
-  },
-  {
-    files: ['packages/docs/build/**'],
-    languageOptions: {
-      globals: {
-        ...Object.fromEntries(Object.entries(globals.browser).map(([key]) => [key, 'off'])),
-        ...globals.node,
-      },
-
-      ecmaVersion: 5,
-      sourceType: 'commonjs',
-    },
-    rules: {
-      'no-console': 'off',
-      strict: 'error',
-    },
-  },
-  eslintPluginPrettierRecommended,
-)
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 00000000..b0404db2
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,22 @@
+const path = require('path');
+
+module.exports = {
+  rootDir: path.resolve(__dirname, './'),
+  moduleFileExtensions: ['js', 'json', 'vue'],
+  transform: {
+    '.*\\.js$': '<rootDir>/node_modules/babel-jest',
+    '.*\\.vue$': '<rootDir>/node_modules/vue-jest'
+  },
+  transformIgnorePatterns: [],
+  snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'],
+  setupFiles: ['<rootDir>/jest.setup'],
+  coverageDirectory: '<rootDir>/coverage',
+  collectCoverageFrom: [
+    'src/**/*.{js,vue}',
+    '!src/index.umd.js',
+    '!**/node_modules/**'
+  ],
+  moduleNameMapper: {
+    '\\.(css|less)$': 'identity-obj-proxy'
+  }
+};
diff --git a/jest.setup.js b/jest.setup.js
new file mode 100644
index 00000000..a9bec302
--- /dev/null
+++ b/jest.setup.js
@@ -0,0 +1,3 @@
+import Vue from 'vue';
+
+Vue.config.productionTip = false;
diff --git a/lerna.json b/lerna.json
deleted file mode 100644
index 8b1ec4d7..00000000
--- a/lerna.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "npmClient": "yarn",
-  "packages": ["packages/*"],
-  "version": "5.5.0",
-  "$schema": "node_modules/lerna/schemas/lerna-schema.json"
-}
diff --git a/package.json b/package.json
index 7b5343e7..bd090f79 100644
--- a/package.json
+++ b/package.json
@@ -1,37 +1,141 @@
 {
-  "private": true,
-  "workspaces": [
-    "packages/*"
+  "name": "@coreui/vue",
+  "description": "CoreUI Vue Bootstrap 4 layout components",
+  "version": "3.2.12",
+  "license": "MIT",
+  "main": "dist/coreui-vue.common.js",
+  "types": "src/index.d.ts",
+  "files": [
+    "src",
+    "dist"
   ],
+  "sideEffects": [
+    "./src/components/toast/CToast.vue",
+    "./src/components/scrollbar/CScrollbar.vue",
+    "./src/components/alert/CAlert.vue",
+    "./src/components/table/CDataTable.vue",
+    "./src/components/tabs/CTab.vue",
+    "./src/components/toast/CCarousel.vue",
+    "./src/directives/old-popover.css",
+    "./src/directives/old-tooltip.css"
+  ],
+  "homepage": "https://coreui.io",
+  "author": {
+    "name": "CoreUI",
+    "url": "https://coreui.io",
+    "github": "https://github.com/coreui",
+    "twitter": "https://twitter.com/core_ui"
+  },
+  "contributors": [
+    {
+      "name": "CoreUI Team",
+      "url": "https://github.com/orgs/coreui/people"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/coreui/coreui-vue.git"
+  },
+  "bugs": {
+    "url": "https://github.com/coreui/coreui-vue/issues"
+  },
+  "keywords": [
+    "coreui",
+    "vue",
+    "vue-component",
+    "vue-library",
+    "bootstrap",
+    "framework",
+    "responsive",
+    "layout",
+    "component",
+    "components"
+  ],
+  "engines": {
+    "node": ">= 12",
+    "npm": ">= 6"
+  },
   "scripts": {
-    "charts:build": "lerna run --scope \"@coreui/vue-chartjs\" build --stream",
-    "charts:test": "lerna run --scope \"@coreui/vue-chartjs\" test --stream",
-    "charts:test:update": "lerna run --scope \"@coreui/vue-chartjs\" test:update --stream",
-    "docs:api": "lerna run --scope \"@coreui/vue-docs\" api --stream",
-    "docs:dev": "lerna run --scope \"@coreui/vue-docs\" dev --stream",
-    "docs:build": "lerna run --scope \"@coreui/vue-docs\" build --stream",
-    "docs:dist": "lerna run --scope \"@coreui/vue-docs\" dist --stream",
-    "icons:build": "lerna run --scope \"@coreui/icons-vue\" build --stream",
-    "icons:test": "lerna run --scope \"@coreui/icons-vue\" test --stream",
-    "icons:test:update": "lerna run --scope \"@coreui/icons-vue\" test:update --stream",
-    "lib:build": "lerna run --scope \"@coreui/vue\" build --stream",
-    "lib:test": "lerna run --scope \"@coreui/vue\" test --stream",
-    "lib:test:update": "lerna run --scope \"@coreui/vue\" test:update --stream",
-    "lint": "eslint",
-    "test": "npm-run-all charts:test icons:test lib:test",
-    "test:update": "npm-run-all charts:test:update icons:test:update lib:test:update"
+    "serve": "vue-cli-service serve",
+    "build": "npm-run-all build:default",
+    "build:default": "vue-cli-service build --target lib --name coreui-vue ./src/index.js",
+    "build:es": "rollup -c --environment TARGET:esm",
+    "lint": "vue-cli-service lint",
+    "test": "vue-cli-service test:unit",
+    "test:coverage": "vue-cli-service test:unit --coverage",
+    "clearCache": "jest --clearCache",
+    "release": "npm-run-all clearCache lint build test:coverage generate-hints",
+    "generate-hints": "node build/buildVscodeHints.js",
+    "changelog": "auto-changelog --template changelog-template.hbs --commit-limit false --package --backfill-limit 0 --starting-version 3.0.1"
+  },
+  "dependencies": {
+    "@coreui/icons": "^2.0.1",
+    "@coreui/icons-vue": "^1.3.5",
+    "@coreui/utils": "^1.3.1",
+    "@popperjs/core": "^2.9.2",
+    "lodash.clonedeep": "~4.5.0",
+    "perfect-scrollbar": "~1.5.1",
+    "tooltip.js": "~1.3.3",
+    "vue": "^2.6.12",
+    "vue-functional-data-merge": "~3.1.0"
   },
   "devDependencies": {
-    "@vue/vue3-jest": "29.2.6",
-    "eslint": "^9.28.0",
-    "eslint-config-prettier": "^10.1.5",
-    "eslint-plugin-prettier": "^5.4.1",
-    "eslint-plugin-unicorn": "^59.0.1",
-    "eslint-plugin-vue": "^10.1.0",
-    "globals": "^16.2.0",
-    "lerna": "^8.2.2",
-    "npm-run-all": "^4.1.5",
-    "prettier": "^3.5.3",
-    "typescript-eslint": "^8.33.1"
+    "@vue/cli-plugin-babel": "^4.5.13",
+    "@vue/cli-plugin-eslint": "^4.5.13",
+    "@vue/cli-plugin-unit-jest": "^4.5.13",
+    "@vue/cli-service": "^4.5.13",
+    "@vue/test-utils": "1.0.0-beta.29",
+    "auto-changelog": "^2.2.1",
+    "babel-eslint": "~10.1.0",
+    "babel-jest": "~26.6.3",
+    "core-js": "^3.12.1",
+    "eslint": "^6.8.0",
+    "eslint-plugin-vue": "~6.2.2",
+    "identity-obj-proxy": "^3.0.0",
+    "node-sass-magic-importer": "^5.3.2",
+    "npm-run-all": "~4.1.5",
+    "postcss": "^8.3.0",
+    "rollup": "^2.48.0",
+    "rollup-plugin-babel": "~4.4.0",
+    "rollup-plugin-commonjs": "~10.1.0",
+    "rollup-plugin-filesize": "^9.1.1",
+    "rollup-plugin-json": "~4.0.0",
+    "rollup-plugin-license": "^2.3.0",
+    "rollup-plugin-node-resolve": "~5.2.0",
+    "rollup-plugin-postcss": "^4.0.0",
+    "rollup-plugin-replace": "~2.2.0",
+    "rollup-plugin-vue": "~5.1.9",
+    "sass": "^1.43.4",
+    "sass-loader": "^10.2.0",
+    "vue-router": "^3.5.1",
+    "vue-template-compiler": "^2.6.12"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 9"
+  ],
+  "vetur": {
+    "tags": "dist/vetur/coreui-tags.json",
+    "attributes": "dist/vetur/coreui-attributes.json"
   }
 }
diff --git a/packages/coreui-icons-vue b/packages/coreui-icons-vue
deleted file mode 160000
index 009583d5..00000000
--- a/packages/coreui-icons-vue
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 009583d58f7ea9a2a7bc7a2e62861eba48c0d911
diff --git a/packages/coreui-vue-chartjs b/packages/coreui-vue-chartjs
deleted file mode 160000
index f3b8364d..00000000
--- a/packages/coreui-vue-chartjs
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f3b8364d04dcd94c273ead1f740e1d792a5fb041
diff --git a/packages/coreui-vue/.browserslistrc b/packages/coreui-vue/.browserslistrc
deleted file mode 100644
index bd3ad98e..00000000
--- a/packages/coreui-vue/.browserslistrc
+++ /dev/null
@@ -1,3 +0,0 @@
-> 1%
-last 2 versions
-not ie <= 8
\ No newline at end of file
diff --git a/packages/coreui-vue/LICENSE b/packages/coreui-vue/LICENSE
deleted file mode 100644
index f19fc729..00000000
--- a/packages/coreui-vue/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021 creativeLabs Łukasz Holeczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/packages/coreui-vue/README.md b/packages/coreui-vue/README.md
deleted file mode 100644
index a1cfd697..00000000
--- a/packages/coreui-vue/README.md
+++ /dev/null
@@ -1,266 +0,0 @@
-<p align="center">
-  <a href="https://coreui.io/">
-    <img
-      src="https://coreui.io/images/brand/coreui-signet.svg"
-      alt="CoreUI logo"
-      width="200"
-    />
-  </a>
-</p>
-
-<h3 align="center">CoreUI for Vue.js</h3>
-
-<p align="center">
-  Vue.js Components Library built on top of Bootstrap 5 and TypeScript.
-  <br>
-  <a href="https://coreui.io/vue/docs/getting-started/introduction"><strong>Explore CoreUI for Vue.js docs »</strong></a>
-  <br>
-  <br>
-  <a href="https://github.com/coreui/coreui-vue/issues/new?template=bug_report.md">Report bug</a>
-  ·
-  <a href="https://github.com/coreui/coreui-vue/issues/new?template=feature_request.md">Request feature</a>
-  ·
-  <a href="https://coreui.io/blog/">Blog</a>
-</p>
-
-
-## Table of contents
-
-- [Quick start](#quick-start)
-- [Components](#components)
-- [Status](#status)
-- [Bugs and feature requests](#bugs-and-feature-requests)
-- [Documentation](#documentation)
-- [Frameworks](#frameworks)
-- [Templates](#templates)
-- [Contributing](#contributing)
-- [Community](#community)
-- [Versioning](#versioning)
-- [Creators](#creators)
-- [Support CoreUI Development](#support-coreui-development)
-- [Copyright and license](#copyright-and-license)
-
-## Quick start
-
-### Instalation
-
-Several quick start options are available:
-
-- [Download the latest release](https://github.com/coreui/coreui-vue/archive/v5.5.0.zip)
-- Clone the repo: `git clone https://github.com/coreui/coreui-vue.git`
-- Install with [npm](https://www.npmjs.com/): `npm install @coreui/vue`
-- Install with [yarn](https://yarnpkg.com/): `yarn add @coreui/vue`
-
-Read the [Getting started page](https://coreui.io/vue/docs/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
-
-### Stylesheets
-
-Vue components are styled using `@coreui/coreui` CSS library, but you can use them also with bootstrap CSS library. That is possible because `@coreui/coreui` library is compatible with bootstrap, it just extends its functionalities. The only exception are custom CoreUI components, which don't exist in the Bootstrap ecosystem.
-
-#### CoreUI CSS files
-
-##### Installation
-
-```bash
-yarn add @coreui/coreui
-```
-
-or
-
-```bash
-npm install @coreui/coreui --save
-```
-
-##### Basic usage
-
-```js
-import '@coreui/coreui/dist/css/coreui.min.css'
-```
-
-#### Bootstrap CSS files
-
-##### Installation
-
-```bash
-yarn add bootstrap
-```
-
-or
-
-```bash
-npm install bootstrap
-```
-
-##### Basic usage
-
-```js
-import "bootstrap/dist/css/bootstrap.min.css";
-```
-
-## Components
-
-- [Vue Accordion](https://coreui.io/vue/docs/components/accordion.html)
-- [Vue Alert](https://coreui.io/vue/docs/components/alert.html)
-- [Vue Avatar](https://coreui.io/vue/docs/components/avatar.html)
-- [Vue Badge](https://coreui.io/vue/docs/components/badge.html)
-- [Vue Breadcrumb](https://coreui.io/vue/docs/components/breadcrumb.html)
-- [Vue Button](https://coreui.io/vue/docs/components/button.html)
-- [Vue Button Group](https://coreui.io/vue/docs/components/button-group.html)
-- [Vue Callout](https://coreui.io/vue/docs/components/callout.html)
-- [Vue Card](https://coreui.io/vue/docs/components/card.html)
-- [Vue Carousel](https://coreui.io/vue/docs/components/carousel.html)
-- [Vue Checkbox](https://coreui.io/vue/docs/forms/checkbox.html)
-- [Vue Close Button](https://coreui.io/vue/docs/components/close-button.html)
-- [Vue Collapse](https://coreui.io/vue/docs/components/collapse.html)
-- [Vue Date Picker](https://coreui.io/vue/docs/forms/date-picker.html) **PRO**
-- [Vue Date Range Picker](https://coreui.io/vue/docs/forms/date-range-picker.html) **PRO**
-- [Vue Dropdown](https://coreui.io/vue/docs/components/dropdown.html)
-- [Vue Floating Labels](https://coreui.io/vue/docs/forms/floating-labels.html)
-- [Vue Footer](https://coreui.io/vue/docs/components/footer.html)
-- [Vue Header](https://coreui.io/vue/docs/components/header.html)
-- [Vue Image](https://coreui.io/vue/docs/components/image.html)
-- [Vue Input](https://coreui.io/vue/docs/forms/input.html)
-- [Vue Input Group](https://coreui.io/vue/docs/forms/input-group.html)
-- [Vue List Group](https://coreui.io/vue/docs/components/list-group.html)
-- [Vue Loading Button](https://coreui.io/vue/docs/components/loading-button.html) **PRO**
-- [Vue Modal](https://coreui.io/vue/docs/components/modal.html)
-- [Vue Multi Select](https://coreui.io/vue/docs/forms/multi-select.html) **PRO**
-- [Vue Navs & Tabs](https://coreui.io/vue/docs/components/navs-tabs.html)
-- [Vue Navbar](https://coreui.io/vue/docs/components/navbar.html)
-- [Vue Offcanvas](https://coreui.io/vue/docs/components/offcanvas.html)
-- [Vue Pagination](https://coreui.io/vue/docs/components/pagination.html)
-- [Vue Placeholder](https://coreui.io/vue/docs/components/placeholder.html)
-- [Vue Popover](https://coreui.io/vue/docs/components/popover.html)
-- [Vue Progress](https://coreui.io/vue/docs/components/progress.html)
-- [Vue Radio](https://coreui.io/vue/docs/forms/radio.html)
-- [Vue Range](https://coreui.io/vue/docs/forms/range.html)
-- [Vue Rating](https://coreui.io/vue/docs/forms/rating.html)
-- [Vue Select](https://coreui.io/vue/docs/forms/select.html)
-- [Vue Sidebar](https://coreui.io/vue/docs/components/sidebar.html)
-- [Vue Smart Pagination](https://coreui.io/vue/docs/components/smart-pagination.html) **PRO**
-- [Vue Smart Table](https://coreui.io/vue/docs/components/smart-table.html) **PRO**
-- [Vue Spinner](https://coreui.io/vue/docs/components/spinner.html)
-- [Vue Switch](https://coreui.io/vue/docs/forms/switch.html)
-- [Vue Table](https://coreui.io/vue/docs/components/table.html)
-- [Vue Textarea](https://coreui.io/vue/docs/forms/textarea.html)
-- [Vue Time Picker](https://coreui.io/vue/docs/forms/time-picker.html) **PRO**
-- [Vue Toast](https://coreui.io/vue/docs/components/toast.html)
-- [Vue Tooltip](https://coreui.io/vue/docs/components/tooltip.html)
-
-## Status
-
-[![Build Status](https://github.com/coreui/coreui-vue/workflows/JS%20Tests/badge.svg?branch=main)](https://github.com/coreui/coreui-vue/actions?query=workflow%3AJS+Tests+branch%3Amain)
-[![npm version](https://img.shields.io/npm/v/@coreui/vue)](https://www.npmjs.com/package/@coreui/vue)
-[![peerDependencies Status](https://img.shields.io/david/peer/coreui/coreui)](https://david-dm.org/coreui/coreui?type=peer)
-[![devDependency Status](https://img.shields.io/david/dev/coreui/coreui)](https://david-dm.org/coreui/coreui?type=dev)
-[![Coverage Status](https://img.shields.io/coveralls/github/coreui/coreui-vue/v4)](https://coveralls.io/github/coreui/coreui-vue?branch=v4)
-
-## Bugs and feature requests
-
-Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/coreui/coreui-vue/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/coreui/coreui-vue/issues/new).
-
-## Documentation
-
-The documentation for the CoreUI & CoreUI PRO is hosted at our website [CoreUI for Vue](https://coreui.io/vue/docs/getting-started/introduction)
-
-### Running documentation locally
-
-1. Run `yarn install` or `npm install` to install the Node.js dependencies.
-2. Run `yarn bootstrap` or `npm run bootstrap` to link local packages together and install remaining package dependencies.
-3. From the root directory, run `yarn docs:dev` or `npm run docs:dev` (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets.
-4. Open `http://localhost:8000/` in your browser, and voilà.
-
-## Frameworks
-
-CoreUI supports most popular frameworks.
-
-- [CoreUI for Angular](https://github.com/coreui/coreui-angular)
-- [CoreUI for Bootstrap (Vanilla JS)](https://github.com/coreui/coreui)
-- [CoreUI for React](https://github.com/coreui/coreui-react)
-- [CoreUI for Vue](https://github.com/coreui/coreui-vue)
-
-## Templates
-
-Fully featured, out-of-the-box, templates for your application based on CoreUI.
-
-- [Angular Admin Template](https://coreui.io/angular)
-- [Bootstrap Admin Template](https://coreui.io/)
-- [React Admin Template](https://coreui.io/react)
-- [Vue Admin Template](https://coreui.io/vue)
-
-## Contributing
-
-Please read through our [contributing guidelines](https://github.com/coreui/coreui-vue/blob/main/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
-
-Editor preferences are available in the [editor config](https://github.com/coreui/coreui-vue/blob/main/.editorconfig) for easy use in common text editors. Read more and download plugins at <https://editorconfig.org/>.
-
-## Community
-
-Stay up to date on the development of CoreUI and reach out to the community with these helpful resources.
-
-- Read and subscribe to [The Official CoreUI Blog](https://coreui.io/blog/).
-
-You can also follow [@core_ui on Twitter](https://twitter.com/core_ui).
-
-## Versioning
-
-For transparency into our release cycle and in striving to maintain backward compatibility, CoreUI is maintained under [the Semantic Versioning guidelines](http://semver.org/).
-
-See [the Releases section of our project](https://github.com/coreui/coreui-vue/releases) for changelogs for each release version.
-
-## Creators
-
-**Łukasz Holeczek**
-
-- <https://twitter.com/lukaszholeczek>
-- <https://github.com/mrholek>
-
-**Andrzej Kopański**
-
-- <https://github.com/xidedix>
-
-**The CoreUI Team**
-
-- <https://github.com/orgs/coreui/people>
-
-## Support CoreUI Development
-
-CoreUI is an MIT-licensed open source project and is completely free to use. However, the amount of effort needed to maintain and develop new features for the project is not sustainable without proper financial backing. You can support development by buying the [CoreUI PRO](https://coreui.io/pricing/) or by becoming a sponsor via [Open Collective](https://opencollective.com/coreui/).
-
-<!--- StartOpenCollectiveBackers -->
-
-### Platinum Sponsors
-
-Support this project by [becoming a Platinum Sponsor](https://opencollective.com/coreui/contribute/platinum-sponsor-40959/). A large company logo will be added here with a link to your website.
-
-<a href="https://opencollective.com/coreui/contribute/platinum-sponsor-40959/checkout"><img src="https://opencollective.com/coreui/tiers/platinum-sponsor/0/avatar.svg?avatarHeight=100"></a>
-
-### Gold Sponsors
-
-Support this project by [becoming a Gold Sponsor](https://opencollective.com/coreui/contribute/gold-sponsor-40960/). A big company logo will be added here with a link to your website.
-
-<a href="https://opencollective.com/coreui/contribute/gold-sponsor-40960/checkout"><img src="https://opencollective.com/coreui/tiers/gold-sponsor/0/avatar.svg?avatarHeight=100"></a> 
-
-### Silver Sponsors
-
-Support this project by [becoming a Silver Sponsor](https://opencollective.com/coreui/contribute/silver-sponsor-40967/). A medium company logo will be added here with a link to your website.
-
-<a href="https://opencollective.com/coreui/contribute/silver-sponsor-40967/checkout"><img src="https://opencollective.com/coreui/tiers/gold-sponsor/0/avatar.svg?avatarHeight=100"></a>
-
-### Bronze Sponsors
-
-Support this project by [becoming a Bronze Sponsor](https://opencollective.com/coreui/contribute/bronze-sponsor-40966/). The company avatar will show up here with a link to your OpenCollective Profile.
-
-<a href="https://opencollective.com/coreui/contribute/bronze-sponsor-40966/checkout"><img src="https://opencollective.com/coreui/tiers/bronze-sponsor/0/avatar.svg?avatarHeight=100"></a> 
-
-### Backers
-
-Thanks to all the backers and sponsors! Support this project by [becoming a backer](https://opencollective.com/coreui/contribute/backer-40965/).
-
-<a href="https://opencollective.com/coreui/contribute/backer-40965/checkout" target="_blank" rel="noopener"><img src="https://opencollective.com/coreui/backers.svg?width=890"></a>
-
-<!--- EndOpenCollectiveBackers -->
-
-## Copyright and license
-
-Copyright 2022 creativeLabs Łukasz Holeczek. Code released under the [MIT License](https://github.com/coreui/coreui-vue/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).
diff --git a/packages/coreui-vue/jest.config.js b/packages/coreui-vue/jest.config.js
deleted file mode 100644
index 8367c2b3..00000000
--- a/packages/coreui-vue/jest.config.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright (c) 2013-present, creativeLabs Lukasz Holeczek.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict'
-
-module.exports = {
-  moduleFileExtensions: ['tsx', 'js', 'ts', 'json', 'vue'],
-  preset: 'ts-jest',
-  testEnvironment: 'jsdom',
-  testEnvironmentOptions: {
-    customExportConditions: ['node', 'node-addons'],
-  },
-  testPathIgnorePatterns: ['dist/'],
-  transform: {
-    '.*\\.(ts)$': 'ts-jest',
-    '.*\\.(vue)$': '@vue/vue3-jest',
-  },
-}
diff --git a/packages/coreui-vue/package.json b/packages/coreui-vue/package.json
deleted file mode 100644
index 39b08b3a..00000000
--- a/packages/coreui-vue/package.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "name": "@coreui/vue",
-  "version": "5.5.0",
-  "description": "UI Components Library for Vue.js",
-  "keywords": [
-    "vue",
-    "vue-component",
-    "vue component",
-    "vue bootstrap",
-    "bootstrap vue",
-    "ui library",
-    "ui components",
-    "component library",
-    "components"
-  ],
-  "homepage": "https://coreui.io/vue/",
-  "bugs": {
-    "url": "https://github.com/coreui/coreui-vue/issues"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/coreui/coreui-vue.git"
-  },
-  "license": "MIT",
-  "author": "The CoreUI Team (https://github.com/orgs/coreui/people)",
-  "main": "dist/cjs/index.js",
-  "module": "dist/esm/index.js",
-  "jsnext:main": "dist/esm/index.js",
-  "types": "dist/esm/index.d.ts",
-  "files": [
-    "dist/",
-    "src/"
-  ],
-  "scripts": {
-    "build": "npm-run-all clean build-*",
-    "build-cjs": "rollup --environment ESM:false --config",
-    "build-esm": "rollup --environment ESM:true --config",
-    "clean": "cross-env-shell \"rm -rf dist\"",
-    "test": "jest --coverage",
-    "test:clear": "jest --clearCache",
-    "test:update": "jest --coverage --updateSnapshot"
-  },
-  "dependencies": {
-    "@coreui/coreui": "^5.4.0",
-    "@popperjs/core": "^2.11.8"
-  },
-  "devDependencies": {
-    "@rollup/plugin-commonjs": "^28.0.3",
-    "@rollup/plugin-node-resolve": "^16.0.1",
-    "@rollup/plugin-typescript": "^12.1.2",
-    "@types/jest": "^29.5.14",
-    "@vue/test-utils": "^2.4.6",
-    "@vue/vue3-jest": "29.2.6",
-    "cross-env": "^7.0.3",
-    "jest": "^29.7.0",
-    "jest-environment-jsdom": "^29.7.0",
-    "rollup": "^4.41.1",
-    "rollup-plugin-vue": "^6.0.0",
-    "ts-jest": "^29.3.4",
-    "typescript": "^5.8.3",
-    "vue": "^3.5.16",
-    "vue-types": "^6.0.0"
-  },
-  "peerDependencies": {
-    "vue": "^3.5.0"
-  }
-}
diff --git a/packages/coreui-vue/rollup.config.mjs b/packages/coreui-vue/rollup.config.mjs
deleted file mode 100644
index c47d4ac0..00000000
--- a/packages/coreui-vue/rollup.config.mjs
+++ /dev/null
@@ -1,52 +0,0 @@
-import commonjs from '@rollup/plugin-commonjs'
-import typescript from '@rollup/plugin-typescript'
-import resolve from '@rollup/plugin-node-resolve'
-import vue from 'rollup-plugin-vue'
-import { readFileSync } from 'node:fs'
-import { dirname } from 'node:path'
-
-const pkg = JSON.parse(readFileSync(new URL('package.json', import.meta.url)))
-
-const DIR_CJS = dirname(pkg.main)
-const DIR_ESM = dirname(pkg.module)
-const ESM = process.env.ESM === 'true'
-
-const plugins = [
-  resolve({
-    dedupe: ['vue'],
-    extensions: ['.ts', '.json', '.vue'],
-  }),
-  typescript({
-    exclude: ['**/__tests__/**'],
-    tsconfig: './tsconfig.json',
-    compilerOptions: {
-      declarationDir: ESM ? DIR_ESM : DIR_CJS,
-      outDir: ESM ? DIR_ESM : DIR_CJS,
-    },
-  }),
-  commonjs({
-    include: ['../../node_modules/**'],
-  }),
-  ESM ? vue({ template: { optimizeSSR: true } }) : vue(),
-]
-
-const external = ['@popperjs/core', 'vue']
-
-const rollupConfig = {
-  input: 'src/index.ts',
-  output: {
-    dir: ESM ? DIR_ESM : DIR_CJS,
-    format: ESM ? 'esm' : 'cjs',
-    exports: 'named',
-    preserveModules: true,
-    preserveModulesRoot: 'src',
-    sourcemap: true,
-    sourcemapPathTransform: (relativeSourcePath) => {
-      return relativeSourcePath.replace('../../node_modules/', '../').replace('../src/', 'src/')
-    },
-  },
-  external,
-  plugins,
-}
-
-export default rollupConfig
diff --git a/packages/coreui-vue/src/components/accordion/CAccordion.ts b/packages/coreui-vue/src/components/accordion/CAccordion.ts
deleted file mode 100644
index 639b5af2..00000000
--- a/packages/coreui-vue/src/components/accordion/CAccordion.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { defineComponent, h, provide, ref, watch } from 'vue'
-
-const CAccordion = defineComponent({
-  name: 'CAccordion',
-  props: {
-    /**
-     * The active item key.
-     */
-    activeItemKey: [Number, String],
-    /**
-     * Make accordion items stay open when another item is opened
-     */
-    alwaysOpen: Boolean,
-    /**
-     * Removes the default background-color, some borders, and some rounded corners to render accordions edge-to-edge with their parent container.
-     */
-    flush: Boolean,
-  },
-  setup(props, { slots }) {
-    const activeItemKey = ref(props.activeItemKey)
-    const setActiveItemKey = (key: string | number) => {
-      activeItemKey.value = key
-    }
-
-    watch(
-      () => props.activeItemKey,
-      (value) => (activeItemKey.value = value),
-    )
-
-    provide('activeItemKey', activeItemKey)
-    provide('alwaysOpen', props.alwaysOpen)
-    provide('setActiveItemKey', setActiveItemKey)
-
-    return () =>
-      h(
-        'div',
-        { class: ['accordion', { ['accordion-flush']: props.flush }] },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CAccordion }
diff --git a/packages/coreui-vue/src/components/accordion/CAccordionBody.ts b/packages/coreui-vue/src/components/accordion/CAccordionBody.ts
deleted file mode 100644
index c8907021..00000000
--- a/packages/coreui-vue/src/components/accordion/CAccordionBody.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { defineComponent, h, inject, Ref } from 'vue'
-import { CCollapse } from '../collapse/CCollapse'
-
-const CAccordionBody = defineComponent({
-  name: 'CAccordionBody',
-  setup(_, { slots }) {
-    const id = inject('id')
-    const visible = inject('visible') as Ref<boolean>
-    return () =>
-      h(
-        CCollapse,
-        { class: 'accordion-collapse', id, visible: visible.value },
-        {
-          default: () => h('div', { class: ['accordion-body'] }, slots.default && slots.default()),
-        },
-      )
-  },
-})
-
-export { CAccordionBody }
diff --git a/packages/coreui-vue/src/components/accordion/CAccordionButton.ts b/packages/coreui-vue/src/components/accordion/CAccordionButton.ts
deleted file mode 100644
index f9820b4a..00000000
--- a/packages/coreui-vue/src/components/accordion/CAccordionButton.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { defineComponent, h, inject, Ref } from 'vue'
-
-const CAccordionButton = defineComponent({
-  name: 'CAccordionButton',
-  setup(_, { slots }) {
-    const id = inject('id') as string
-    const toggleVisibility = inject('toggleVisibility') as () => void
-    const visible = inject('visible') as Ref<boolean>
-
-    return () =>
-      h(
-        'button',
-        {
-          type: 'button',
-          'aria-control': id,
-          'aria-expanded': visible.value,
-          class: ['accordion-button', { ['collapsed']: !visible.value }],
-          onClick: () => toggleVisibility(),
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CAccordionButton }
diff --git a/packages/coreui-vue/src/components/accordion/CAccordionHeader.ts b/packages/coreui-vue/src/components/accordion/CAccordionHeader.ts
deleted file mode 100644
index a74a2821..00000000
--- a/packages/coreui-vue/src/components/accordion/CAccordionHeader.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CAccordionButton } from './CAccordionButton'
-
-const CAccordionHeader = defineComponent({
-  name: 'CAccordionHeader',
-  setup(_, { slots }) {
-    return () =>
-      h(
-        'div',
-        { class: ['accordion-header'] },
-        h(
-          CAccordionButton,
-          {},
-          {
-            default: () => slots.default && slots.default(),
-          },
-        ),
-      )
-  },
-})
-
-export { CAccordionHeader }
diff --git a/packages/coreui-vue/src/components/accordion/CAccordionItem.ts b/packages/coreui-vue/src/components/accordion/CAccordionItem.ts
deleted file mode 100644
index f2ebe594..00000000
--- a/packages/coreui-vue/src/components/accordion/CAccordionItem.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { defineComponent, h, inject, provide, ref, watch, Ref, useId } from 'vue'
-
-const CAccordionItem = defineComponent({
-  name: 'CAccordionItem',
-  props: {
-    /**
-     * The id global attribute defines an identifier (ID) that must be unique in the whole document.
-     */
-    id: String,
-    /**
-     * The item key.
-     */
-    itemKey: [Number, String],
-  },
-  setup(props, { slots }) {
-    const activeItemKey = inject('activeItemKey') as Ref<number | string>
-    const alwaysOpen = inject('alwaysOpen') as boolean
-    const setActiveItemKey = inject('setActiveItemKey') as (key: number | string) => void
-
-    const id = props.id ?? useId()
-    const itemKey = ref(props.itemKey ?? id)
-    const visible = ref(Boolean(activeItemKey.value === itemKey.value))
-
-    watch(activeItemKey, () => (visible.value = Boolean(activeItemKey.value === itemKey.value)))
-
-    const toggleVisibility = () => {
-      visible.value = !visible.value
-      if (!alwaysOpen && visible) {
-        setActiveItemKey(itemKey.value)
-      }
-    }
-
-    provide('id', id)
-    provide('visible', visible)
-    provide('toggleVisibility', toggleVisibility)
-
-    return () => h('div', { class: ['accordion-item'] }, slots.default && slots.default())
-  },
-})
-
-export { CAccordionItem }
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/CAccordion.spec.ts b/packages/coreui-vue/src/components/accordion/__tests__/CAccordion.spec.ts
deleted file mode 100644
index f4a15e0d..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/CAccordion.spec.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAccordion as Component } from '../../../index'
-
-const ComponentName = 'CAccordion'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    flush: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('accordion')).toBe(true)
-    expect(defaultWrapper.classes('accordion-flush')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionBody.spec.ts b/packages/coreui-vue/src/components/accordion/__tests__/CAccordionBody.spec.ts
deleted file mode 100644
index 09b94266..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionBody.spec.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAccordionBody as Component } from '../../../index'
-
-const ComponentName = 'CAccordionBody'
-
-const defaultWrapper = mount(Component, {
-  global: {
-    provide: {
-      visible: true,
-    },
-  },
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('.accordion-body').classes('accordion-body')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionButton.spec.ts b/packages/coreui-vue/src/components/accordion/__tests__/CAccordionButton.spec.ts
deleted file mode 100644
index bbaad1a7..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionButton.spec.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAccordionButton as Component } from '../../../index'
-
-const ComponentName = 'CAccordionButton'
-
-const toggleVisibility = (v: boolean) => {
-  return v
-}
-
-const defaultWrapper = mount(Component, {
-  global: {
-    provide: {
-      toggleVisibility: toggleVisibility,
-      visible: true,
-    },
-  },
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('accordion-button')).toBe(true)
-    expect(defaultWrapper.classes('collapsed')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionHeader.spec.ts b/packages/coreui-vue/src/components/accordion/__tests__/CAccordionHeader.spec.ts
deleted file mode 100644
index 4bbf217d..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionHeader.spec.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAccordionHeader as Component } from '../../../index'
-
-const ComponentName = 'CAccordionHeader'
-
-const defaultWrapper = mount(Component, {
-  global: {
-    provide: {
-      visible: true,
-    },
-  },
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('accordion-header')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionItem.spec.ts b/packages/coreui-vue/src/components/accordion/__tests__/CAccordionItem.spec.ts
deleted file mode 100644
index aab28ac8..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/CAccordionItem.spec.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAccordionItem as Component } from '../../../index'
-
-const ComponentName = 'CAccordionItem'
-
-const defaultWrapper = mount(Component, {
-  global: {
-    provide: {
-      activeItemKey: 1,
-    },
-  },
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('accordion-item')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordion.spec.ts.snap b/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordion.spec.ts.snap
deleted file mode 100644
index 3bd49f3b..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordion.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAccordion component renders correctly 1`] = `"<div class="accordion accordion-flush">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionBody.spec.ts.snap b/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionBody.spec.ts.snap
deleted file mode 100644
index 30734b2b..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionBody.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAccordionBody component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="false" class="accordion-collapse">
-  <div class="collapse">
-    <div class="accordion-body">Default slot</div>
-  </div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap b/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap
deleted file mode 100644
index fb38caae..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAccordionButton component renders correctly 1`] = `"<button type="button" aria-expanded="true" class="accordion-button collapsed">Default slot</button>"`;
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap b/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap
deleted file mode 100644
index 01863eed..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAccordionHeader component renders correctly 1`] = `"<div class="accordion-header"><button type="button" aria-expanded="true" class="accordion-button collapsed">Default slot</button></div>"`;
diff --git a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionItem.spec.ts.snap b/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionItem.spec.ts.snap
deleted file mode 100644
index cead44ef..00000000
--- a/packages/coreui-vue/src/components/accordion/__tests__/__snapshots__/CAccordionItem.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAccordionItem component renders correctly 1`] = `"<div class="accordion-item">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/accordion/index.ts b/packages/coreui-vue/src/components/accordion/index.ts
deleted file mode 100644
index 0d3d51dd..00000000
--- a/packages/coreui-vue/src/components/accordion/index.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { App } from 'vue'
-import { CAccordion } from './CAccordion'
-import { CAccordionBody } from './CAccordionBody'
-import { CAccordionButton } from './CAccordionButton'
-import { CAccordionHeader } from './CAccordionHeader'
-import { CAccordionItem } from './CAccordionItem'
-
-const CAccordionPlugin = {
-  install: (app: App): void => {
-    app.component(CAccordion.name as string, CAccordion)
-    app.component(CAccordionBody.name as string, CAccordionBody)
-    app.component(CAccordionButton.name as string, CAccordionButton)
-    app.component(CAccordionHeader.name as string, CAccordionHeader)
-    app.component(CAccordionItem.name as string, CAccordionItem)
-  },
-}
-
-export {
-  CAccordionPlugin,
-  CAccordion,
-  CAccordionBody,
-  CAccordionButton,
-  CAccordionHeader,
-  CAccordionItem,
-}
diff --git a/packages/coreui-vue/src/components/alert/CAlert.ts b/packages/coreui-vue/src/components/alert/CAlert.ts
deleted file mode 100644
index 117c4ee2..00000000
--- a/packages/coreui-vue/src/components/alert/CAlert.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import { defineComponent, h, ref, Transition, watch } from 'vue'
-
-import { CCloseButton } from '../close-button'
-
-import { Color } from '../../props'
-
-export const CAlert = defineComponent({
-  name: 'CAlert',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Optionally add a close button to alert and allow it to self dismisss.
-     */
-    dismissible: Boolean,
-    /**
-     * Set the alert variant to a solid.
-     *
-     * @values 'solid'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return value === 'solid'
-      },
-    },
-    /**
-     * Toggle the visibility of alert component.
-     */
-    visible: {
-      type: Boolean,
-      default: true,
-    },
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be closed.
-     */
-    'close',
-  ],
-  setup(props, { slots, emit }) {
-    const visible = ref(props.visible)
-
-    watch(
-      () => props.visible,
-      () => {
-        visible.value = props.visible
-      },
-    )
-
-    const handleDismiss = () => {
-      visible.value = false
-      emit('close')
-    }
-
-    return () =>
-      h(
-        Transition,
-        {
-          enterFromClass: '',
-          enterActiveClass: 'fade',
-          enterToClass: 'fade show',
-          leaveActiveClass: 'fade',
-        },
-        {
-          default: () =>
-            visible.value &&
-            h(
-              'div',
-              {
-                class: [
-                  'alert',
-                  props.variant === 'solid'
-                    ? `bg-${props.color} text-white border-0`
-                    : `alert-${props.color}`,
-                  {
-                    [`alert-${props.color}`]: props.color,
-                    'alert-dismissible': props.dismissible,
-                  },
-                ],
-              },
-              [
-                slots.default && slots.default(),
-                props.dismissible &&
-                  h(CCloseButton, {
-                    onClick: () => {
-                      handleDismiss()
-                    },
-                  }),
-              ],
-            ),
-        },
-      )
-  },
-})
diff --git a/packages/coreui-vue/src/components/alert/CAlertHeading.ts b/packages/coreui-vue/src/components/alert/CAlertHeading.ts
deleted file mode 100644
index 94ed187c..00000000
--- a/packages/coreui-vue/src/components/alert/CAlertHeading.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-export const CAlertHeading = defineComponent({
-  name: 'CAlertHeading',
-  props: {
-    /**
-     * 	Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'h4',
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: 'alert-heading',
-        },
-        slots,
-      )
-  },
-})
diff --git a/packages/coreui-vue/src/components/alert/CAlertLink.ts b/packages/coreui-vue/src/components/alert/CAlertLink.ts
deleted file mode 100644
index 4866a888..00000000
--- a/packages/coreui-vue/src/components/alert/CAlertLink.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-export const CAlertLink = defineComponent({
-  name: 'CAlertLink',
-  setup(_, { slots }) {
-    return () =>
-      h(
-        'a',
-        {
-          class: 'alert-link',
-        },
-        slots,
-      )
-  },
-})
diff --git a/packages/coreui-vue/src/components/alert/__tests__/CAlert.spec.ts b/packages/coreui-vue/src/components/alert/__tests__/CAlert.spec.ts
deleted file mode 100644
index 572cd284..00000000
--- a/packages/coreui-vue/src/components/alert/__tests__/CAlert.spec.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { shallowMount } from '@vue/test-utils'
-import { CAlert as Component } from '../../'
-
-const ComponentName = 'CAlert'
-const wrapper = shallowMount(Component)
-const customWrapper = shallowMount(Component, {
-  props: {
-    color: 'success',
-  },
-  attrs: {
-    class: 'bazinga',
-  },
-  slots: {
-    default: 'Hello World!',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(wrapper.element).toMatchSnapshot()
-  })
-  it('renders correctly with slot', () => {
-    expect(customWrapper.element).toMatchSnapshot()
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('has a prope class names', () => {
-    expect(customWrapper.find('div').classes('alert')).toBe(true)
-    expect(customWrapper.find('div').classes('alert-success')).toBe(true)
-  })
-  it('default slot contains text', () => {
-    expect(customWrapper.text()).toBe('Hello World!')
-  })
-})
diff --git a/packages/coreui-vue/src/components/alert/__tests__/CAlertHeading.spec.ts b/packages/coreui-vue/src/components/alert/__tests__/CAlertHeading.spec.ts
deleted file mode 100644
index 73448f41..00000000
--- a/packages/coreui-vue/src/components/alert/__tests__/CAlertHeading.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAlertHeading as Component } from '../../../index'
-
-const ComponentName = 'CAlertHeading'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h2',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('alert-heading')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('alert-heading')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/alert/__tests__/CAlertLink.spec.ts b/packages/coreui-vue/src/components/alert/__tests__/CAlertLink.spec.ts
deleted file mode 100644
index 161ff262..00000000
--- a/packages/coreui-vue/src/components/alert/__tests__/CAlertLink.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAlertLink as Component } from '../../../index'
-
-const ComponentName = 'CAlertLink'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('alert-link')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlert.spec.ts.snap b/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlert.spec.ts.snap
deleted file mode 100644
index cbb36d96..00000000
--- a/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlert.spec.ts.snap
+++ /dev/null
@@ -1,42 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAlert component renders correctly 1`] = `
-<transition-stub
-  appear="false"
-  css="true"
-  enteractiveclass="fade"
-  enterfromclass=""
-  entertoclass="fade show"
-  leaveactiveclass="fade"
-  persisted="false"
->
-  <div
-    class="alert alert-undefined"
-  >
-    <!---->
-    <!---->
-  </div>
-</transition-stub>
-`;
-
-exports[`Loads and display CAlert component renders correctly with slot 1`] = `
-<transition-stub
-  appear="false"
-  class="bazinga"
-  css="true"
-  enteractiveclass="fade"
-  enterfromclass=""
-  entertoclass="fade show"
-  leaveactiveclass="fade"
-  persisted="false"
->
-  <div
-    class="alert alert-success alert-success"
-  >
-    
-    Hello World!
-    
-    <!---->
-  </div>
-</transition-stub>
-`;
diff --git a/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlertHeading.spec.ts.snap b/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlertHeading.spec.ts.snap
deleted file mode 100644
index c24927f7..00000000
--- a/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlertHeading.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CAlertHeading component renders correctly 1`] = `"<h2 class="alert-heading">Default slot</h2>"`;
-
-exports[`Loads and display CAlertHeading component renders correctly 1`] = `"<h4 class="alert-heading">Default slot</h4>"`;
diff --git a/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlertLink.spec.ts.snap b/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlertLink.spec.ts.snap
deleted file mode 100644
index 02173479..00000000
--- a/packages/coreui-vue/src/components/alert/__tests__/__snapshots__/CAlertLink.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAlertLink component renders correctly 1`] = `"<a class="alert-link">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/alert/index.ts b/packages/coreui-vue/src/components/alert/index.ts
deleted file mode 100644
index d3fadac4..00000000
--- a/packages/coreui-vue/src/components/alert/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { App } from 'vue'
-import { CAlert } from './CAlert'
-import { CAlertHeading } from './CAlertHeading'
-import { CAlertLink } from './CAlertLink'
-
-const CAlertPlugin = {
-  install: (app: App): void => {
-    app.component(CAlert.name as string, CAlert)
-    app.component(CAlertHeading.name as string, CAlertHeading)
-    app.component(CAlertLink.name as string, CAlertLink)
-  },
-}
-
-export { CAlertPlugin, CAlert, CAlertHeading, CAlertLink }
diff --git a/packages/coreui-vue/src/components/avatar/CAvatar.ts b/packages/coreui-vue/src/components/avatar/CAvatar.ts
deleted file mode 100644
index d35ee265..00000000
--- a/packages/coreui-vue/src/components/avatar/CAvatar.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color, Shape, TextColor } from '../../props'
-
-const CAvatar = defineComponent({
-  name: 'CAvatar',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Select the shape of the component.
-     *
-     * @values 'rounded', 'rounded-top', 'rounded-end', 'rounded-bottom', 'rounded-start', 'rounded-circle', 'rounded-pill', 'rounded-0', 'rounded-1', 'rounded-2', 'rounded-3'
-     */
-    shape: Shape,
-    /**
-     * Size the component small, large, or extra large.
-     *
-     * @values 'sm', 'md', 'lg', 'xl'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'md', 'lg', 'xl'].includes(value)
-      },
-    },
-    /**
-     * The src attribute for the img element.
-     */
-    src: String,
-    /**
-     * Sets the color context of the status indicator to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    status: {
-      type: String,
-      validator: (value: string) => {
-        return [
-          'primary',
-          'secondary',
-          'success',
-          'danger',
-          'warning',
-          'info',
-          'dark',
-          'light',
-        ].includes(value)
-      },
-    },
-    /**
-     * Sets the text color of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', 'primary-emphasis', 'secondary-emphasis', 'success-emphasis', 'danger-emphasis', 'warning-emphasis', 'info-emphasis', 'light-emphasis', 'body', 'body-emphasis', 'body-secondary', 'body-tertiary', 'black', 'black-50', 'white', 'white-50'
-     */
-    textColor: TextColor,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'avatar',
-            {
-              [`bg-${props.color}`]: props.color,
-              [`avatar-${props.size}`]: props.size,
-              [`text-${props.textColor}`]: props.textColor,
-            },
-            `${props.shape}`,
-          ],
-        },
-        [
-          props.src
-            ? h('img', { src: props.src, class: 'avatar-img' })
-            : slots.default && slots.default(),
-          props.status && h('span', { class: ['avatar-status', `bg-${props.status}`] }),
-        ],
-      )
-  },
-})
-export { CAvatar }
diff --git a/packages/coreui-vue/src/components/avatar/__tests__/CAvatar.spec.ts b/packages/coreui-vue/src/components/avatar/__tests__/CAvatar.spec.ts
deleted file mode 100644
index 427a120b..00000000
--- a/packages/coreui-vue/src/components/avatar/__tests__/CAvatar.spec.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CAvatar as Component } from '../../../index'
-
-const ComponentName = 'CAvatar'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    shape: 'rounded-bottom',
-    size: 'md',
-    src: '/bazinga',
-    status: 'danger',
-    textColor: 'light',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('avatar')).toBe(true)
-  })
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('avatar')).toBe(true)
-    expect(customWrapper.classes('bg-warning')).toBe(true)
-    expect(customWrapper.classes('avatar-md')).toBe(true)
-    expect(customWrapper.classes('text-light')).toBe(true)
-    expect(customWrapper.find('img').classes('avatar-img')).toBe(true)
-    expect(customWrapper.find('img').attributes('src')).toBe('/bazinga')
-    expect(customWrapper.find('span').classes('avatar-status')).toBe(true)
-    expect(customWrapper.find('span').classes('bg-danger')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/avatar/__tests__/__snapshots__/CAvatar.spec.ts.snap b/packages/coreui-vue/src/components/avatar/__tests__/__snapshots__/CAvatar.spec.ts.snap
deleted file mode 100644
index 5166a5f1..00000000
--- a/packages/coreui-vue/src/components/avatar/__tests__/__snapshots__/CAvatar.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CAvatar component renders correctly 1`] = `
-"<div class="avatar undefined">Default slot
-  <!---->
-</div>"
-`;
-
-exports[`Loads and display CAvatar component renders correctly 2`] = `"<div class="avatar bg-warning avatar-md text-light rounded-bottom"><img src="/bazinga" class="avatar-img"><span class="avatar-status bg-danger"></span></div>"`;
diff --git a/packages/coreui-vue/src/components/avatar/index.ts b/packages/coreui-vue/src/components/avatar/index.ts
deleted file mode 100644
index 479ab9f4..00000000
--- a/packages/coreui-vue/src/components/avatar/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CAvatar } from './CAvatar'
-
-const CAvatarPlugin = {
-  install: (app: App): void => {
-    app.component(CAvatar.name as string, CAvatar)
-  },
-}
-
-export { CAvatarPlugin, CAvatar }
diff --git a/packages/coreui-vue/src/components/backdrop/CBackdrop.ts b/packages/coreui-vue/src/components/backdrop/CBackdrop.ts
deleted file mode 100644
index adea3428..00000000
--- a/packages/coreui-vue/src/components/backdrop/CBackdrop.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineComponent, h, Transition } from 'vue'
-
-const CBackdrop = defineComponent({
-  name: 'CBackdrop',
-  props: {
-    /**
-     * Toggle the visibility of modal component.
-     */
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-  },
-  setup(props) {
-    return () =>
-      h(
-        Transition,
-        {
-          onEnter: (el) => {
-            el.classList.add('show')
-          },
-          onLeave: (el) => {
-            el.classList.remove('show')
-          },
-        },
-        () =>
-          props.visible &&
-          h('div', {
-            class: 'fade',
-          }),
-      )
-  },
-})
-
-export { CBackdrop }
diff --git a/packages/coreui-vue/src/components/backdrop/__tests__/CBackdrop.spec.ts b/packages/coreui-vue/src/components/backdrop/__tests__/CBackdrop.spec.ts
deleted file mode 100644
index 016cf75d..00000000
--- a/packages/coreui-vue/src/components/backdrop/__tests__/CBackdrop.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CBackdrop as Component } from '../../../index'
-
-const ComponentName = 'CBackdrop'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.find('div').classes('fade')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/backdrop/__tests__/__snapshots__/CBackdrop.spec.ts.snap b/packages/coreui-vue/src/components/backdrop/__tests__/__snapshots__/CBackdrop.spec.ts.snap
deleted file mode 100644
index 2bf4c264..00000000
--- a/packages/coreui-vue/src/components/backdrop/__tests__/__snapshots__/CBackdrop.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CBackdrop component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="true">
-  <div class="fade"></div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/backdrop/index.ts b/packages/coreui-vue/src/components/backdrop/index.ts
deleted file mode 100644
index 440292ba..00000000
--- a/packages/coreui-vue/src/components/backdrop/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CBackdrop } from './CBackdrop'
-
-const CBackdropPlugin = {
-  install: (app: App): void => {
-    app.component(CBackdrop.name as string, CBackdrop)
-  },
-}
-
-export { CBackdropPlugin, CBackdrop }
diff --git a/packages/coreui-vue/src/components/badge/CBadge.ts b/packages/coreui-vue/src/components/badge/CBadge.ts
deleted file mode 100644
index 3802015d..00000000
--- a/packages/coreui-vue/src/components/badge/CBadge.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color, Shape, TextColor } from '../../props'
-
-const CBadge = defineComponent({
-  name: 'CBadge',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'span',
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Position badge in one of the corners of a link or button.
-     *
-     * @values 'top-start', 'top-end', 'bottom-end', 'bottom-start'
-     */
-    position: {
-      type: String,
-      validator: (value: string) => {
-        return ['top-start', 'top-end', 'bottom-end', 'bottom-start'].includes(value)
-      },
-    },
-    /**
-     * Select the shape of the component.
-     *
-     * @values 'rounded', 'rounded-top', 'rounded-end', 'rounded-bottom', 'rounded-start', 'rounded-circle', 'rounded-pill', 'rounded-0', 'rounded-1', 'rounded-2', 'rounded-3'
-     */
-    shape: Shape,
-    /**
-     * Size the component small.
-     *
-     * @values 'sm'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return value === 'sm'
-      },
-    },
-    /**
-     * Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     * @since 5.0.0
-     */
-    textBgColor: Color,
-    /**
-     * Sets the text color of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', 'primary-emphasis', 'secondary-emphasis', 'success-emphasis', 'danger-emphasis', 'warning-emphasis', 'info-emphasis', 'light-emphasis', 'body', 'body-emphasis', 'body-secondary', 'body-tertiary', 'black', 'black-50', 'white', 'white-50'
-     */
-    textColor: TextColor,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            'badge',
-            {
-              [`bg-${props.color}`]: props.color,
-              'position-absolute translate-middle': props.position,
-              'top-0': props.position && props.position.includes('top'),
-              'top-100': props.position && props.position.includes('bottom'),
-              'start-100': props.position && props.position.includes('end'),
-              'start-0': props.position && props.position.includes('start'),
-              [`badge-${props.size}`]: props.size,
-              [`text-${props.textColor}`]: props.textColor,
-              [`text-bg-${props.textBgColor}`]: props.textBgColor,
-            },
-            props.shape,
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-export { CBadge }
diff --git a/packages/coreui-vue/src/components/badge/__tests__/CBadge.spec.ts b/packages/coreui-vue/src/components/badge/__tests__/CBadge.spec.ts
deleted file mode 100644
index 4d132901..00000000
--- a/packages/coreui-vue/src/components/badge/__tests__/CBadge.spec.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { shallowMount } from '@vue/test-utils'
-import { CBadge as Component } from '../../'
-
-const ComponentName = 'CBadge'
-const wrapper = shallowMount(Component)
-const customWrapper = shallowMount(Component, {
-  props: {
-    color: 'success',
-  },
-  attrs: {
-    class: 'bazinga',
-  },
-  slots: {
-    default: 'Hello World!',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(wrapper.element).toMatchSnapshot()
-  })
-  it('renders correctly with slot', () => {
-    expect(customWrapper.element).toMatchSnapshot()
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('has a prope class names', () => {
-    expect(customWrapper.classes('bazinga')).toBe(true)
-    expect(customWrapper.classes('badge')).toBe(true)
-    expect(customWrapper.classes('bg-success')).toBe(true)
-  })
-  it('default slot contains text', () => {
-    expect(customWrapper.text()).toBe('Hello World!')
-  })
-})
diff --git a/packages/coreui-vue/src/components/badge/__tests__/__snapshots__/CBadge.spec.ts.snap b/packages/coreui-vue/src/components/badge/__tests__/__snapshots__/CBadge.spec.ts.snap
deleted file mode 100644
index 249fb4fd..00000000
--- a/packages/coreui-vue/src/components/badge/__tests__/__snapshots__/CBadge.spec.ts.snap
+++ /dev/null
@@ -1,15 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CBadge component renders correctly 1`] = `
-<span
-  class="badge"
-/>
-`;
-
-exports[`Loads and display CBadge component renders correctly with slot 1`] = `
-<span
-  class="badge bg-success bazinga"
->
-  Hello World!
-</span>
-`;
diff --git a/packages/coreui-vue/src/components/badge/index.ts b/packages/coreui-vue/src/components/badge/index.ts
deleted file mode 100644
index 9a2e47a3..00000000
--- a/packages/coreui-vue/src/components/badge/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CBadge } from './CBadge'
-
-const CBadgePlugin = {
-  install: (app: App): void => {
-    app.component(CBadge.name as string, CBadge)
-  },
-}
-
-export { CBadge, CBadgePlugin }
diff --git a/packages/coreui-vue/src/components/breadcrumb/CBreadcrumb.ts b/packages/coreui-vue/src/components/breadcrumb/CBreadcrumb.ts
deleted file mode 100644
index df95f2ff..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/CBreadcrumb.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CBreadcrumb = defineComponent({
-  name: 'CBreadcrumb',
-  inheritAttrs: false,
-  setup(_, { slots, attrs }) {
-    return () =>
-      h(
-        'nav',
-        {
-          'aria-label': 'breadcrumb',
-        },
-        h('ol', { class: ['breadcrumb', attrs.class] }, slots.default && slots.default()),
-      )
-  },
-})
-
-export { CBreadcrumb }
diff --git a/packages/coreui-vue/src/components/breadcrumb/CBreadcrumbItem.ts b/packages/coreui-vue/src/components/breadcrumb/CBreadcrumbItem.ts
deleted file mode 100644
index 4b5fa4a6..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/CBreadcrumbItem.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CBreadcrumbItem = defineComponent({
-  name: 'CBreadcrumbItem',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * The `href` attribute for the inner link component.
-     */
-    href: String,
-  },
-
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'li',
-        {
-          class: [
-            'breadcrumb-item',
-            {
-              active: props.active,
-            },
-          ],
-          ...(props.active && { 'aria-current': 'page' }),
-        },
-        props.href
-          ? h('a', { href: props.href }, slots.default && slots.default())
-          : slots.default && slots.default(),
-      )
-  },
-})
-export { CBreadcrumbItem }
diff --git a/packages/coreui-vue/src/components/breadcrumb/__tests__/CBreadcrumb.spec.ts b/packages/coreui-vue/src/components/breadcrumb/__tests__/CBreadcrumb.spec.ts
deleted file mode 100644
index 28dee35b..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/__tests__/CBreadcrumb.spec.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CBreadcrumb as Component } from '../../../index'
-
-const ComponentName = 'CBreadcrumb'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    class: 'bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.find('ol').text()).toContain('Default slot')
-    expect(defaultWrapper.attributes('aria-label')).toBe('breadcrumb')
-    expect(defaultWrapper.find('ol').classes('breadcrumb')).toBe(true)
-    expect(defaultWrapper.find('ol').classes('bazinga')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.ts b/packages/coreui-vue/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.ts
deleted file mode 100644
index 39cc7b07..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/__tests__/CBreadcrumbItem.spec.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CBreadcrumbItem as Component } from '../../../index'
-
-const ComponentName = 'CBreadcrumbItem'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('breadcrumb-item')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('breadcrumb-item')).toBe(true)
-    expect(customWrapper.attributes('aria-current')).toBe('page')
-    expect(customWrapper.find('a').attributes('href')).toBe('/bazinga')
-    expect(customWrapper.find('a').text()).toContain('Default slot')
-  })
-})
diff --git a/packages/coreui-vue/src/components/breadcrumb/__tests__/__snapshots__/CBreadcrumb.spec.ts.snap b/packages/coreui-vue/src/components/breadcrumb/__tests__/__snapshots__/CBreadcrumb.spec.ts.snap
deleted file mode 100644
index 2cccad76..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/__tests__/__snapshots__/CBreadcrumb.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CBreadcrumb component renders correctly 1`] = `
-"<nav aria-label="breadcrumb">
-  <ol class="breadcrumb bazinga">Default slot</ol>
-</nav>"
-`;
diff --git a/packages/coreui-vue/src/components/breadcrumb/__tests__/__snapshots__/CBreadcrumbItem.spec.ts.snap b/packages/coreui-vue/src/components/breadcrumb/__tests__/__snapshots__/CBreadcrumbItem.spec.ts.snap
deleted file mode 100644
index 7ffb98a0..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/__tests__/__snapshots__/CBreadcrumbItem.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CBreadcrumbItem component renders correctly 1`] = `"<li class="breadcrumb-item active" aria-current="page"><a href="/bazinga">Default slot</a></li>"`;
-
-exports[`Loads and display CBreadcrumbItem component renders correctly 1`] = `"<li class="breadcrumb-item">Default slot</li>"`;
diff --git a/packages/coreui-vue/src/components/breadcrumb/index.ts b/packages/coreui-vue/src/components/breadcrumb/index.ts
deleted file mode 100644
index b7bad130..00000000
--- a/packages/coreui-vue/src/components/breadcrumb/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { App } from 'vue'
-import { CBreadcrumbItem } from './CBreadcrumbItem'
-import { CBreadcrumb } from './CBreadcrumb'
-
-const CBreadcrumbPlugin = {
-  install: (app: App): void => {
-    app.component(CBreadcrumb.name as string, CBreadcrumb)
-    app.component(CBreadcrumbItem.name as string, CBreadcrumbItem)
-  },
-}
-
-export { CBreadcrumbPlugin, CBreadcrumb, CBreadcrumbItem }
diff --git a/packages/coreui-vue/src/components/button-group/CButtonGroup.ts b/packages/coreui-vue/src/components/button-group/CButtonGroup.ts
deleted file mode 100644
index 58add3d8..00000000
--- a/packages/coreui-vue/src/components/button-group/CButtonGroup.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CButtonGroup = defineComponent({
-  name: 'CButtonGroup',
-  props: {
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm', 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-    /**
-     * Create a set of buttons that appear vertically stacked rather than horizontally. Split button dropdowns are not supported here.
-     */
-    vertical: Boolean,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            props.vertical ? 'btn-group-vertical' : 'btn-group',
-            { [`btn-group-${props.size}`]: props.size },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CButtonGroup }
diff --git a/packages/coreui-vue/src/components/button-group/CButtonToolbar.ts b/packages/coreui-vue/src/components/button-group/CButtonToolbar.ts
deleted file mode 100644
index 8bda3003..00000000
--- a/packages/coreui-vue/src/components/button-group/CButtonToolbar.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CButtonToolbar = defineComponent({
-  name: 'CButtonToolbar',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'btn-toolbar' }, slots.default && slots.default())
-  },
-})
-export { CButtonToolbar }
diff --git a/packages/coreui-vue/src/components/button-group/__tests__/CButtonGroup.spec.ts b/packages/coreui-vue/src/components/button-group/__tests__/CButtonGroup.spec.ts
deleted file mode 100644
index a3b5faca..00000000
--- a/packages/coreui-vue/src/components/button-group/__tests__/CButtonGroup.spec.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CButtonGroup as Component } from '../../../index'
-
-const ComponentName = 'CButtonGroup'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    size: 'lg',
-    vertical: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('btn-group')).toBe(true)
-  })
-})
-
-describe(`Custom ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('btn-group-vertical')).toBe(true)
-    expect(customWrapper.classes('btn-group-lg')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/button-group/__tests__/CButtonToolbar.spec.ts b/packages/coreui-vue/src/components/button-group/__tests__/CButtonToolbar.spec.ts
deleted file mode 100644
index e6133737..00000000
--- a/packages/coreui-vue/src/components/button-group/__tests__/CButtonToolbar.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CButtonToolbar as Component } from '../../../index'
-
-const ComponentName = 'CButtonToolbar'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('btn-toolbar')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/button-group/__tests__/__snapshots__/CButtonGroup.spec.ts.snap b/packages/coreui-vue/src/components/button-group/__tests__/__snapshots__/CButtonGroup.spec.ts.snap
deleted file mode 100644
index 051888f8..00000000
--- a/packages/coreui-vue/src/components/button-group/__tests__/__snapshots__/CButtonGroup.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Custom CButtonGroup component renders correctly 1`] = `"<div class="btn-group-vertical btn-group-lg">Default slot</div>"`;
-
-exports[`Loads and display CButtonGroup component renders correctly 1`] = `"<div class="btn-group">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/button-group/__tests__/__snapshots__/CButtonToolbar.spec.ts.snap b/packages/coreui-vue/src/components/button-group/__tests__/__snapshots__/CButtonToolbar.spec.ts.snap
deleted file mode 100644
index 70a5ee4e..00000000
--- a/packages/coreui-vue/src/components/button-group/__tests__/__snapshots__/CButtonToolbar.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CButtonToolbar component renders correctly 1`] = `"<div class="btn-toolbar">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/button-group/index.ts b/packages/coreui-vue/src/components/button-group/index.ts
deleted file mode 100644
index f038168b..00000000
--- a/packages/coreui-vue/src/components/button-group/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { App } from 'vue'
-import { CButtonToolbar } from './CButtonToolbar'
-import { CButtonGroup } from './CButtonGroup'
-
-const CButtonGroupPlugin = {
-  install: (app: App): void => {
-    app.component(CButtonToolbar.name as string, CButtonToolbar)
-    app.component(CButtonGroup.name as string, CButtonGroup)
-  },
-}
-
-export { CButtonGroupPlugin, CButtonToolbar, CButtonGroup }
diff --git a/packages/coreui-vue/src/components/button/CButton.ts b/packages/coreui-vue/src/components/button/CButton.ts
deleted file mode 100644
index ebb3d8c0..00000000
--- a/packages/coreui-vue/src/components/button/CButton.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color, Shape } from '../../props'
-
-export const CButton = defineComponent({
-  name: 'CButton',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'button',
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: String,
-    /**
-     * Select the shape of the component.
-     *
-     * @values 'rounded', 'rounded-top', 'rounded-end', 'rounded-bottom', 'rounded-start', 'rounded-circle', 'rounded-pill', 'rounded-0', 'rounded-1', 'rounded-2', 'rounded-3'
-     */
-    shape: Shape,
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm', 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-    /**
-     * Specifies the type of button. Always specify the type attribute for the `<button>` element.
-     * Different browsers may use different default types for the `<button>` element.
-     *
-     * @values 'button', 'submit', 'reset'
-     */
-    type: {
-      type: String,
-      default: 'button',
-      validator: (value: string) => {
-        return ['button', 'submit', 'reset'].includes(value)
-      },
-    },
-    /**
-     * Set the button variant to an outlined button or a ghost button.
-     *
-     * @values 'ghost', 'outline'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return ['ghost', 'outline'].includes(value)
-      },
-    },
-  },
-  emits: [
-    /**
-     * Event called when the user clicks on the button.
-     */
-    'click',
-  ],
-  setup(props, { emit, slots }) {
-    const component = props.href ? 'a' : props.as
-    const handleClick = (event: Event) => {
-      if (props.disabled) {
-        return
-      }
-
-      emit('click', event)
-    }
-    return () =>
-      h(
-        component,
-        {
-          class: [
-            'btn',
-            {
-              [`btn-${props.variant}-${props.color}`]: props.color && props.variant,
-              [`btn-${props.variant}`]: !props.color && props.variant,
-              [`btn-${props.color}`]: props.color && !props.variant,
-              [`btn-${props.size}`]: props.size,
-              active: props.active,
-              disabled: props.disabled,
-            },
-            props.shape,
-          ],
-          ...(component === 'a' && props.disabled && { 'aria-disabled': true, tabIndex: -1 }),
-          ...(component === 'a' && props.href && { href: props.href }),
-          ...(component === 'button' && { type: props.type, disabled: props.disabled }),
-          onClick: handleClick,
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
diff --git a/packages/coreui-vue/src/components/button/__tests__/CButton.spec.ts b/packages/coreui-vue/src/components/button/__tests__/CButton.spec.ts
deleted file mode 100644
index a0aeded1..00000000
--- a/packages/coreui-vue/src/components/button/__tests__/CButton.spec.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CButton as Component } from '../../../index'
-
-const ComponentName = 'CButton'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    as: 'div',
-    color: 'warning',
-    disabled: true,
-    href: '/bazinga',
-    shape: 'rounded-pill',
-    size: 'lg',
-    variant: 'outline',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    as: 'a',
-    color: 'warning',
-    disabled: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('btn')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('btn-outline-warning')).toBe(true)
-    expect(customWrapper.classes('btn-lg')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.classes('rounded-pill')).toBe(true)
-    expect(customWrapper.classes('btn')).toBe(true)
-    expect(customWrapper.attributes('disabled')).toBe('true')
-  })
-})
-
-describe(`Customize (number two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.text()).toContain('Default slot')
-    expect(customWrapperTwo.classes('disabled')).toBe(true)
-    expect(customWrapperTwo.classes('btn')).toBe(true)
-    expect(customWrapperTwo.attributes('aria-disabled')).toBe('true')
-    expect(customWrapperTwo.attributes('tabindex')).toBe('-1')
-  })
-})
diff --git a/packages/coreui-vue/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap b/packages/coreui-vue/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap
deleted file mode 100644
index 7b2d617e..00000000
--- a/packages/coreui-vue/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (number two) CButton component renders correctly 1`] = `"<a class="btn btn-warning disabled" aria-disabled="true" tabindex="-1">Default slot</a>"`;
-
-exports[`Customize CButton component renders correctly 1`] = `"<a class="btn btn-outline-warning btn-lg active disabled rounded-pill" aria-disabled="true" tabindex="-1" href="/bazinga">Default slot</a>"`;
-
-exports[`Loads and display CButton component renders correctly 1`] = `"<button class="btn btn-undefined" type="button">Default slot</button>"`;
diff --git a/packages/coreui-vue/src/components/button/index.ts b/packages/coreui-vue/src/components/button/index.ts
deleted file mode 100644
index 679616e0..00000000
--- a/packages/coreui-vue/src/components/button/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CButton } from './CButton'
-
-const CButtonPlugin = {
-  install: (app: App): void => {
-    app.component(CButton.name as string, CButton)
-  },
-}
-
-export { CButtonPlugin, CButton }
diff --git a/packages/coreui-vue/src/components/callout/CCallout.ts b/packages/coreui-vue/src/components/callout/CCallout.ts
deleted file mode 100644
index 04947cf2..00000000
--- a/packages/coreui-vue/src/components/callout/CCallout.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CCallout = defineComponent({
-  name: 'CCallout',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'callout',
-            {
-              [`callout-${props.color}`]: props.color,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-export { CCallout }
diff --git a/packages/coreui-vue/src/components/callout/__tests__/CCallout.spec.ts b/packages/coreui-vue/src/components/callout/__tests__/CCallout.spec.ts
deleted file mode 100644
index df2376dc..00000000
--- a/packages/coreui-vue/src/components/callout/__tests__/CCallout.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCallout as Component } from '../../../index'
-
-const ComponentName = 'CCallout'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('callout')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('callout')).toBe(true)
-    expect(customWrapper.classes('callout-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/callout/__tests__/__snapshots__/CCallout.spec.ts.snap b/packages/coreui-vue/src/components/callout/__tests__/__snapshots__/CCallout.spec.ts.snap
deleted file mode 100644
index 07edc5ef..00000000
--- a/packages/coreui-vue/src/components/callout/__tests__/__snapshots__/CCallout.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCallout component renders correctly 1`] = `"<div class="callout callout-warning">Default slot</div>"`;
-
-exports[`Loads and display CCallout component renders correctly 1`] = `"<div class="callout">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/callout/index.ts b/packages/coreui-vue/src/components/callout/index.ts
deleted file mode 100644
index e0baf185..00000000
--- a/packages/coreui-vue/src/components/callout/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CCallout } from './CCallout'
-
-const CCalloutPlugin = {
-  install: (app: App): void => {
-    app.component(CCallout.name as string, CCallout)
-  },
-}
-
-export { CCalloutPlugin, CCallout }
diff --git a/packages/coreui-vue/src/components/card/CCard.ts b/packages/coreui-vue/src/components/card/CCard.ts
deleted file mode 100644
index 580dc207..00000000
--- a/packages/coreui-vue/src/components/card/CCard.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color, TextColor } from '../../props'
-
-const CCard = defineComponent({
-  name: 'CCard',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     * @since 5.0.0
-     */
-    textBgColor: Color,
-    /**
-     * Sets the text color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', 'primary-emphasis', 'secondary-emphasis', 'success-emphasis', 'danger-emphasis', 'warning-emphasis', 'info-emphasis', 'light-emphasis', 'body', 'body-emphasis', 'body-secondary', 'body-tertiary', 'black', 'black-50', 'white', 'white-50'
-     */
-    textColor: TextColor,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'card',
-            {
-              [`bg-${props.color}`]: props.color,
-              [`text-${props.textColor}`]: props.textColor,
-              [`text-bg-${props.textBgColor}`]: props.textBgColor,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CCard }
diff --git a/packages/coreui-vue/src/components/card/CCardBody.ts b/packages/coreui-vue/src/components/card/CCardBody.ts
deleted file mode 100644
index 51813148..00000000
--- a/packages/coreui-vue/src/components/card/CCardBody.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardBody = defineComponent({
-  name: 'CCardBody',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'card-body' }, slots.default && slots.default())
-  },
-})
-export { CCardBody }
diff --git a/packages/coreui-vue/src/components/card/CCardFooter.ts b/packages/coreui-vue/src/components/card/CCardFooter.ts
deleted file mode 100644
index 4ff28cec..00000000
--- a/packages/coreui-vue/src/components/card/CCardFooter.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardFooter = defineComponent({
-  name: 'CCardFooter',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'card-footer' }, slots.default && slots.default())
-  },
-})
-
-export { CCardFooter }
diff --git a/packages/coreui-vue/src/components/card/CCardGroup.ts b/packages/coreui-vue/src/components/card/CCardGroup.ts
deleted file mode 100644
index f7b0139e..00000000
--- a/packages/coreui-vue/src/components/card/CCardGroup.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardGroup = defineComponent({
-  name: 'CCardGroup',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'card-group' }, slots.default && slots.default())
-  },
-})
-
-export { CCardGroup }
diff --git a/packages/coreui-vue/src/components/card/CCardHeader.ts b/packages/coreui-vue/src/components/card/CCardHeader.ts
deleted file mode 100644
index d216d892..00000000
--- a/packages/coreui-vue/src/components/card/CCardHeader.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardHeader = defineComponent({
-  name: 'CCardHeader',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'card-header' }, slots.default && slots.default())
-  },
-})
-
-export { CCardHeader }
diff --git a/packages/coreui-vue/src/components/card/CCardImage.ts b/packages/coreui-vue/src/components/card/CCardImage.ts
deleted file mode 100644
index 81ff7fc0..00000000
--- a/packages/coreui-vue/src/components/card/CCardImage.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardImage = defineComponent({
-  name: 'CCardImage',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'img',
-    },
-    /**
-     * Optionally orientate the image to the top, bottom.
-     *
-     * @values 'top', 'bottom'
-     */
-    orientation: {
-      type: String,
-      validator: (value: string) => {
-        return ['top', 'bottom'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: `card-img${props.orientation ? `-${props.orientation}` : ''}`,
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CCardImage }
diff --git a/packages/coreui-vue/src/components/card/CCardImageOverlay.ts b/packages/coreui-vue/src/components/card/CCardImageOverlay.ts
deleted file mode 100644
index d35e52a5..00000000
--- a/packages/coreui-vue/src/components/card/CCardImageOverlay.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardImageOverlay = defineComponent({
-  name: 'CCardImageOverlay',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'card-img-overlay' }, slots.default && slots.default())
-  },
-})
-export { CCardImageOverlay }
diff --git a/packages/coreui-vue/src/components/card/CCardLink.ts b/packages/coreui-vue/src/components/card/CCardLink.ts
deleted file mode 100644
index b80d1865..00000000
--- a/packages/coreui-vue/src/components/card/CCardLink.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CLink } from '../link'
-
-const CCardLink = defineComponent({
-  name: 'CCardLink',
-  props: {
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: {
-      type: String,
-      default: '#',
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CLink,
-        { class: 'card-link', href: props.href },
-        { default: () => slots.default && slots.default() },
-      )
-  },
-})
-
-export { CCardLink }
diff --git a/packages/coreui-vue/src/components/card/CCardSubtitle.ts b/packages/coreui-vue/src/components/card/CCardSubtitle.ts
deleted file mode 100644
index b3bdf933..00000000
--- a/packages/coreui-vue/src/components/card/CCardSubtitle.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardSubtitle = defineComponent({
-  name: 'CCardSubtitle',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'h6',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'card-subtitle' }, slots.default && slots.default())
-  },
-})
-export { CCardSubtitle }
diff --git a/packages/coreui-vue/src/components/card/CCardText.ts b/packages/coreui-vue/src/components/card/CCardText.ts
deleted file mode 100644
index 0f26e875..00000000
--- a/packages/coreui-vue/src/components/card/CCardText.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardText = defineComponent({
-  name: 'CCardText',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'p',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'card-text' }, slots.default && slots.default())
-  },
-})
-
-export { CCardText }
diff --git a/packages/coreui-vue/src/components/card/CCardTitle.ts b/packages/coreui-vue/src/components/card/CCardTitle.ts
deleted file mode 100644
index 4564bdf0..00000000
--- a/packages/coreui-vue/src/components/card/CCardTitle.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCardTitle = defineComponent({
-  name: 'CCardTitle',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'h5',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'card-title' }, slots.default && slots.default())
-  },
-})
-
-export { CCardTitle }
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCard.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCard.spec.ts
deleted file mode 100644
index 5831bd1a..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCard.spec.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCard as Component } from '../../../index'
-
-const ComponentName = 'CCard'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    textColor: 'info',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('card')).toBe(true)
-    expect(customWrapper.classes('bg-warning')).toBe(true)
-    expect(customWrapper.classes('text-info')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardBody.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardBody.spec.ts
deleted file mode 100644
index 92e9b639..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardBody.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardBody as Component } from '../../../index'
-
-const ComponentName = 'CCardBody'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-body')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardFooter.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardFooter.spec.ts
deleted file mode 100644
index 71d4f9ca..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardFooter.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardFooter as Component } from '../../../index'
-
-const ComponentName = 'CCardFooter'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-footer')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardGroup.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardGroup.spec.ts
deleted file mode 100644
index 0c9cc4ae..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardGroup.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardGroup as Component } from '../../../index'
-
-const ComponentName = 'CCardGroup'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-group')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardHeader.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardHeader.spec.ts
deleted file mode 100644
index 01e950c4..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardHeader.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardHeader as Component } from '../../../index'
-
-const ComponentName = 'CCardHeader'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'span',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-header')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('card-header')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardImage.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardImage.spec.ts
deleted file mode 100644
index 342a74fa..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardImage.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardImage as Component } from '../../../index'
-
-const ComponentName = 'CCardImage'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'a',
-    orientation: 'bottom',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-img')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('card-img-bottom')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardImageOverlay.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardImageOverlay.spec.ts
deleted file mode 100644
index 65e7639a..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardImageOverlay.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardImageOverlay as Component } from '../../../index'
-
-const ComponentName = 'CCardImageOverlay'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-img-overlay')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardLink.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardLink.spec.ts
deleted file mode 100644
index f6be4bda..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardLink.spec.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardLink as Component } from '../../../index'
-
-const ComponentName = 'CCardLink'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-link')).toBe(true)
-    expect(defaultWrapper.attributes('href')).toBe('/bazinga')
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardSubtitle.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardSubtitle.spec.ts
deleted file mode 100644
index d78f05ad..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardSubtitle.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardSubtitle as Component } from '../../../index'
-
-const ComponentName = 'CCardSubtitle'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h4',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-subtitle')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('card-subtitle')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardText.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardText.spec.ts
deleted file mode 100644
index cf03e29a..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardText.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardText as Component } from '../../../index'
-
-const ComponentName = 'CCardText'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h4',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-text')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('card-text')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/CCardTitle.spec.ts b/packages/coreui-vue/src/components/card/__tests__/CCardTitle.spec.ts
deleted file mode 100644
index a3c28d5d..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/CCardTitle.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCardTitle as Component } from '../../../index'
-
-const ComponentName = 'CCardTitle'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h2',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('card-title')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('card-title')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCard.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCard.spec.ts.snap
deleted file mode 100644
index 63e0b00a..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCard.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCard component renders correctly 1`] = `"<div class="card bg-warning text-info">Default slot</div>"`;
-
-exports[`Loads and display CCard component renders correctly 1`] = `"<div class="card">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardBody.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardBody.spec.ts.snap
deleted file mode 100644
index ccbee9e9..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardBody.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCardBody component renders correctly 1`] = `"<div class="card-body">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardFooter.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardFooter.spec.ts.snap
deleted file mode 100644
index 456c0ff1..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardFooter.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCardFooter component renders correctly 1`] = `"<div class="card-footer">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardGroup.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardGroup.spec.ts.snap
deleted file mode 100644
index aee3447b..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardGroup.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCardGroup component renders correctly 1`] = `"<div class="card-group">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardHeader.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardHeader.spec.ts.snap
deleted file mode 100644
index 0efe7610..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardHeader.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCardHeader component renders correctly 1`] = `"<span class="card-header">Default slot</span>"`;
-
-exports[`Loads and display CCardHeader component renders correctly 1`] = `"<div class="card-header">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardImage.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardImage.spec.ts.snap
deleted file mode 100644
index 50dcb1c1..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardImage.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCardImage component renders correctly 1`] = `"<a class="card-img-bottom">Default slot</a>"`;
-
-exports[`Loads and display CCardImage component renders correctly 1`] = `"<img class="card-img">"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardImageOverlay.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardImageOverlay.spec.ts.snap
deleted file mode 100644
index 22382136..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardImageOverlay.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCardImageOverlay component renders correctly 1`] = `"<div class="card-img-overlay">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardLink.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardLink.spec.ts.snap
deleted file mode 100644
index dbe5ad65..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardLink.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCardLink component renders correctly 1`] = `"<a class="card-link" href="/bazinga">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardSubtitle.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardSubtitle.spec.ts.snap
deleted file mode 100644
index e68a43a3..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardSubtitle.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCardSubtitle component renders correctly 1`] = `"<h4 class="card-subtitle">Default slot</h4>"`;
-
-exports[`Loads and display CCardSubtitle component renders correctly 1`] = `"<h6 class="card-subtitle">Default slot</h6>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardText.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardText.spec.ts.snap
deleted file mode 100644
index 99086ae3..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardText.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCardText component renders correctly 1`] = `"<h4 class="card-text">Default slot</h4>"`;
-
-exports[`Loads and display CCardText component renders correctly 1`] = `"<p class="card-text">Default slot</p>"`;
diff --git a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardTitle.spec.ts.snap b/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardTitle.spec.ts.snap
deleted file mode 100644
index b3fff67e..00000000
--- a/packages/coreui-vue/src/components/card/__tests__/__snapshots__/CCardTitle.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCardTitle component renders correctly 1`] = `"<h2 class="card-title">Default slot</h2>"`;
-
-exports[`Loads and display CCardTitle component renders correctly 1`] = `"<h5 class="card-title">Default slot</h5>"`;
diff --git a/packages/coreui-vue/src/components/card/index.ts b/packages/coreui-vue/src/components/card/index.ts
deleted file mode 100644
index cad0a6ca..00000000
--- a/packages/coreui-vue/src/components/card/index.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { App } from 'vue'
-import { CCard } from './CCard'
-import { CCardBody } from './CCardBody'
-import { CCardFooter } from './CCardFooter'
-import { CCardGroup } from './CCardGroup'
-import { CCardHeader } from './CCardHeader'
-import { CCardImage } from './CCardImage'
-import { CCardImageOverlay } from './CCardImageOverlay'
-import { CCardLink } from './CCardLink'
-import { CCardSubtitle } from './CCardSubtitle'
-import { CCardText } from './CCardText'
-import { CCardTitle } from './CCardTitle'
-
-const CCardPlugin = {
-  install: (app: App): void => {
-    app.component(CCard.name as string, CCard)
-    app.component(CCardBody.name as string, CCardBody)
-    app.component(CCardFooter.name as string, CCardFooter)
-    app.component(CCardGroup.name as string, CCardGroup)
-    app.component(CCardHeader.name as string, CCardHeader)
-    app.component(CCardImage.name as string, CCardImage)
-    app.component(CCardImageOverlay.name as string, CCardImageOverlay)
-    app.component(CCardLink.name as string, CCardLink)
-    app.component(CCardSubtitle.name as string, CCardSubtitle)
-    app.component(CCardText.name as string, CCardText)
-    app.component(CCardTitle.name as string, CCardTitle)
-  },
-}
-
-export {
-  CCardPlugin,
-  CCard,
-  CCardBody,
-  CCardFooter,
-  CCardGroup,
-  CCardHeader,
-  CCardImage,
-  CCardImageOverlay,
-  CCardLink,
-  CCardSubtitle,
-  CCardText,
-  CCardTitle,
-}
diff --git a/packages/coreui-vue/src/components/carousel/CCarousel.ts b/packages/coreui-vue/src/components/carousel/CCarousel.ts
deleted file mode 100644
index bbb7046a..00000000
--- a/packages/coreui-vue/src/components/carousel/CCarousel.ts
+++ /dev/null
@@ -1,253 +0,0 @@
-import {
-  defineComponent,
-  h,
-  ref,
-  VNode,
-  onBeforeMount,
-  onMounted,
-  onUpdated,
-  provide,
-  watch,
-} from 'vue'
-
-import { isInViewport } from '../../utils'
-
-const CCarousel = defineComponent({
-  name: 'CCarousel',
-  props: {
-    /**
-     * Adding in the previous and next controls.
-     */
-    controls: Boolean,
-    /**
-     * Add darker controls, indicators, and captions.
-     */
-    dark: Boolean,
-    /**
-     * index of the active item.
-     */
-    index: {
-      type: Number,
-      default: 0,
-    },
-    /**
-     * Adding indicators at the bottom of the carousel for each item.
-     */
-    indicators: Boolean,
-    /**
-     * The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.
-     */
-    interval: {
-      type: [Boolean, Number],
-      default: 5000,
-    },
-    /**
-     * 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.
-     */
-    pause: {
-      type: [Boolean, String],
-      default: 'hover',
-      validator: (value: boolean | string) => {
-        return typeof value === 'boolean' || value === 'hover'
-      },
-    },
-    /**
-     * Set type of the transition.
-     *
-     * @values 'crossfade', 'slide'
-     */
-    transition: {
-      type: String,
-      default: 'slide',
-      validator: (value: string) => {
-        return ['crossfade', 'slide'].includes(value)
-      },
-    },
-    /**
-     * Set whether the carousel should cycle continuously or have hard stops.
-     */
-    wrap: {
-      type: Boolean,
-      default: true,
-    },
-  },
-  setup(props, { slots }) {
-    const carouselRef = ref()
-
-    const active = ref(props.index)
-    const animating = ref(false)
-    const customInterval = ref<boolean | number>(props.interval)
-    const direction = ref('next')
-    const items = ref<VNode[]>([])
-    const timeout = ref()
-    const visible = ref()
-
-    const setAnimating = (value: boolean) => {
-      animating.value = value
-    }
-    const setCustomInterval = (value: boolean | number) => {
-      customInterval.value = value
-    }
-
-    provide('setAnimating', setAnimating)
-    provide('setCustomInterval', setCustomInterval)
-
-    const pause = () => timeout.value && clearInterval(timeout.value)
-
-    const cycle = () => {
-      pause()
-      if (typeof props.interval === 'number') {
-        timeout.value = setTimeout(
-          () => nextItemWhenVisible(),
-          typeof customInterval.value === 'number' ? customInterval.value : props.interval,
-        )
-      }
-    }
-
-    const handleControlClick = (_direction: string) => {
-      if (animating.value) {
-        return
-      }
-      direction.value = _direction
-      if (_direction === 'next') {
-        active.value === items.value.length - 1 ? (active.value = 0) : active.value++
-      } else {
-        active.value === 0 ? (active.value = items.value.length - 1) : active.value--
-      }
-    }
-
-    const nextItemWhenVisible = () => {
-      // Don't call next when the page isn't visible
-      // or the carousel or its parent isn't visible
-      if (!document.hidden && carouselRef.value && isInViewport(carouselRef.value)) {
-        handleControlClick('next')
-      }
-    }
-
-    const handleIndicatorClick = (index: number) => {
-      if (active.value === index) {
-        return
-      }
-
-      if (active.value < index) {
-        direction.value = 'next'
-        active.value = index
-        return
-      }
-
-      if (active.value > index) {
-        direction.value = 'prev'
-        active.value = index
-      }
-    }
-
-    const handleScroll = () => {
-      visible.value =
-        !document.hidden && carouselRef.value && isInViewport(carouselRef.value) ? true : false
-    }
-
-    onBeforeMount(() => {
-      if (slots.default) {
-        const children =
-          typeof slots.default()[0].type === 'symbol'
-            ? slots.default()[0].children
-            : slots.default()
-
-        if (children && Array.isArray(children)) {
-          // @ts-expect-error TODO: fix types
-          items.value = children.filter((child) => child.type.name === 'CCarouselItem')
-        }
-      }
-    })
-
-    onMounted(() => {
-      window.addEventListener('scroll', handleScroll)
-    })
-
-    onUpdated(() => {
-      watch(animating, () => {
-        if (props.wrap) {
-          !animating.value && cycle()
-          return
-        }
-
-        if (!props.wrap && active.value < items.value.length - 1) {
-          !animating.value && cycle()
-        }
-      })
-    })
-
-    watch(visible, () => {
-      visible.value && cycle()
-    })
-
-    return () =>
-      h(
-        'div',
-        {
-          class: ['carousel slide', props.transition === 'crossfade' && 'carousel-fade'],
-          ...(props.dark && { 'data-coreui-theme': 'dark' }),
-          onmouseover: () => props.pause && pause(),
-          onmouseleave: () => cycle(),
-          ref: carouselRef,
-        },
-        [
-          props.indicators &&
-            h(
-              'div',
-              {
-                class: 'carousel-indicators',
-              },
-              items.value.map((_, index) => {
-                return h('button', {
-                  type: 'button',
-                  id: index,
-                  'data-coreui-target': '',
-                  ...(active.value === index && { class: 'active' }),
-                  onClick: () => handleIndicatorClick(index),
-                })
-              }),
-            ),
-          h(
-            'div',
-            { class: 'carousel-inner' },
-            items.value.map((item, index) => {
-              return h(item, {
-                active: active.value === index ? true : false,
-                direction: direction.value,
-              })
-            }),
-          ),
-          props.controls && [
-            h(
-              'button',
-              {
-                type: 'button',
-                class: 'carousel-control-prev',
-                'data-coreui-target': '',
-                onClick: () => handleControlClick('prev'),
-              },
-              [
-                h('span', { class: 'carousel-control-prev-icon', ariaHidden: 'true' }),
-                h('span', { class: 'visually-hidden' }, 'Previous'),
-              ],
-            ),
-            h(
-              'button',
-              {
-                type: 'button',
-                class: 'carousel-control-next',
-                'data-coreui-target': '',
-                onClick: () => handleControlClick('next'),
-              },
-              [
-                h('span', { class: 'carousel-control-next-icon', ariaHidden: 'true' }),
-                h('span', { class: 'visually-hidden' }, 'Next'),
-              ],
-            ),
-          ],
-        ],
-      )
-  },
-})
-export { CCarousel }
diff --git a/packages/coreui-vue/src/components/carousel/CCarouselCaption.ts b/packages/coreui-vue/src/components/carousel/CCarouselCaption.ts
deleted file mode 100644
index 11753412..00000000
--- a/packages/coreui-vue/src/components/carousel/CCarouselCaption.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CCarouselCaption = defineComponent({
-  name: 'CCarouselCaption',
-  setup(_, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: 'carousel-caption',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-export { CCarouselCaption }
diff --git a/packages/coreui-vue/src/components/carousel/CCarouselItem.ts b/packages/coreui-vue/src/components/carousel/CCarouselItem.ts
deleted file mode 100644
index a83022f6..00000000
--- a/packages/coreui-vue/src/components/carousel/CCarouselItem.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { defineComponent, h, inject, ref, toRefs, watch } from 'vue'
-
-const CCarouselItem = defineComponent({
-  name: 'CCarouselItem',
-  props: {
-    /**
-     * @ignore
-     */
-    active: {
-      type: Boolean,
-      default: false,
-    },
-    /**
-     * @ignore
-     */
-    direction: {
-      type: String,
-      default: 'next',
-    },
-    /**
-     * The amount of time to delay between automatically cycling an item.
-     */
-    interval: {
-      type: [Boolean, Number],
-      default: false,
-    },
-  },
-  setup(props, { slots }) {
-    const carouselItemRef = ref()
-    const { active } = toRefs(props)
-    const directionClassName = ref()
-    const orderClassName = ref()
-    const activeClassName = ref(active.value && 'active')
-
-    // eslint-disable-next-line no-unused-vars
-    const setAnimating = inject('setAnimating') as (value: boolean) => void
-    // eslint-disable-next-line no-unused-vars
-    const setCustomInterval = inject('setCustomInterval') as (value: boolean | number) => void
-
-    watch(active, (active, prevActive) => {
-      active && setCustomInterval(props.interval)
-      if (!prevActive && active) {
-        orderClassName.value = `carousel-item-${props.direction}`
-        setCustomInterval(props.interval)
-      }
-      setTimeout(() => {
-        if (prevActive && !active) {
-          activeClassName.value = 'active'
-        }
-        directionClassName.value = `carousel-item-${props.direction === 'next' ? 'start' : 'end'}`
-      }, 0)
-
-      carouselItemRef.value.addEventListener('transitionstart', () => {
-        setAnimating(true)
-      })
-
-      carouselItemRef.value.addEventListener('transitionend', () => {
-        setAnimating(false)
-
-        if (active) {
-          directionClassName.value = ''
-          orderClassName.value = ''
-          activeClassName.value = 'active'
-        }
-        if (!active) {
-          directionClassName.value = ''
-          orderClassName.value = ''
-          activeClassName.value = ''
-        }
-      })
-    })
-
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'carousel-item',
-            activeClassName.value,
-            directionClassName.value,
-            orderClassName.value,
-          ],
-          ref: carouselItemRef,
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-export { CCarouselItem }
diff --git a/packages/coreui-vue/src/components/carousel/__tests__/CCarousel.spec.ts b/packages/coreui-vue/src/components/carousel/__tests__/CCarousel.spec.ts
deleted file mode 100644
index a651b682..00000000
--- a/packages/coreui-vue/src/components/carousel/__tests__/CCarousel.spec.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCarousel as Component } from '../../../index'
-//import { CCarouselItem } from '../../../index'
-
-// TODO: Add test with CCarouselItem inside CCarousel
-
-const ComponentName = 'CCarousel'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    controls: true,
-    dark: true,
-    index: 1,
-    indicators: true,
-    interval: 3000,
-    transition: 'crossfade',
-  },
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('carousel')).toBe(true)
-    expect(defaultWrapper.classes('slide')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('PreviousNext')
-    expect(customWrapper.classes('carousel')).toBe(true)
-    expect(customWrapper.classes('slide')).toBe(true)
-    expect(customWrapper.classes('carousel-fade')).toBe(true)
-    expect(customWrapper.classes('carousel-dark')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/carousel/__tests__/CCarouselCaption.spec.ts b/packages/coreui-vue/src/components/carousel/__tests__/CCarouselCaption.spec.ts
deleted file mode 100644
index 3b360788..00000000
--- a/packages/coreui-vue/src/components/carousel/__tests__/CCarouselCaption.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCarouselCaption as Component } from '../../../index'
-
-const ComponentName = 'CCarouselCaption'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('carousel-caption')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/carousel/__tests__/CCarouselItem.spec.ts b/packages/coreui-vue/src/components/carousel/__tests__/CCarouselItem.spec.ts
deleted file mode 100644
index 6e3b2270..00000000
--- a/packages/coreui-vue/src/components/carousel/__tests__/CCarouselItem.spec.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCarouselItem as Component } from '../../../index'
-import { nextTick } from 'vue'
-
-const ComponentName = 'CCarouselItem'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    direction: 'prev',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('carousel-item')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('carousel-item')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('carousel-item-end')).toBe(false)
-    expect(customWrapper.classes('carousel-item-prev')).toBe(false)
-    customWrapper.setProps({
-      active: false,
-    })
-    expect(customWrapper.classes('carousel-item')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('carousel-item-end')).toBe(false)
-    expect(customWrapper.classes('carousel-item-prev')).toBe(false)
-    nextTick()
-    setTimeout(() => {
-      expect(customWrapper.classes('carousel-item')).toBe(true)
-      expect(customWrapper.classes('active')).toBe(true)
-      expect(customWrapper.classes('carousel-item-end')).toBe(true)
-      expect(customWrapper.classes('carousel-item-prev')).toBe(true)
-    }, 2)
-    customWrapper.setProps({
-      active: true,
-    })
-    expect(customWrapper.classes('carousel-item')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('carousel-item-end')).toBe(false)
-    expect(customWrapper.classes('carousel-item-prev')).toBe(false)
-    nextTick()
-    setTimeout(() => {
-      expect(customWrapper.classes('carousel-item')).toBe(true)
-      expect(customWrapper.classes('active')).toBe(true)
-      expect(customWrapper.classes('carousel-item-end')).toBe(true)
-      expect(customWrapper.classes('carousel-item-prev')).toBe(true)
-    }, 2)
-    //expect(customWrapper.classes('carousel-item-end')).toBe(true)
-    //expect(customWrapper.classes('carousel-item-prev')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarousel.spec.ts.snap b/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarousel.spec.ts.snap
deleted file mode 100644
index 1798375d..00000000
--- a/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarousel.spec.ts.snap
+++ /dev/null
@@ -1,16 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCarousel component renders correctly 1`] = `
-"<div class="carousel slide carousel-fade" data-coreui-theme="dark">
-  <div class="carousel-indicators"></div>
-  <div class="carousel-inner"></div><button type="button" class="carousel-control-prev" data-coreui-target=""><span class="carousel-control-prev-icon" ariahidden="true"></span><span class="visually-hidden">Previous</span></button><button type="button" class="carousel-control-next" data-coreui-target=""><span class="carousel-control-next-icon" ariahidden="true"></span><span class="visually-hidden">Next</span></button>
-</div>"
-`;
-
-exports[`Loads and display CCarousel component renders correctly 1`] = `
-"<div class="carousel slide">
-  <!---->
-  <div class="carousel-inner"></div>
-  <!---->
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarouselCaption.spec.ts.snap b/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarouselCaption.spec.ts.snap
deleted file mode 100644
index cdb87682..00000000
--- a/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarouselCaption.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCarouselCaption component renders correctly 1`] = `"<div class="carousel-caption">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarouselItem.spec.ts.snap b/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarouselItem.spec.ts.snap
deleted file mode 100644
index aa272697..00000000
--- a/packages/coreui-vue/src/components/carousel/__tests__/__snapshots__/CCarouselItem.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCarouselItem component renders correctly 1`] = `"<div class="carousel-item active">Default slot</div>"`;
-
-exports[`Loads and display CCarouselItem component renders correctly 1`] = `"<div class="carousel-item">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/carousel/index.ts b/packages/coreui-vue/src/components/carousel/index.ts
deleted file mode 100644
index 59566ee8..00000000
--- a/packages/coreui-vue/src/components/carousel/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { App } from 'vue'
-import { CCarousel } from './CCarousel'
-import { CCarouselCaption } from './CCarouselCaption'
-import { CCarouselItem } from './CCarouselItem'
-
-const CCarouselPlugin = {
-  install: (app: App): void => {
-    app.component(CCarousel.name as string, CCarousel)
-    app.component(CCarouselCaption.name as string, CCarouselCaption)
-    app.component(CCarouselItem.name as string, CCarouselItem)
-  },
-}
-
-export { CCarouselPlugin, CCarousel, CCarouselCaption, CCarouselItem }
diff --git a/packages/coreui-vue/src/components/close-button/CCloseButton.ts b/packages/coreui-vue/src/components/close-button/CCloseButton.ts
deleted file mode 100644
index 0ddcc4a4..00000000
--- a/packages/coreui-vue/src/components/close-button/CCloseButton.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-export const CCloseButton = defineComponent({
-  name: 'CCloseButton',
-  props: {
-    /**
-     * Invert the default color.
-     */
-    dark: Boolean,
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * Change the default color to white.
-     */
-    white: Boolean,
-  },
-  emits: [
-    /**
-     * Event called when the user clicks on the component.
-     */
-    'click',
-  ],
-  setup(props, { emit }) {
-    const handleClick = () => {
-      if (props.disabled) {
-        return
-      }
-
-      emit('click')
-    }
-    return () =>
-      h('button', {
-        type: 'button',
-        class: [
-          'btn',
-          'btn-close',
-          {
-            ['btn-close-white']: props.white,
-          },
-          props.disabled,
-        ],
-        'aria-label': 'Close',
-        disabled: props.disabled,
-        ...(props.dark && { 'data-coreui-theme': 'dark' }),
-        onClick: handleClick,
-      })
-  },
-})
diff --git a/packages/coreui-vue/src/components/close-button/__tests__/CCloseButton.spec.ts b/packages/coreui-vue/src/components/close-button/__tests__/CCloseButton.spec.ts
deleted file mode 100644
index ea76ee3e..00000000
--- a/packages/coreui-vue/src/components/close-button/__tests__/CCloseButton.spec.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCloseButton as Component } from '../../../index'
-
-const ComponentName = 'CCloseButton'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    disabled: true,
-    white: true,
-  },
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('btn')).toBe(true)
-    expect(defaultWrapper.classes('btn-close')).toBe(true)
-  })
-  it('emit on click', () => {
-    defaultWrapper.trigger('click')
-    const incrementEvent = defaultWrapper.emitted('click')
-    expect(incrementEvent).toHaveLength(1)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('btn')).toBe(true)
-    expect(customWrapper.classes('btn-close')).toBe(true)
-    expect(customWrapper.classes('btn-close-white')).toBe(true)
-    expect(customWrapper.attributes('aria-label')).toBe('Close')
-    expect(customWrapper.attributes('disabled')).toBe('')
-  })
-})
diff --git a/packages/coreui-vue/src/components/close-button/__tests__/__snapshots__/CCloseButton.spec.ts.snap b/packages/coreui-vue/src/components/close-button/__tests__/__snapshots__/CCloseButton.spec.ts.snap
deleted file mode 100644
index 09672fff..00000000
--- a/packages/coreui-vue/src/components/close-button/__tests__/__snapshots__/CCloseButton.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCloseButton component renders correctly 1`] = `"<button type="button" class="btn btn-close btn-close-white" aria-label="Close" disabled=""></button>"`;
-
-exports[`Loads and display CCloseButton component renders correctly 1`] = `"<button type="button" class="btn btn-close" aria-label="Close"></button>"`;
diff --git a/packages/coreui-vue/src/components/close-button/index.ts b/packages/coreui-vue/src/components/close-button/index.ts
deleted file mode 100644
index 7445eb8f..00000000
--- a/packages/coreui-vue/src/components/close-button/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CCloseButton } from './CCloseButton'
-
-const CCloseButtonPlugin = {
-  install: (app: App): void => {
-    app.component(CCloseButton.name as string, CCloseButton)
-  },
-}
-
-export { CCloseButtonPlugin, CCloseButton }
diff --git a/packages/coreui-vue/src/components/collapse/CCollapse.ts b/packages/coreui-vue/src/components/collapse/CCollapse.ts
deleted file mode 100644
index c495f147..00000000
--- a/packages/coreui-vue/src/components/collapse/CCollapse.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-import { defineComponent, h, Transition, ref, RendererElement, withDirectives } from 'vue'
-
-import { vVisible } from '../../directives/v-c-visible'
-import { executeAfterTransition } from '../../utils/transition'
-
-const CCollapse = defineComponent({
-  name: 'CCollapse',
-  props: {
-    /**
-     * Set horizontal collapsing to transition the width instead of height.
-     */
-    horizontal: Boolean,
-    /**
-     * Toggle the visibility of component.
-     */
-    visible: Boolean,
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { slots, emit }) {
-    const collapsing = ref(false)
-    const show = ref(props.visible)
-
-    const handleBeforeEnter = () => {
-      collapsing.value = true
-    }
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      emit('show')
-      // collapsing.value = true
-      setTimeout(() => {
-        executeAfterTransition(() => done(), el as HTMLElement)
-        if (props.horizontal) {
-          el.style.width = `${el.scrollWidth}px`
-          return
-        }
-        el.style.height = `${el.scrollHeight}px`
-      }, 1)
-    }
-
-    const handleAfterEnter = (el: RendererElement) => {
-      show.value = true
-      collapsing.value = false
-      props.horizontal ? el.style.removeProperty('width') : el.style.removeProperty('height')
-    }
-
-    const handleBeforeLeave = (el: RendererElement) => {
-      collapsing.value = true
-      show.value = false
-      if (props.horizontal) {
-        el.style.width = `${el.scrollWidth}px`
-        return
-      }
-      el.style.height = `${el.scrollHeight}px`
-    }
-
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      emit('hide')
-      setTimeout(() => {
-        executeAfterTransition(() => done(), el as HTMLElement)
-        if (props.horizontal) {
-          el.style.width = '0px'
-          return
-        }
-        el.style.height = '0px'
-      }, 1)
-    }
-
-    const handleAfterLeave = (el: RendererElement) => {
-      collapsing.value = false
-      props.horizontal ? el.style.removeProperty('width') : el.style.removeProperty('height')
-    }
-
-    return () =>
-      h(
-        Transition,
-        {
-          css: false,
-          onBeforeEnter: () => handleBeforeEnter(),
-          onEnter: (el, done) => handleEnter(el, done),
-          onAfterEnter: (el) => handleAfterEnter(el),
-          onBeforeLeave: (el) => handleBeforeLeave(el),
-          onLeave: (el, done) => handleLeave(el, done),
-          onAfterLeave: (el) => handleAfterLeave(el),
-        },
-        () =>
-          withDirectives(
-            h(
-              'div',
-              {
-                class: [
-                  collapsing.value ? 'collapsing' : 'collapse',
-                  { 'collapse-horizontal': props.horizontal, show: show.value },
-                ],
-              },
-              slots.default && slots.default(),
-            ),
-            [[vVisible, props.visible]],
-          ),
-      )
-  },
-})
-
-export { CCollapse }
diff --git a/packages/coreui-vue/src/components/collapse/__test__/CCollapse.spec.ts b/packages/coreui-vue/src/components/collapse/__test__/CCollapse.spec.ts
deleted file mode 100644
index ddb6f4fe..00000000
--- a/packages/coreui-vue/src/components/collapse/__test__/CCollapse.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCollapse as Component } from '../../../index'
-
-const ComponentName = 'CCollapse'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('div').classes('collapse')).toBe(true)
-  })
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('div').classes('collapse')).toBe(true)
-    expect(customWrapper.find('div').classes('show')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/collapse/__test__/__snapshots__/CCollapse.spec.ts.snap b/packages/coreui-vue/src/components/collapse/__test__/__snapshots__/CCollapse.spec.ts.snap
deleted file mode 100644
index 0bab1aef..00000000
--- a/packages/coreui-vue/src/components/collapse/__test__/__snapshots__/CCollapse.spec.ts.snap
+++ /dev/null
@@ -1,13 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CCollapse component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="false">
-  <div class="collapse">Default slot</div>
-</transition-stub>"
-`;
-
-exports[`Loads and display CCollapse component renders correctly 2`] = `
-"<transition-stub appear="false" persisted="false" css="false">
-  <div class="collapse show">Default slot</div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/collapse/index.ts b/packages/coreui-vue/src/components/collapse/index.ts
deleted file mode 100644
index 2c6ccd7c..00000000
--- a/packages/coreui-vue/src/components/collapse/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CCollapse } from './CCollapse'
-
-const CCollapsePlugin = {
-  install: (app: App): void => {
-    app.component(CCollapse.name as string, CCollapse)
-  },
-}
-
-export { CCollapsePlugin, CCollapse }
diff --git a/packages/coreui-vue/src/components/conditional-teleport/CConditionalTeleport.ts b/packages/coreui-vue/src/components/conditional-teleport/CConditionalTeleport.ts
deleted file mode 100644
index 9207fb9a..00000000
--- a/packages/coreui-vue/src/components/conditional-teleport/CConditionalTeleport.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { defineComponent, h, PropType, ref, Teleport, watch } from 'vue'
-
-const getContainer = (
-  container?: HTMLElement | (() => HTMLElement) | string,
-): HTMLElement | string => {
-  if (container) {
-    return typeof container === 'function' ? container() : container
-  }
-
-  return 'body'
-}
-
-const CConditionalTeleport = defineComponent({
-  name: 'CConditionalTeleport',
-  props: {
-    /**
-     * An HTML element or function that returns a single element, with `document.body` as the default.
-     *
-     * @since 5.0.0
-     */
-    container: {
-      type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
-      default: 'body',
-    },
-    /**
-     * Render some children into a different part of the DOM
-     */
-    teleport: {
-      type: [Boolean],
-      default: true,
-    },
-  },
-  setup(props, { slots }) {
-    const container = ref<HTMLElement | string>(getContainer(props.container))
-
-    watch(
-      () => [props.container, props.teleport],
-      () => {
-        if (props.teleport) {
-          container.value = getContainer(props.container)
-        }
-      },
-    )
-
-    return () =>
-      h(
-        Teleport,
-        {
-          disabled: props.teleport === false,
-          to: container.value,
-        },
-        {
-          default: () => slots.default && slots.default(),
-        },
-      )
-  },
-})
-export { CConditionalTeleport }
diff --git a/packages/coreui-vue/src/components/conditional-teleport/index.ts b/packages/coreui-vue/src/components/conditional-teleport/index.ts
deleted file mode 100644
index 538edf16..00000000
--- a/packages/coreui-vue/src/components/conditional-teleport/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CConditionalTeleport } from './CConditionalTeleport'
-
-const CConditionalTeleportPlugin = {
-  install: (app: App): void => {
-    app.component(CConditionalTeleport.name as string, CConditionalTeleport)
-  },
-}
-
-export { CConditionalTeleport, CConditionalTeleportPlugin }
diff --git a/packages/coreui-vue/src/components/dropdown/CDropdown.ts b/packages/coreui-vue/src/components/dropdown/CDropdown.ts
deleted file mode 100644
index 679e5d6f..00000000
--- a/packages/coreui-vue/src/components/dropdown/CDropdown.ts
+++ /dev/null
@@ -1,310 +0,0 @@
-import { defineComponent, h, ref, provide, watch, PropType } from 'vue'
-import type { Placement } from '@popperjs/core'
-
-import { usePopper } from '../../composables'
-import type { Triggers } from '../../types'
-import { getNextActiveElement, isRTL } from '../../utils'
-
-import type { Alignments } from './types'
-import { getPlacement } from './utils'
-
-const CDropdown = defineComponent({
-  name: 'CDropdown',
-  props: {
-    /**
-     * Set aligment of dropdown menu.
-     *
-     * @values { 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'} }
-     */
-    alignment: {
-      type: [String, Object] as PropType<string | Alignments>,
-      // eslint-disable-next-line @typescript-eslint/no-explicit-any
-      validator: (value: string | any) => {
-        if (value === 'start' || value === 'end') {
-          return true
-        } else {
-          if (value.xs !== undefined && (value.xs === 'start' || value.xs === 'end')) {
-            return true
-          }
-          if (value.sm !== undefined && (value.sm === 'start' || value.sm === 'end')) {
-            return true
-          }
-          if (value.md !== undefined && (value.md === 'start' || value.md === 'end')) {
-            return true
-          }
-          if (value.lg !== undefined && (value.lg === 'start' || value.lg === 'end')) {
-            return true
-          }
-          if (value.xl !== undefined && (value.xl === 'start' || value.xl === 'end')) {
-            return true
-          }
-          if (value.xxl !== undefined && (value.xxl === 'start' || value.xxl === 'end')) {
-            return true
-          }
-          return false
-        }
-      },
-    },
-    /**
-     * Configure the auto close behavior of the dropdown:
-     * - `true` - the dropdown will be closed by clicking outside or inside the dropdown menu.
-     * - `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 esc key)
-     * - `'inside'` - the dropdown will be closed (only) by clicking inside the dropdown menu.
-     * - `'outside'` - the dropdown will be closed (only) by clicking outside the dropdown menu.
-     */
-    autoClose: {
-      type: [Boolean, String],
-      default: true,
-      validator: (value: boolean | string) => {
-        return typeof value === 'boolean' || ['inside', 'outside'].includes(value)
-      },
-    },
-    /**
-     * Appends the vue dropdown menu to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
-     *
-     * @since 5.0.0
-     */
-    container: {
-      type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
-      default: 'body',
-    },
-    /**
-     * Sets a darker color scheme to match a dark navbar.
-     */
-    dark: Boolean,
-    /**
-     * Sets a specified  direction and location of the dropdown menu.
-     *
-     * @values 'center', 'dropup', 'dropup-center', 'dropend', 'dropstart'
-     */
-    direction: {
-      type: String,
-      validator: (value: string) => {
-        return ['center', 'dropup', 'dropup-center', 'dropend', 'dropstart'].includes(value)
-      },
-    },
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * Offset of the dropdown menu relative to its target.
-     *
-     * @since 4.9.0
-     */
-    offset: {
-      type: Array,
-      default: () => [0, 2],
-    },
-    /**
-     * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.
-     *
-     * @values 'auto', 'top-end', 'top', 'top-start', 'bottom-end', 'bottom', 'bottom-start', 'right-start', 'right', 'right-end', 'left-start', 'left', 'left-end'
-     */
-    placement: {
-      type: String as PropType<Placement>,
-      default: 'bottom-start',
-    },
-    /**
-     * If you want to disable dynamic positioning set this property to `true`.
-     */
-    popper: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Generates dropdown menu using Teleport.
-     *
-     * @since 5.0.0
-     */
-    teleport: {
-      type: Boolean,
-      default: false,
-    },
-    /**
-     * Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.
-     */
-    trigger: {
-      type: String as PropType<Triggers>,
-      default: 'click',
-    },
-    /**
-     * Set the dropdown variant to an btn-group, dropdown, input-group, and nav-item.
-     *
-     * @values 'btn-group', 'dropdown', 'input-group', 'nav-item'
-     */
-    variant: {
-      type: String,
-      default: 'btn-group',
-      validator: (value: string) => {
-        return ['btn-group', 'dropdown', 'input-group', 'nav-item'].includes(value)
-      },
-    },
-    /**
-     * Toggle the visibility of dropdown menu component.
-     */
-    visible: Boolean,
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { slots, emit }) {
-    const dropdownToggleRef = ref()
-    const dropdownMenuRef = ref()
-    const popper = ref(typeof props.alignment === 'object' ? false : props.popper)
-    const visible = ref(props.visible)
-
-    const { initPopper, destroyPopper } = usePopper()
-
-    const popperConfig = {
-      modifiers: [
-        {
-          name: 'offset',
-          options: {
-            offset: props.offset,
-          },
-        },
-      ],
-      placement: getPlacement(
-        props.placement,
-        props.direction,
-        props.alignment,
-        isRTL(dropdownMenuRef.value),
-      ) as Placement,
-    }
-
-    watch(
-      () => props.visible,
-      () => {
-        visible.value = props.visible
-      },
-    )
-
-    watch(visible, () => {
-      if (visible.value && dropdownToggleRef.value && dropdownMenuRef.value) {
-        popper.value && initPopper(dropdownToggleRef.value, dropdownMenuRef.value, popperConfig)
-        window.addEventListener('mouseup', handleMouseUp)
-        window.addEventListener('keyup', handleKeyup)
-        dropdownToggleRef.value.addEventListener('keydown', handleKeydown)
-        dropdownMenuRef.value.addEventListener('keydown', handleKeydown)
-        emit('show')
-        return
-      }
-
-      popper.value && destroyPopper()
-      window.removeEventListener('mouseup', handleMouseUp)
-      window.removeEventListener('keyup', handleKeyup)
-      dropdownToggleRef.value &&
-        dropdownToggleRef.value.removeEventListener('keydown', handleKeydown)
-      dropdownMenuRef.value && dropdownMenuRef.value.removeEventListener('keydown', handleKeydown)
-      emit('hide')
-    })
-
-    provide('config', {
-      alignment: props.alignment,
-      container: props.container,
-      dark: props.dark,
-      popper: props.popper,
-      teleport: props.teleport,
-    })
-
-    provide('variant', props.variant)
-    provide('visible', visible)
-    provide('dropdownToggleRef', dropdownToggleRef)
-    provide('dropdownMenuRef', dropdownMenuRef)
-
-    const handleKeydown = (event: KeyboardEvent) => {
-      if (
-        visible.value &&
-        dropdownMenuRef.value &&
-        (event.key === 'ArrowDown' || event.key === 'ArrowUp')
-      ) {
-        event.preventDefault()
-        const target = event.target as HTMLElement
-        // eslint-disable-next-line unicorn/prefer-spread
-        const items: HTMLElement[] = Array.from(
-          dropdownMenuRef.value.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)'),
-        )
-        getNextActiveElement(items, target, event.key === 'ArrowDown', true).focus()
-      }
-    }
-
-    const handleKeyup = (event: KeyboardEvent) => {
-      if (props.autoClose === false) {
-        return
-      }
-
-      if (event.key === 'Escape') {
-        setVisible(false)
-      }
-    }
-
-    const handleMouseUp = (event: Event) => {
-      if (!dropdownToggleRef.value || !dropdownMenuRef.value) {
-        return
-      }
-
-      if (dropdownToggleRef.value.contains(event.target as HTMLElement)) {
-        return
-      }
-
-      if (
-        props.autoClose === true ||
-        (props.autoClose === 'inside' &&
-          dropdownMenuRef.value.contains(event.target as HTMLElement)) ||
-        (props.autoClose === 'outside' &&
-          !dropdownMenuRef.value.contains(event.target as HTMLElement))
-      ) {
-        setVisible(false)
-        return
-      }
-    }
-
-    const setVisible = (_visible?: boolean) => {
-      if (props.disabled) {
-        return
-      }
-
-      if (typeof _visible == 'boolean') {
-        visible.value = _visible
-        return
-      }
-
-      if (visible.value === true) {
-        visible.value = false
-        return
-      }
-
-      visible.value = true
-    }
-
-    provide('setVisible', setVisible)
-
-    return () =>
-      props.variant === 'input-group'
-        ? [slots.default && slots.default()]
-        : h(
-            'div',
-            {
-              class: [
-                props.variant === 'nav-item' ? 'nav-item dropdown' : props.variant,
-                props.direction === 'center'
-                  ? 'dropdown-center'
-                  : props.direction === 'dropup-center'
-                  ? 'dropup dropup-center'
-                  : props.direction,
-              ],
-            },
-            slots.default && slots.default(),
-          )
-  },
-})
-
-export { CDropdown }
diff --git a/packages/coreui-vue/src/components/dropdown/CDropdownDivider.ts b/packages/coreui-vue/src/components/dropdown/CDropdownDivider.ts
deleted file mode 100644
index 9a17307b..00000000
--- a/packages/coreui-vue/src/components/dropdown/CDropdownDivider.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CDropdownDivider = defineComponent({
-  name: 'CDropdownDivider',
-  setup() {
-    return () =>
-      h('hr', {
-        class: 'dropdown-divider',
-      })
-  },
-})
-
-export { CDropdownDivider }
diff --git a/packages/coreui-vue/src/components/dropdown/CDropdownHeader.ts b/packages/coreui-vue/src/components/dropdown/CDropdownHeader.ts
deleted file mode 100644
index ea630404..00000000
--- a/packages/coreui-vue/src/components/dropdown/CDropdownHeader.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CDropdownHeader = defineComponent({
-  name: 'CDropdownHeader',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'h6',
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: 'dropdown-header',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CDropdownHeader }
diff --git a/packages/coreui-vue/src/components/dropdown/CDropdownItem.ts b/packages/coreui-vue/src/components/dropdown/CDropdownItem.ts
deleted file mode 100644
index 49b1ea68..00000000
--- a/packages/coreui-vue/src/components/dropdown/CDropdownItem.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CLink } from '../link/CLink'
-
-const CDropdownItem = defineComponent({
-  name: 'CDropdownItem',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'a',
-    },
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: String,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CLink,
-        {
-          class: 'dropdown-item',
-          active: props.active,
-          as: props.as,
-          disabled: props.disabled,
-          href: props.href,
-        },
-        {
-          default: () => slots.default && slots.default(),
-        },
-      )
-  },
-})
-
-export { CDropdownItem }
diff --git a/packages/coreui-vue/src/components/dropdown/CDropdownMenu.ts b/packages/coreui-vue/src/components/dropdown/CDropdownMenu.ts
deleted file mode 100644
index 29791bac..00000000
--- a/packages/coreui-vue/src/components/dropdown/CDropdownMenu.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { defineComponent, h, inject, Ref } from 'vue'
-
-import { CConditionalTeleport } from '../conditional-teleport'
-import { getAlignmentClassNames } from './utils'
-
-const CDropdownMenu = defineComponent({
-  name: 'CDropdownMenu',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     *
-     * @values 'div', 'ul'
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-  },
-  setup(props, { attrs, slots }) {
-    const dropdownMenuRef = inject('dropdownMenuRef') as Ref<HTMLElement>
-    const config = inject('config') as any // eslint-disable-line @typescript-eslint/no-explicit-any
-    const visible = inject('visible') as Ref<boolean>
-
-    const { alignment, container, dark, popper, teleport } = config
-
-    return () =>
-      h(
-        CConditionalTeleport,
-        {
-          container: container,
-          teleport: teleport,
-        },
-        {
-          default: () =>
-            h(
-              props.as,
-              {
-                ...attrs,
-                class: [
-                  'dropdown-menu',
-                  { show: visible.value },
-                  getAlignmentClassNames(alignment),
-                  attrs.class,
-                ],
-                ...((typeof alignment === 'object' || !popper) && {
-                  'data-coreui-popper': 'static',
-                }),
-                ...(dark && { 'data-coreui-theme': 'dark' }),
-                ref: dropdownMenuRef,
-              },
-              props.as === 'ul'
-                ? slots.default && slots.default().map((vnode) => h('li', {}, vnode))
-                : slots.default && slots.default(),
-            ),
-        },
-      )
-  },
-})
-
-export { CDropdownMenu }
diff --git a/packages/coreui-vue/src/components/dropdown/CDropdownToggle.ts b/packages/coreui-vue/src/components/dropdown/CDropdownToggle.ts
deleted file mode 100644
index 17fd034b..00000000
--- a/packages/coreui-vue/src/components/dropdown/CDropdownToggle.ts
+++ /dev/null
@@ -1,197 +0,0 @@
-import {
-  cloneVNode,
-  computed,
-  defineComponent,
-  h,
-  inject,
-  onMounted,
-  PropType,
-  Ref,
-  ref,
-} from 'vue'
-
-import { CButton } from '../button'
-
-import { Color, Shape } from '../../props'
-import type { Triggers } from '../../types'
-
-const CDropdownToggle = defineComponent({
-  name: 'CDropdownToggle',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'button',
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Enables pseudo element caret on toggler.
-     */
-    caret: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Create a custom toggler which accepts any content.
-     */
-    custom: Boolean,
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * If a dropdown `variant` is set to `nav-item` then render the toggler as a link instead of a button.
-     *
-     * @since 5.0.0
-     */
-    navLink: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * @values 'rounded', 'rounded-top', 'rounded-end', 'rounded-bottom', 'rounded-start', 'rounded-circle', 'rounded-pill', 'rounded-0', 'rounded-1', 'rounded-2', 'rounded-3'
-     */
-    shape: Shape,
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm', 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-    /**
-     * Similarly, create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of `.dropdown-toggle-split` className for proper spacing around the dropdown caret.
-     */
-    split: Boolean,
-    /**
-     * Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.
-     *
-     * @type 'hover' | 'focus' | 'click'
-     */
-    trigger: {
-      type: String as PropType<Triggers>,
-      default: 'click',
-    },
-    /**
-     * Set the button variant to an outlined button or a ghost button.
-     *
-     * @values 'ghost', 'outline'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return ['ghost', 'outline'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    const togglerRef = ref()
-    const dropdownToggleRef = inject('dropdownToggleRef') as Ref<HTMLElement>
-    const dropdownVariant = inject('variant') as string
-    const visible = inject('visible') as Ref<boolean>
-    const setVisible = inject('setVisible') as (_visible?: boolean) => void
-
-    const triggers = {
-      ...((props.trigger === 'click' || props.trigger.includes('click')) && {
-        onClick: (event: Event) => {
-          event.preventDefault()
-          if (props.disabled) {
-            return
-          }
-
-          setVisible()
-        },
-      }),
-      ...((props.trigger === 'focus' || props.trigger.includes('focus')) && {
-        onfocus: () => {
-          if (props.disabled) {
-            return
-          }
-
-          setVisible(true)
-        },
-        onblur: () => {
-          if (props.disabled) {
-            return
-          }
-          setVisible(false)
-        },
-      }),
-    }
-
-    const togglerProps = computed(() => {
-      return {
-        class: {
-          'nav-link': dropdownVariant === 'nav-item' && props.navLink,
-          'dropdown-toggle': props.caret,
-          'dropdown-toggle-split': props.split,
-          disabled: props.disabled,
-          show: visible.value,
-        },
-        'aria-expanded': visible.value,
-        ...(!props.disabled && { ...triggers }),
-      }
-    })
-
-    onMounted(() => {
-      if (togglerRef.value) {
-        dropdownToggleRef.value = togglerRef.value.$el
-      }
-    })
-
-    return () =>
-      props.custom
-        ? slots.default &&
-          slots.default().map((slot) =>
-            cloneVNode(slot, {
-              ref: (el) => {
-                togglerRef.value = el
-              },
-              ...triggers,
-            }),
-          )
-        : dropdownVariant === 'nav-item' && props.navLink
-          ? h(
-              'a',
-              {
-                href: '#',
-                ...togglerProps.value,
-                role: 'button',
-                ref: dropdownToggleRef,
-              },
-              { default: () => slots.default && slots.default() },
-            )
-          : h(
-              CButton,
-              {
-                ...togglerProps.value,
-                as: props.as,
-                color: props.color,
-                disabled: props.disabled,
-                shape: props.shape,
-                size: props.size,
-                variant: props.variant,
-                ref: (el) => {
-                  togglerRef.value = el
-                },
-              },
-              () =>
-                props.split
-                  ? h('span', { class: 'visually-hidden' }, 'Toggle Dropdown')
-                  : slots.default && slots.default(),
-            )
-  },
-})
-
-export { CDropdownToggle }
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdown.spec.ts b/packages/coreui-vue/src/components/dropdown/__tests__/CDropdown.spec.ts
deleted file mode 100644
index a71c136b..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdown.spec.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CDropdown as Component } from '../../../index'
-
-const ComponentName = 'CDropdown'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    alignment: { lg: 'end' },
-    dark: true,
-    direction: 'dropend',
-    disabled: true,
-    placement: 'right-start',
-    popper: false,
-    trigger: 'hover',
-    variant: 'nav-item',
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    variant: 'input-group',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('btn-group')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('nav-item')).toBe(true)
-    expect(customWrapper.classes('dropdown')).toBe(true)
-  })
-})
-
-describe(`Customize (variant number two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.text()).toContain('Default slot')
-  })
-})
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownDivider.spec.ts b/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownDivider.spec.ts
deleted file mode 100644
index 584b93ca..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownDivider.spec.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CDropdownDivider as Component } from '../../../index'
-
-const ComponentName = 'CDropdownDivider'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('dropdown-divider')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownHeader.spec.ts b/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownHeader.spec.ts
deleted file mode 100644
index 2401c7e8..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownHeader.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CDropdownHeader as Component } from '../../../index'
-
-const ComponentName = 'CDropdownHeader'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h2',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('dropdown-header')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('dropdown-header')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownItem.spec.ts b/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownItem.spec.ts
deleted file mode 100644
index de5d2b11..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownItem.spec.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CDropdownItem as Component } from '../../../index'
-
-const ComponentName = 'CDropdownItem'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    as: 'div',
-    disabled: true,
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('dropdown-item')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('dropdown-item')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.attributes('href')).toBe('/bazinga')
-  })
-})
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownMenu.spec.ts b/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownMenu.spec.ts
deleted file mode 100644
index 23c7d3d7..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownMenu.spec.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CDropdownMenu as Component } from '../../../index'
-import { ref } from 'vue'
-
-const ComponentName = 'CDropdownMenu'
-
-const config = {
-  alignment: { lg: 'end' },
-  dark: false,
-  popper: true,
-}
-
-const customConfig = {
-  alignment: { lg: 'end' },
-  dark: true,
-  popper: false,
-}
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-  global: {
-    provide: {
-      config: config,
-      dropdownMenuRef: ref(),
-      visible: ref(false),
-    },
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'ul',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-  global: {
-    provide: {
-      config: customConfig,
-      dropdownMenuRef: ref(),
-      visible: ref(true),
-    },
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('dropdown-menu')).toBe(true)
-    expect(defaultWrapper.classes('dropdown-menu-dark')).toBe(false)
-    expect(defaultWrapper.classes('show')).toBe(false)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('li').text()).toContain('Default slot')
-    expect(customWrapper.classes('dropdown-menu')).toBe(true)
-    expect(customWrapper.classes('dropdown-menu-dark')).toBe(true)
-    expect(customWrapper.classes('show')).toBe(true)
-    expect(customWrapper.attributes('data-coreui-popper')).toBe('static')
-  })
-})
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownToggle.spec.ts b/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownToggle.spec.ts
deleted file mode 100644
index 5af217be..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/CDropdownToggle.spec.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CDropdownToggle as Component } from '../../../index'
-import { ref } from 'vue'
-const ComponentName = 'CDropdownToggle'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    disabled: true,
-    variant: 'outline',
-    color: 'warning',
-    size: 'lg',
-    shape: 'rounded-pill',
-    split: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-  global: {
-    provide: {
-      dropdownToggleRef: ref(),
-      variant: 'input-group',
-      visible: ref(true),
-      toggleMenu: function () {
-        return true
-      },
-    },
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    color: 'warning',
-    caret: false,
-    disabled: true,
-    shape: 'rounded-pill',
-    size: 'lg',
-    split: true,
-    variant: 'outline',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-  global: {
-    provide: {
-      dropdownToggleRef: ref(),
-      variant: 'nav-item',
-      visible: ref(true),
-      toggleMenu: function () {
-        return true
-      },
-    },
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('btn')).toBe(true)
-    expect(defaultWrapper.classes('dropdown-toggle')).toBe(true)
-    expect(defaultWrapper.classes('show')).toBe(true)
-    expect(defaultWrapper.classes('btn-outline-warning')).toBe(true)
-    expect(defaultWrapper.classes('btn-lg')).toBe(true)
-    expect(defaultWrapper.classes('rounded-pill')).toBe(true)
-    expect(defaultWrapper.classes('active')).toBe(true)
-    expect(defaultWrapper.classes('disabled')).toBe(true)
-    expect(defaultWrapper.attributes('disabled')).toBe('')
-    expect(defaultWrapper.find('span').classes('visually-hidden')).toBe(true)
-    expect(defaultWrapper.find('span').text()).toContain('Toggle Dropdown')
-  })
-  /*
-    TODO: Make this click test work
-  it('check on click event', () => {
-    expect(flag).toBe(false)
-    defaultWrapper.trigger('click')
-    expect(flag).toBe(true)
-  })
-  */
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('nav-link')).toBe(true)
-    expect(customWrapper.classes('dropdown-toggle-split')).toBe(true)
-    expect(customWrapper.classes('show')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.attributes('disabled')).toBe('true')
-    expect(customWrapper.attributes('href')).toBe('#')
-  })
-})
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap b/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap
deleted file mode 100644
index 9544f410..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (variant number two) CDropdown component renders correctly 1`] = `"Default slot"`;
-
-exports[`Customize CDropdown component renders correctly 1`] = `"<div class="nav-item dropdown dropend">Default slot</div>"`;
-
-exports[`Loads and display CDropdown component renders correctly 1`] = `"<div class="btn-group">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownDivider.spec.ts.snap b/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownDivider.spec.ts.snap
deleted file mode 100644
index 5df2cb63..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownDivider.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CDropdownDivider component renders correctly 1`] = `"<hr class="dropdown-divider">"`;
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownHeader.spec.ts.snap b/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownHeader.spec.ts.snap
deleted file mode 100644
index 6ea81ee4..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownHeader.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CDropdownHeader component renders correctly 1`] = `"<h2 class="dropdown-header">Default slot</h2>"`;
-
-exports[`Loads and display CDropdownHeader component renders correctly 1`] = `"<h6 class="dropdown-header">Default slot</h6>"`;
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownItem.spec.ts.snap b/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownItem.spec.ts.snap
deleted file mode 100644
index 382f0d56..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownItem.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CDropdownItem component renders correctly 1`] = `"<div class="active disabled dropdown-item" aria-current="page" href="/bazinga">Default slot</div>"`;
-
-exports[`Loads and display CDropdownItem component renders correctly 1`] = `"<a class="dropdown-item">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap b/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap
deleted file mode 100644
index 2515aa2b..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap
+++ /dev/null
@@ -1,11 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CDropdownMenu component renders correctly 1`] = `
-"<!--teleport start-->
-<!--teleport end-->"
-`;
-
-exports[`Loads and display CDropdownMenu component renders correctly 1`] = `
-"<!--teleport start-->
-<!--teleport end-->"
-`;
diff --git a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownToggle.spec.ts.snap b/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownToggle.spec.ts.snap
deleted file mode 100644
index 4697a13e..00000000
--- a/packages/coreui-vue/src/components/dropdown/__tests__/__snapshots__/CDropdownToggle.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CDropdownToggle component renders correctly 1`] = `"<a href="#" class="nav-link dropdown-toggle-split disabled show" aria-expanded="true" role="button" active="true">Default slot</a>"`;
-
-exports[`Loads and display CDropdownToggle component renders correctly 1`] = `"<button class="btn btn-outline-warning btn-lg active disabled rounded-pill dropdown-toggle dropdown-toggle-split disabled show" type="button" disabled="" aria-expanded="true"><span class="visually-hidden">Toggle Dropdown</span></button>"`;
diff --git a/packages/coreui-vue/src/components/dropdown/index.ts b/packages/coreui-vue/src/components/dropdown/index.ts
deleted file mode 100644
index aabcfeb8..00000000
--- a/packages/coreui-vue/src/components/dropdown/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { App } from 'vue'
-import { CDropdown } from './CDropdown'
-import { CDropdownItem } from './CDropdownItem'
-import { CDropdownHeader } from './CDropdownHeader'
-import { CDropdownDivider } from './CDropdownDivider'
-import { CDropdownMenu } from './CDropdownMenu'
-import { CDropdownToggle } from './CDropdownToggle'
-
-const CDropdownPlugin = {
-  install: (app: App): void => {
-    app.component(CDropdown.name as string, CDropdown)
-    app.component(CDropdownItem.name as string, CDropdownItem)
-    app.component(CDropdownHeader.name as string, CDropdownHeader)
-    app.component(CDropdownDivider.name as string, CDropdownDivider)
-    app.component(CDropdownMenu.name as string, CDropdownMenu)
-    app.component(CDropdownToggle.name as string, CDropdownToggle)
-  },
-}
-
-export {
-  CDropdownPlugin,
-  CDropdown,
-  CDropdownItem,
-  CDropdownHeader,
-  CDropdownDivider,
-  CDropdownMenu,
-  CDropdownToggle,
-}
diff --git a/packages/coreui-vue/src/components/dropdown/types.ts b/packages/coreui-vue/src/components/dropdown/types.ts
deleted file mode 100644
index 3c68889a..00000000
--- a/packages/coreui-vue/src/components/dropdown/types.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export type Directions = 'start' | 'end'
-
-export type Breakpoints =
-  | { xs: Directions }
-  | { sm: Directions }
-  | { md: Directions }
-  | { lg: Directions }
-  | { xl: Directions }
-  | { xxl: Directions }
-
-export type Alignments = Directions | Breakpoints
diff --git a/packages/coreui-vue/src/components/dropdown/utils.ts b/packages/coreui-vue/src/components/dropdown/utils.ts
deleted file mode 100644
index c9659636..00000000
--- a/packages/coreui-vue/src/components/dropdown/utils.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import type { Placement } from '@popperjs/core'
-import type { Placements } from '../../types'
-import type { Alignments, Breakpoints } from './types'
-
-export const getAlignmentClassNames = (alignment: Alignments) => {
-  const classNames: string[] = []
-  if (typeof alignment === 'object') {
-    for (const key in alignment) {
-      classNames.push(
-        `dropdown-menu${key === 'xs' ? '' : `-${key}`}-${alignment[key as keyof Breakpoints]}`,
-      )
-    }
-  }
-
-  if (typeof alignment === 'string') {
-    classNames.push(`dropdown-menu-${alignment}`)
-  }
-
-  return classNames
-}
-
-export const getPlacement = (
-  placement: Placement,
-  direction: string | undefined,
-  alignment: Alignments | string | undefined,
-  isRTL: boolean,
-): Placements => {
-  let _placement = placement
-
-  if (direction === 'dropup') {
-    _placement = isRTL ? 'top-end' : 'top-start'
-  }
-
-  if (direction === 'dropup-center') {
-    _placement = 'top'
-  }
-
-  if (direction === 'dropend') {
-    _placement = isRTL ? 'left-start' : 'right-start'
-  }
-
-  if (direction === 'dropstart') {
-    _placement = isRTL ? 'right-start' : 'left-start'
-  }
-
-  if (alignment === 'end') {
-    _placement = isRTL ? 'bottom-start' : 'bottom-end'
-  }
-
-  return _placement
-}
diff --git a/packages/coreui-vue/src/components/footer/CFooter.ts b/packages/coreui-vue/src/components/footer/CFooter.ts
deleted file mode 100644
index 3f0d5fd2..00000000
--- a/packages/coreui-vue/src/components/footer/CFooter.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CFooter = defineComponent({
-  name: 'CFooter',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-    /**
-     * Place footer in non-static positions.
-     *
-     * @values 'fixed', 'sticky'
-     */
-    position: {
-      type: String,
-      validator: (value: string) => {
-        return ['fixed', 'sticky'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        { class: ['footer', { [`footer-${props.position}`]: props.position }] },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CFooter }
diff --git a/packages/coreui-vue/src/components/footer/__tests__/CFooter.spec.ts b/packages/coreui-vue/src/components/footer/__tests__/CFooter.spec.ts
deleted file mode 100644
index 35b914ca..00000000
--- a/packages/coreui-vue/src/components/footer/__tests__/CFooter.spec.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFooter as Component } from '../../../index'
-
-const ComponentName = 'CFooter'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    position: 'fixed',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    as: 'footer',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('footer')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('footer')).toBe(true)
-    expect(customWrapper.classes('footer-fixed')).toBe(true)
-  })
-})
-
-describe(`Customize (number two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-
-  it('tag name is custom', () => {
-    expect(customWrapperTwo.element.tagName).toBe('FOOTER')
-  })
-})
diff --git a/packages/coreui-vue/src/components/footer/__tests__/__snapshots__/CFooter.spec.ts.snap b/packages/coreui-vue/src/components/footer/__tests__/__snapshots__/CFooter.spec.ts.snap
deleted file mode 100644
index 1cc66859..00000000
--- a/packages/coreui-vue/src/components/footer/__tests__/__snapshots__/CFooter.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFooter component renders correctly 1`] = `"<div class="footer footer-fixed">Default slot</div>"`;
-
-exports[`Loads and display CFooter component renders correctly 1`] = `"<div class="footer">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/footer/index.ts b/packages/coreui-vue/src/components/footer/index.ts
deleted file mode 100644
index 8bd4edd4..00000000
--- a/packages/coreui-vue/src/components/footer/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CFooter } from './CFooter'
-
-const CFooterPlugin = {
-  install: (app: App): void => {
-    app.component(CFooter.name as string, CFooter)
-  },
-}
-
-export { CFooterPlugin, CFooter }
diff --git a/packages/coreui-vue/src/components/form/CForm.ts b/packages/coreui-vue/src/components/form/CForm.ts
deleted file mode 100644
index 2747caa7..00000000
--- a/packages/coreui-vue/src/components/form/CForm.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CForm = defineComponent({
-  name: 'CForm',
-  props: {
-    /**
-     * Mark a form as validated. If you set it `true`, all validation styles will be applied to the forms component.
-     */
-    validated: Boolean,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'form',
-        { class: [{ ['was-validated']: props.validated }] },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CForm }
diff --git a/packages/coreui-vue/src/components/form/CFormCheck.ts b/packages/coreui-vue/src/components/form/CFormCheck.ts
deleted file mode 100644
index fbdd26fd..00000000
--- a/packages/coreui-vue/src/components/form/CFormCheck.ts
+++ /dev/null
@@ -1,262 +0,0 @@
-import { computed, defineComponent, h } from 'vue'
-
-import { CButton } from '../button'
-import { CFormControlValidation } from './CFormControlValidation'
-import { CFormLabel } from './CFormLabel'
-
-const CFormCheck = defineComponent({
-  name: 'CFormCheck',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Create button-like checkboxes and radio buttons.
-     *
-     * @see http://coreui.io/vue/docs/components/button.html
-     */
-    button: Object,
-    /**
-     * Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `false` state.
-     *
-     * @since 4.10.0
-     */
-    falseValue: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedback: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedbackInvalid: String,
-    /**
-     * Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    feedbackValid: String,
-    /**
-     * Sets hit area to the full area of the component.
-     */
-    hitArea: {
-      type: String,
-      validator: (value: string): boolean => {
-        // The value must match one of these strings
-        return ['full'].includes(value)
-      },
-    },
-    /**
-     * The id global attribute defines an identifier (ID) that must be unique in the whole document.
-     */
-    id: String,
-    /**
-     * Input Checkbox indeterminate Property
-     */
-    indeterminate: Boolean,
-    /**
-     * Group checkboxes or radios on the same horizontal row by adding.
-     */
-    inline: Boolean,
-    /**
-     * Set component validation state to invalid.
-     */
-    invalid: Boolean,
-    /**
-     * The element represents a caption for a component.
-     */
-    label: String,
-    /**
-     * The default name for a value passed using v-model.
-     */
-    modelValue: {
-      type: [Array, Boolean, String],
-      value: undefined,
-    },
-    /**
-     * Put checkboxes or radios on the opposite side.
-     *
-     * @since 4.8.0
-     */
-    reverse: Boolean,
-    /**
-     * Display validation feedback in a styled tooltip.
-     *
-     * @since 4.3.0
-     */
-    tooltipFeedback: Boolean,
-    /**
-     * Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `true` state.
-     *
-     * @since 4.10.0
-     */
-    trueValue: String,
-    /**
-     * Specifies the type of component.
-     *
-     * @values 'checkbox', 'radio'
-     */
-    type: {
-      type: String,
-      default: 'checkbox',
-    },
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-    /**
-     * The value attribute of component.
-     */
-    value: String,
-  },
-  emits: [
-    /**
-     * Event occurs when the checked value has been changed.
-     */
-    'change',
-    /**
-     * Emit the new value whenever there’s a change event.
-     */
-    'update:modelValue',
-  ],
-  setup(props, { attrs, emit, slots }) {
-    const handleChange = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('change', event)
-
-      if (props.falseValue && props.trueValue) {
-        emit('update:modelValue', target.checked ? props.trueValue : props.falseValue)
-        return
-      }
-
-      if (props.value && Array.isArray(props.modelValue)) {
-        if (props.modelValue.includes(props.value)) {
-          emit(
-            'update:modelValue',
-            props.modelValue.filter((value) => value !== props.value),
-          )
-        } else {
-          emit('update:modelValue', [...props.modelValue, props.value])
-        }
-
-        return
-      }
-
-      if (props.value === undefined) {
-        emit('update:modelValue', target.checked)
-        return
-      }
-
-      if (props.value && (props.modelValue === undefined || typeof props.modelValue === 'string')) {
-        emit('update:modelValue', target.checked ? props.value : undefined)
-      }
-    }
-
-    const className = [
-      'form-check',
-      {
-        'form-check-inline': props.inline,
-        'form-check-reverse': props.reverse,
-        'is-invalid': props.invalid,
-        'is-valid': props.valid,
-      },
-      attrs.class,
-    ]
-
-    const inputClassName = [
-      props.button ? 'btn-check' : 'form-check-input',
-      {
-        'is-invalid': props.invalid,
-        'is-valid': props.valid,
-        'me-2': props.hitArea,
-      },
-    ]
-
-    const isChecked = computed(() => {
-      if (Array.isArray(props.modelValue)) {
-        return props.modelValue.includes(props.value)
-      }
-
-      if (typeof props.modelValue === 'string') {
-        return props.modelValue === props.value
-      }
-
-      return props.modelValue
-    })
-
-    const formControl = () => {
-      return h('input', {
-        ...attrs,
-        ...(props.modelValue && { checked: isChecked.value }),
-        class: inputClassName,
-        id: props.id,
-        indeterminate: props.indeterminate,
-        onChange: (event: InputEvent) => handleChange(event),
-        type: props.type,
-        value: props.value,
-      })
-    }
-
-    const formLabel = () =>
-      props.button
-        ? h(
-            CButton,
-            {
-              as: 'label',
-              ...props.button,
-              ...(props.id && { for: props.id }),
-            },
-            {
-              default: () => (slots.label && slots.label()) || props.label,
-            },
-          )
-        : h(
-            CFormLabel,
-            { class: 'form-check-label', ...(props.id && { for: props.id }) },
-            {
-              default: () => (slots.label && slots.label()) || props.label,
-            },
-          )
-
-    const formValidation = () => {
-      return h(CFormControlValidation, {
-        describedby: attrs['aria-describedby'] as string,
-        feedback: props.feedback,
-        feedbackInvalid: props.feedbackInvalid,
-        feedbackValid: props.feedbackValid,
-        invalid: props.invalid,
-        tooltipFeedback: props.tooltipFeedback,
-        valid: props.valid,
-      })
-    }
-
-    return () =>
-      props.button
-        ? [formControl(), (slots.label || props.label) && formLabel(), formValidation()]
-        : props.label
-          ? props.hitArea
-            ? [
-                h(
-                  CFormLabel,
-                  {
-                    customClassName: className,
-                    ...(props.id && { for: props.id }),
-                  },
-                  [formControl(), props.label],
-                ),
-                formValidation(),
-              ]
-            : h(
-                'div',
-                {
-                  class: className,
-                },
-                [formControl(), props.label && formLabel(), formValidation()],
-              )
-          : formControl()
-  },
-})
-
-export { CFormCheck }
diff --git a/packages/coreui-vue/src/components/form/CFormControlValidation.ts b/packages/coreui-vue/src/components/form/CFormControlValidation.ts
deleted file mode 100644
index e8723aa7..00000000
--- a/packages/coreui-vue/src/components/form/CFormControlValidation.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CFormFeedback } from './CFormFeedback'
-
-const CFormControlValidation = defineComponent({
-  name: 'CFormControlValidation',
-  inheritAttrs: false,
-  props: {
-    /**
-     * @ignore
-     */
-    describedby: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedback: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedbackInvalid: String,
-    /**
-     * Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    feedbackValid: String,
-    /**
-     * Set component validation state to invalid.
-     */
-    invalid: Boolean,
-    /**
-     * Display validation feedback in a styled tooltip.
-     *
-     * @since 4.3.0
-     */
-    tooltipFeedback: Boolean,
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-  },
-  setup(props, { slots }) {
-    return () => [
-      props.feedback &&
-        (props.valid || props.invalid) &&
-        h(
-          CFormFeedback,
-          {
-            ...(props.invalid && { id: props.describedby }),
-            invalid: props.invalid,
-            tooltip: props.tooltipFeedback,
-            valid: props.valid,
-          },
-          {
-            default: () => (slots.feedback && slots.feedback()) || props.feedback,
-          },
-        ),
-      (props.feedbackInvalid || slots.feedbackInvalid) &&
-        h(
-          CFormFeedback,
-          {
-            id: props.describedby,
-            invalid: true,
-            tooltip: props.tooltipFeedback,
-          },
-          {
-            default: () =>
-              (slots.feedbackInvalid && slots.feedbackInvalid()) || props.feedbackInvalid,
-          },
-        ),
-      (props.feedbackValid || slots.feedbackValid) &&
-        h(
-          CFormFeedback,
-          {
-            tooltip: props.tooltipFeedback,
-            valid: true,
-          },
-          {
-            default: () => (slots.feedbackValid && slots.feedbackValid()) || props.feedbackValid,
-          },
-        ),
-    ]
-  },
-})
-
-export { CFormControlValidation }
diff --git a/packages/coreui-vue/src/components/form/CFormControlWrapper.ts b/packages/coreui-vue/src/components/form/CFormControlWrapper.ts
deleted file mode 100644
index 0ed3d195..00000000
--- a/packages/coreui-vue/src/components/form/CFormControlWrapper.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CFormControlValidation } from './CFormControlValidation'
-import { CFormFloating } from './CFormFloating'
-import { CFormLabel } from './CFormLabel'
-import { CFormText } from './CFormText'
-
-import type { ComponentProps } from '../../utils/ComponentProps'
-
-interface CFormControlWrapperProps extends ComponentProps<typeof CFormControlValidation> {
-  floatingClassName?: string
-  floatingLabel?: string
-  id?: string
-  label?: string
-  text?: string
-}
-
-const CFormControlWrapper = defineComponent({
-  name: 'CFormControlWrapper',
-  inheritAttrs: false,
-  props: {
-    ...CFormControlValidation.props,
-    /**
-     * A string of all className you want applied to the floating label wrapper.
-     *
-     * @since 5.5.0
-     */
-    floatingClassName: String,
-    /**
-     * Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    floatingLabel: String,
-    /**
-     * @ignore
-     */
-    id: {
-      type: String,
-    },
-    /**
-     * Add a caption for a component.
-     *
-     * @since 4.3.0
-     */
-    label: String,
-    /**
-     * Add helper text to the component.
-     *
-     * @since 4.3.0
-     */
-    text: String,
-  },
-  setup(props: CFormControlWrapperProps, { slots }) {
-    const formControlValidation = () =>
-      h(
-        CFormControlValidation,
-        {
-          describedby: props.describedby,
-          feedback: props.feedback,
-          feedbackInvalid: props.feedbackInvalid,
-          feedbackValid: props.feedbackValid,
-          invalid: props.invalid,
-          tooltipFeedback: props.tooltipFeedback,
-          valid: props.valid,
-        },
-        {
-          ...(slots.feedback && { feedback: () => slots.feedback && slots.feedback() }),
-          ...(slots.feedbackInvalid && {
-            feedbackInvalid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.feedbackValid && {
-            feedbackValid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-        },
-      )
-
-    return () =>
-      props.floatingLabel
-        ? h(
-            CFormFloating,
-            {
-              class: props.floatingClassName,
-            },
-            () => [
-              slots.default && slots.default(),
-              h(
-                CFormLabel,
-                {
-                  for: props.id,
-                },
-                {
-                  default: () =>
-                    (slots.label && slots.label()) || props.label || props.floatingLabel,
-                },
-              ),
-              (props.text || slots.text) &&
-                h(
-                  CFormText,
-                  {
-                    id: props.describedby,
-                  },
-                  {
-                    default: () => (slots.text && slots.text()) || props.text,
-                  },
-                ),
-              formControlValidation(),
-            ],
-          )
-        : [
-            (props.label || slots.label) &&
-              h(
-                CFormLabel,
-                {
-                  for: props.id,
-                },
-                {
-                  default: () => (slots.label && slots.label()) || props.label,
-                },
-              ),
-            slots.default && slots.default(),
-            (props.text || slots.text) &&
-              h(
-                CFormText,
-                {
-                  id: props.describedby,
-                },
-                {
-                  default: () => (slots.text && slots.text()) || props.text,
-                },
-              ),
-            formControlValidation(),
-          ]
-  },
-})
-
-export { CFormControlWrapper }
diff --git a/packages/coreui-vue/src/components/form/CFormFeedback.ts b/packages/coreui-vue/src/components/form/CFormFeedback.ts
deleted file mode 100644
index df4d496e..00000000
--- a/packages/coreui-vue/src/components/form/CFormFeedback.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CFormFeedback = defineComponent({
-  name: 'CFormFeedback',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-    /**
-     * Method called immediately after the `value` prop changes.
-     */
-    invalid: Boolean,
-    /**
-     * If your form layout allows it, you can display validation feedback in a styled tooltip.
-     */
-    tooltip: Boolean,
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            {
-              [`invalid-${props.tooltip ? 'tooltip' : 'feedback'}`]: props.invalid,
-              [`valid-${props.tooltip ? 'tooltip' : 'feedback'}`]: props.valid,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CFormFeedback }
diff --git a/packages/coreui-vue/src/components/form/CFormFloating.ts b/packages/coreui-vue/src/components/form/CFormFloating.ts
deleted file mode 100644
index 53b71a60..00000000
--- a/packages/coreui-vue/src/components/form/CFormFloating.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CFormFloating = defineComponent({
-  name: 'CFormFloating',
-  setup(_, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: 'form-floating',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CFormFloating }
diff --git a/packages/coreui-vue/src/components/form/CFormInput.ts b/packages/coreui-vue/src/components/form/CFormInput.ts
deleted file mode 100644
index 8dbe4eca..00000000
--- a/packages/coreui-vue/src/components/form/CFormInput.ts
+++ /dev/null
@@ -1,187 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CFormControlWrapper } from './CFormControlWrapper'
-
-export const File = typeof window === 'undefined' ? class File extends Object {} : window.File
-
-const CFormInput = defineComponent({
-  name: 'CFormInput',
-  props: {
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-
-    // Inherited Props from CFormControlWrapper
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedback: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedbackInvalid: String,
-    /**
-     * Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    feedbackValid: String,
-    /**
-     * Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    floatingLabel: String,
-    /**
-     * The id global attribute defines an identifier (ID) that must be unique in the whole document.
-     */
-    id: String,
-    /**
-     * Set component validation state to invalid.
-     */
-    invalid: Boolean,
-    /**
-     * Add a caption for a component.
-     *
-     * @since 4.3.0
-     */
-    label: String,
-    /**
-     * The default name for a value passed using v-model.
-     */
-    modelValue: [File, Number, String],
-    /**
-     * Render the component styled as plain text. Removes the default form field styling and preserve the correct margin and padding. Recommend to use only along side `readonly`.
-     */
-    plainText: Boolean,
-    /**
-     * Toggle the readonly state for the component.
-     */
-    readonly: Boolean,
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm' | 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-    /**
-     * Add helper text to the component.
-     *
-     * @since 4.3.0
-     */
-    text: String,
-    /**
-     * Display validation feedback in a styled tooltip.
-     *
-     * @since 4.3.0
-     */
-    tooltipFeedback: Boolean,
-    /**
-     * Specifies the type of component.
-     *
-     * @values 'color' | 'file' | 'text' | string
-     */
-    type: {
-      type: String,
-      default: 'text',
-    },
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-  },
-  emits: [
-    /**
-     * Event occurs when the element loses focus, after the content has been changed.
-     */
-    'change',
-    /**
-     * Event occurs immediately after the value of a component has changed.
-     */
-    'input',
-    /**
-     * Emit the new value whenever there’s an input or change event.
-     */
-    'update:modelValue',
-  ],
-  setup(props, { attrs, emit, slots }) {
-    const handleChange = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('change', event)
-      emit('update:modelValue', target.value)
-    }
-
-    const handleInput = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('input', event)
-      emit('update:modelValue', target.value)
-    }
-
-    return () =>
-      h(
-        CFormControlWrapper,
-        {
-          ...(typeof attrs['aria-describedby'] === 'string' && {
-            describedby: attrs['aria-describedby'],
-          }),
-          feedback: props.feedback,
-          feedbackInvalid: props.feedbackInvalid,
-          feedbackValid: props.feedbackValid,
-          floatingLabel: props.floatingLabel,
-          id: props.id,
-          invalid: props.invalid,
-          label: props.label,
-          text: props.text,
-          tooltipFeedback: props.tooltipFeedback,
-          valid: props.valid,
-        },
-        {
-          default: () =>
-            h(
-              'input',
-              {
-                id: props.id,
-                ...attrs,
-                class: [
-                  props.plainText ? 'form-control-plaintext' : 'form-control',
-                  {
-                    'form-control-color': props.type === 'color',
-                    [`form-control-${props.size}`]: props.size,
-                    'is-invalid': props.invalid,
-                    'is-valid': props.valid,
-                  },
-                  attrs.class,
-                ],
-                disabled: props.disabled,
-                onChange: (event: InputEvent) => handleChange(event),
-                onInput: (event: InputEvent) => handleInput(event),
-                readonly: props.readonly,
-                type: props.type,
-                ...((props.modelValue || props.modelValue === 0) && { value: props.modelValue }),
-              },
-              slots.default && slots.default(),
-            ),
-          ...(slots.feedback && { feedback: () => slots.feedback && slots.feedback() }),
-          ...(slots.feedbackInvalid && {
-            feedbackInvalid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.feedbackValid && {
-            feedbackValid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.label && { label: () => slots.label && slots.label() }),
-          ...(slots.text && { text: () => slots.text && slots.text() }),
-        },
-      )
-  },
-})
-
-export { CFormInput }
diff --git a/packages/coreui-vue/src/components/form/CFormLabel.ts b/packages/coreui-vue/src/components/form/CFormLabel.ts
deleted file mode 100644
index 4b98127c..00000000
--- a/packages/coreui-vue/src/components/form/CFormLabel.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CFormLabel = defineComponent({
-  name: 'CFormLabel',
-  props: {
-    /**
-     * A string of all className you want to be applied to the component, and override standard className value.
-     */
-    customClassName: [Array, String],
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'label',
-        {
-          class: props.customClassName ?? 'form-label',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CFormLabel }
diff --git a/packages/coreui-vue/src/components/form/CFormRange.ts b/packages/coreui-vue/src/components/form/CFormRange.ts
deleted file mode 100644
index fcefa832..00000000
--- a/packages/coreui-vue/src/components/form/CFormRange.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CFormLabel } from './CFormLabel'
-
-const CFormRange = defineComponent({
-  name: 'CFormRange',
-  props: {
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * Add a caption for a component.
-     *
-     * @since 4.3.0
-     */
-    label: String,
-    /**
-     * Specifies the maximum value for the component.
-     */
-    max: Number,
-    /**
-     * Specifies the minimum value for the component.
-     */
-    min: Number,
-    /**
-     * The default name for a value passed using v-model.
-     */
-    modelValue: String,
-    /**
-     * Toggle the readonly state for the component.
-     */
-    readonly: Boolean,
-    /**
-     * Specifies the interval between legal numbers in the component.
-     */
-    steps: Number,
-    /**
-     * The `value` attribute of component.
-     *
-     * @controllable onChange
-     * */
-    value: Number,
-  },
-  emits: [
-    /**
-     * Event occurs when the value has been changed.
-     */
-    'change',
-    /**
-     * Emit the new value whenever there’s a change event.
-     */
-    'update:modelValue',
-  ],
-  setup(props, { attrs, emit, slots }) {
-    const handleChange = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('change', event)
-      emit('update:modelValue', target.value)
-    }
-
-    return () => [
-      props.label &&
-        h(
-          CFormLabel,
-          {
-            for: attrs.id,
-          },
-          {
-            default: () => (slots.label && slots.label()) || props.label,
-          },
-        ),
-      h(
-        'input',
-        {
-          ...attrs,
-          class: 'form-range',
-          disabled: props.disabled,
-          max: props.max,
-          min: props.min,
-          onChange: (event: InputEvent) => handleChange(event),
-          readonly: props.readonly,
-          steps: props.steps,
-          type: 'range',
-          value: props.modelValue,
-        },
-        slots.default && slots.default(),
-      ),
-    ]
-  },
-})
-
-export { CFormRange }
diff --git a/packages/coreui-vue/src/components/form/CFormSelect.ts b/packages/coreui-vue/src/components/form/CFormSelect.ts
deleted file mode 100644
index 23bd7b1b..00000000
--- a/packages/coreui-vue/src/components/form/CFormSelect.ts
+++ /dev/null
@@ -1,192 +0,0 @@
-import { defineComponent, h, PropType } from 'vue'
-import { CFormControlWrapper } from './CFormControlWrapper'
-
-type Option = {
-  disabled?: boolean
-  label?: string
-  selected?: boolean
-  value?: string
-}
-
-const CFormSelect = defineComponent({
-  name: 'CFormSelect',
-  props: {
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedback: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedbackInvalid: String,
-    /**
-     * Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    feedbackValid: String,
-    /**
-     * Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    floatingLabel: String,
-    /**
-     * Specifies the number of visible options in a drop-down list.
-     */
-    htmlSize: Number,
-    /**
-     * The id global attribute defines an identifier (ID) that must be unique in the whole document.
-     */
-    id: String,
-    /**
-     * Set component validation state to invalid.
-     */
-    invalid: Boolean,
-    /**
-     * Add a caption for a component.
-     *
-     * @since 4.3.0
-     */
-    label: String,
-    /**
-     * The default name for a value passed using v-model.
-     */
-    modelValue: {
-      type: [String, Array] as PropType<string | string[]>,
-    },
-    multiple: Boolean,
-    /**
-     * Options list of the select component. Available keys: `label`, `value`, `disabled`.
-     * Examples:
-     * - `:options="[{ value: 'js', label: 'JavaScript' }, { value: 'html', label: 'HTML', disabled: true }]"`
-     * - `:options="['js', 'html']"`
-     */
-    options: Array as PropType<Option[] | string[]>,
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm' | 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-    /**
-     * Add helper text to the component.
-     *
-     * @since 4.3.0
-     */
-    text: String,
-    /**
-     * Display validation feedback in a styled tooltip.
-     *
-     * @since 4.3.0
-     */
-    tooltipFeedback: Boolean,
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-  },
-  emits: [
-    /**
-     * Event occurs when when a user changes the selected option of a `<select>` element.
-     */
-    'change',
-    /**
-     * Emit the new value whenever there’s a change event.
-     */
-    'update:modelValue',
-  ],
-  setup(props, { attrs, emit, slots }) {
-    const handleChange = (event: InputEvent) => {
-      const target = event.target as HTMLSelectElement
-      const selected = Array.from(target.options)
-        .filter((option) => option.selected)
-        .map((option) => option.value)
-      emit('change', event)
-      emit('update:modelValue', target.multiple ? selected : selected[0])
-    }
-
-    return () =>
-      h(
-        CFormControlWrapper,
-        {
-          ...(typeof attrs['aria-describedby'] === 'string' && {
-            describedby: attrs['aria-describedby'],
-          }),
-          feedback: props.feedback,
-          feedbackInvalid: props.feedbackInvalid,
-          feedbackValid: props.feedbackValid,
-          floatingLabel: props.floatingLabel,
-          id: props.id,
-          invalid: props.invalid,
-          label: props.label,
-          text: props.text,
-          tooltipFeedback: props.tooltipFeedback,
-          valid: props.valid,
-        },
-        {
-          default: () =>
-            h(
-              'select',
-              {
-                id: props.id,
-                ...attrs,
-                class: [
-                  'form-select',
-                  {
-                    [`form-select-${props.size}`]: props.size,
-                    'is-invalid': props.invalid,
-                    'is-valid': props.valid,
-                  },
-                  attrs.class,
-                ],
-                multiple: props.multiple,
-                onChange: (event: InputEvent) => handleChange(event),
-                size: props.htmlSize,
-                ...(props.modelValue && !props.multiple && { value: props.modelValue }),
-              },
-              props.options
-                ? props.options.map((option: Option | string) => {
-                    return h(
-                      'option',
-                      {
-                        ...(typeof option === 'object' && {
-                          ...(option.disabled && { disabled: option.disabled }),
-                          ...(option.selected && { selected: option.selected }),
-                          ...(option.value !== undefined && {
-                            value: option.value,
-                            ...(props.modelValue &&
-                              props.multiple &&
-                              props.modelValue.includes(option.value) && { selected: true }),
-                          }),
-                        }),
-                      },
-                      typeof option === 'string' ? option : option.label,
-                    )
-                  })
-                : slots.default && slots.default(),
-            ),
-          ...(slots.feedback && { feedback: () => slots.feedback && slots.feedback() }),
-          ...(slots.feedbackInvalid && {
-            feedbackInvalid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.feedbackValid && {
-            feedbackValid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.label && { label: () => slots.label && slots.label() }),
-          ...(slots.text && { text: () => slots.text && slots.text() }),
-        },
-      )
-  },
-})
-
-export { CFormSelect }
diff --git a/packages/coreui-vue/src/components/form/CFormSwitch.ts b/packages/coreui-vue/src/components/form/CFormSwitch.ts
deleted file mode 100644
index 6b75cd36..00000000
--- a/packages/coreui-vue/src/components/form/CFormSwitch.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CFormLabel } from './CFormLabel'
-
-const CFormSwitch = defineComponent({
-  name: 'CFormSwitch',
-  inheritAttrs: false,
-  props: {
-    /**
-     * The id global attribute defines an identifier (ID) that must be unique in the whole document
-     */
-    id: String,
-    /**
-     * Set component validation state to invalid.
-     */
-    invalid: Boolean,
-    /**
-     * The element represents a caption for a component.
-     */
-    label: String,
-    /**
-     * The default name for a value passed using v-model.
-     */
-    modelValue: [Boolean, String],
-    /**
-     * Put checkboxes or radios on the opposite side.
-     *
-     * @since 4.8.0
-     */
-    reverse: Boolean,
-    /**
-     * Size the component large or extra large. Works only with `switch`.
-     *
-     * @values 'lg' | 'xl'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['lg', 'xl'].includes(value)
-      },
-    },
-    /**
-     * Specifies the type of component.
-     *
-     * @values 'checkbox', 'radio'
-     */
-    type: {
-      type: String,
-      default: 'checkbox',
-    },
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-  },
-  emits: [
-    /**
-     * Event occurs when the checked value has been changed.
-     */
-    'change',
-    /**
-     * Emit the new value whenever there’s a change event.
-     */
-    'update:modelValue',
-  ],
-  setup(props, { attrs, emit }) {
-    const handleChange = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('change', event)
-      emit('update:modelValue', target.checked)
-    }
-
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'form-check form-switch',
-            {
-              'form-check-reverse': props.reverse,
-              [`form-switch-${props.size}`]: props.size,
-              'is-invalid': props.invalid,
-              'is-valid': props.valid,
-            },
-          ],
-        },
-        [
-          h('input', {
-            ...attrs,
-            ...(props.modelValue && { checked: props.modelValue }),
-            class: [
-              'form-check-input',
-              {
-                'is-invalid': props.invalid,
-                'is-valid': props.valid,
-              },
-              attrs.class,
-            ],
-            id: props.id,
-            onChange: (event: InputEvent) => handleChange(event),
-            type: props.type,
-          }),
-          props.label &&
-            h(
-              CFormLabel,
-              {
-                ...(props.id && { for: props.id }),
-                class: 'form-check-label',
-              },
-              {
-                default: () => props.label,
-              },
-            ),
-        ],
-      )
-  },
-})
-
-export { CFormSwitch }
diff --git a/packages/coreui-vue/src/components/form/CFormText.ts b/packages/coreui-vue/src/components/form/CFormText.ts
deleted file mode 100644
index 5ed6b00c..00000000
--- a/packages/coreui-vue/src/components/form/CFormText.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CFormText = defineComponent({
-  name: 'CFormText',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'form-text' }, slots.default && slots.default())
-  },
-})
-
-export { CFormText }
diff --git a/packages/coreui-vue/src/components/form/CFormTextarea.ts b/packages/coreui-vue/src/components/form/CFormTextarea.ts
deleted file mode 100644
index 42a8a732..00000000
--- a/packages/coreui-vue/src/components/form/CFormTextarea.ts
+++ /dev/null
@@ -1,160 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CFormControlWrapper } from './CFormControlWrapper'
-
-const CFormTextarea = defineComponent({
-  name: 'CFormTextarea',
-  props: {
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedback: String,
-    /**
-     * Provide valuable, actionable feedback.
-     *
-     * @since 4.3.0
-     */
-    feedbackInvalid: String,
-    /**
-     * Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    feedbackValid: String,
-    /**
-     * Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.
-     *
-     * @since 4.3.0
-     */
-    floatingLabel: String,
-    /**
-     * The id global attribute defines an identifier (ID) that must be unique in the whole document.
-     */
-    id: String,
-    /**
-     * Set component validation state to invalid.
-     */
-    invalid: Boolean,
-    /**
-     * Add a caption for a component.
-     *
-     * @since 4.3.0
-     */
-    label: String,
-    /**
-     * The default name for a value passed using v-model.
-     */
-    modelValue: String,
-    /**
-     * Render the component styled as plain text. Removes the default form field styling and preserve the correct margin and padding. Recommend to use only along side `readonly`.
-     */
-    plainText: Boolean,
-    /**
-     * Toggle the readonly state for the component.
-     */
-    readonly: Boolean,
-    /**
-     * Add helper text to the component.
-     *
-     * @since 4.3.0
-     */
-    text: String,
-    /**
-     * Display validation feedback in a styled tooltip.
-     *
-     * @since 4.3.0
-     */
-    tooltipFeedback: Boolean,
-    /**
-     * Set component validation state to valid.
-     */
-    valid: Boolean,
-  },
-  emits: [
-    /**
-     * Event occurs when the element loses focus, after the content has been changed.
-     */
-    'change',
-    /**
-     * Event occurs immediately after the value of a component has changed.
-     */
-    'input',
-    /**
-     * Emit the new value whenever there’s an input or change event.
-     */
-    'update:modelValue',
-  ],
-  setup(props, { attrs, emit, slots }) {
-    const handleChange = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('change', event)
-      emit('update:modelValue', target.value)
-    }
-
-    const handleInput = (event: InputEvent) => {
-      const target = event.target as HTMLInputElement
-      emit('input', event)
-      emit('update:modelValue', target.value)
-    }
-
-    return () =>
-      h(
-        CFormControlWrapper,
-        {
-          ...(typeof attrs['aria-describedby'] === 'string' && {
-            describedby: attrs['aria-describedby'],
-          }),
-          feedback: props.feedback,
-          feedbackInvalid: props.feedbackInvalid,
-          feedbackValid: props.feedbackValid,
-          floatingLabel: props.floatingLabel,
-          id: props.id,
-          invalid: props.invalid,
-          label: props.label,
-          text: props.text,
-          tooltipFeedback: props.tooltipFeedback,
-          valid: props.valid,
-        },
-        {
-          default: () =>
-            h(
-              'textarea',
-              {
-                id: props.id,
-                ...attrs,
-                disabled: props.disabled,
-                readonly: props.readonly,
-                class: [
-                  props.plainText ? 'form-control-plaintext' : 'form-control',
-                  {
-                    'is-invalid': props.invalid,
-                    'is-valid': props.valid,
-                  },
-                  attrs.class,
-                ],
-                onChange: (event: InputEvent) => handleChange(event),
-                onInput: (event: InputEvent) => handleInput(event),
-                ...(props.modelValue && { value: props.modelValue }),
-              },
-              slots.default && slots.default(),
-            ),
-          ...(slots.feedback && { feedback: () => slots.feedback && slots.feedback() }),
-          ...(slots.feedbackInvalid && {
-            feedbackInvalid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.feedbackValid && {
-            feedbackValid: () => slots.feedbackInvalid && slots.feedbackInvalid(),
-          }),
-          ...(slots.label && { label: () => slots.label && slots.label() }),
-          ...(slots.text && { text: () => slots.text && slots.text() }),
-        },
-      )
-  },
-})
-
-export { CFormTextarea }
diff --git a/packages/coreui-vue/src/components/form/CInputGroup.ts b/packages/coreui-vue/src/components/form/CInputGroup.ts
deleted file mode 100644
index 56a8418c..00000000
--- a/packages/coreui-vue/src/components/form/CInputGroup.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CInputGroup = defineComponent({
-  name: 'CInputGroup',
-  props: {
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm', 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'input-group',
-            {
-              [`input-group-${props.size}`]: props.size,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CInputGroup }
diff --git a/packages/coreui-vue/src/components/form/CInputGroupText.ts b/packages/coreui-vue/src/components/form/CInputGroupText.ts
deleted file mode 100644
index d44172a7..00000000
--- a/packages/coreui-vue/src/components/form/CInputGroupText.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CInputGroupText = defineComponent({
-  name: 'CInputGroupText',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'span',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'input-group-text' }, slots.default && slots.default())
-  },
-})
-
-export { CInputGroupText }
diff --git a/packages/coreui-vue/src/components/form/__tests__/CForm.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CForm.spec.ts
deleted file mode 100644
index b09a6349..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CForm.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CForm as Component } from '../../../index'
-
-const ComponentName = 'CForm'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    validated: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('was-validated')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormCheck.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormCheck.spec.ts
deleted file mode 100644
index 2bfd92f0..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormCheck.spec.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormCheck as Component } from '../../../index'
-
-const ComponentName = 'CFormCheck'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customLabelWrapper = mount(Component, {
-  propsData: {
-    label: 'some label',
-    button: {
-      color: 'warning',
-      shape: 'rounded-circle',
-      size: 'lg',
-      variant: 'outline',
-    },
-    id: 'uniqueid',
-    inline: true,
-    invalid: true,
-    type: 'checkbox', // TODO: test other type
-    valid: true,
-  },
-  slots: {},
-})
-
-const customLabelInSlotWrapper = mount(Component, {
-  propsData: {
-    button: {
-      color: 'warning',
-      shape: 'rounded-circle',
-      size: 'lg',
-      variant: 'outline',
-    },
-    id: 'uniqueid',
-    inline: true,
-    invalid: true,
-    type: 'checkbox', // TODO: test other type
-    valid: true,
-  },
-  slots: {
-    label: 'some label',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('form-check-input')).toBe(true)
-  })
-})
-
-describe(`Customize with label - ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customLabelWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customLabelWrapper.find('label').text()).toContain('some label')
-    expect(customLabelWrapper.find('input').classes('btn-check')).toBe(true)
-    expect(customLabelWrapper.find('input').classes('is-invalid')).toBe(true)
-    expect(customLabelWrapper.find('input').classes('is-valid')).toBe(true)
-    expect(customLabelWrapper.find('input').attributes('id')).toBe('uniqueid')
-    expect(customLabelWrapper.find('input').attributes('type')).toBe('checkbox')
-
-    expect(customLabelWrapper.find('label').classes('btn')).toBe(true)
-    expect(customLabelWrapper.find('label').classes('btn-outline-warning')).toBe(true)
-    expect(customLabelWrapper.find('label').classes('btn-lg')).toBe(true)
-    expect(customLabelWrapper.find('label').classes('rounded-circle')).toBe(true)
-    expect(customLabelWrapper.find('label').attributes('for')).toBe('uniqueid')
-  })
-})
-
-describe(`Customize with label in slot - ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customLabelInSlotWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customLabelInSlotWrapper.find('label').text()).toContain('some label')
-    expect(customLabelInSlotWrapper.find('input').classes('btn-check')).toBe(true)
-    expect(customLabelInSlotWrapper.find('input').classes('is-invalid')).toBe(true)
-    expect(customLabelInSlotWrapper.find('input').classes('is-valid')).toBe(true)
-    expect(customLabelInSlotWrapper.find('input').attributes('id')).toBe('uniqueid')
-    expect(customLabelInSlotWrapper.find('input').attributes('type')).toBe('checkbox')
-
-    expect(customLabelInSlotWrapper.find('label').classes('btn')).toBe(true)
-    expect(customLabelInSlotWrapper.find('label').classes('btn-outline-warning')).toBe(true)
-    expect(customLabelInSlotWrapper.find('label').classes('btn-lg')).toBe(true)
-    expect(customLabelInSlotWrapper.find('label').classes('rounded-circle')).toBe(true)
-    expect(customLabelInSlotWrapper.find('label').attributes('for')).toBe('uniqueid')
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormFeedback.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormFeedback.spec.ts
deleted file mode 100644
index c1351c6c..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormFeedback.spec.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormFeedback as Component } from '../../../index'
-
-const ComponentName = 'CFormFeedback'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h2',
-    invalid: true,
-    tooltip: true,
-    valid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    as: 'h2',
-    invalid: true,
-    tooltip: false,
-    valid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('invalid-tooltip')).toBe(true)
-    expect(customWrapper.classes('valid-tooltip')).toBe(true)
-  })
-})
-
-describe(`Customize (two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.text()).toContain('Default slot')
-    expect(customWrapperTwo.classes('invalid-feedback')).toBe(true)
-    expect(customWrapperTwo.classes('valid-feedback')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormFloating.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormFloating.spec.ts
deleted file mode 100644
index 972df01f..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormFloating.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormFloating as Component } from '../../../index'
-
-const ComponentName = 'CFormFloating'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('form-floating')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormInput.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormInput.spec.ts
deleted file mode 100644
index eaac7a9f..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormInput.spec.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormInput as Component } from '../../../index'
-
-const ComponentName = 'CFormInput'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    disabled: true,
-    invalid: true,
-    plainText: true,
-    readonly: true,
-    size: 'lg',
-    type: 'color',
-    valid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    disabled: true,
-    invalid: true,
-    plainText: false,
-    readonly: true,
-    size: 'lg',
-    type: 'color',
-    valid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('input').classes('form-control')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('input').classes('form-control-plaintext')).toBe(true)
-    expect(customWrapper.find('input').classes('form-control-color')).toBe(true)
-    expect(customWrapper.find('input').classes('form-control-lg')).toBe(true)
-    expect(customWrapper.find('input').classes('is-invalid')).toBe(true)
-    expect(customWrapper.find('input').classes('is-valid')).toBe(true)
-  })
-})
-
-describe(`Customize (two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.text()).toContain('Default slot')
-    expect(customWrapperTwo.find('input').classes('form-control')).toBe(true)
-    expect(customWrapper.find('input').classes('form-control-color')).toBe(true)
-    expect(customWrapper.find('input').classes('form-control-lg')).toBe(true)
-    expect(customWrapper.find('input').classes('is-invalid')).toBe(true)
-    expect(customWrapper.find('input').classes('is-valid')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormLabel.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormLabel.spec.ts
deleted file mode 100644
index 3d99c265..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormLabel.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormLabel as Component } from '../../../index'
-
-const ComponentName = 'CFormLabel'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    customClassName: 'bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('form-label')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('bazinga')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormRange.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormRange.spec.ts
deleted file mode 100644
index 5d537e93..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormRange.spec.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormRange as Component } from '../../../index'
-
-const ComponentName = 'CFormRange'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    disabled: true,
-    max: 400,
-    min: 50,
-    readonly: true,
-    steps: 10,
-    value: 250,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('input').classes('form-range')).toBe(true)
-    expect(defaultWrapper.find('input').attributes('type')).toBe('range')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('input').classes('form-range')).toBe(true)
-    expect(customWrapper.find('input').attributes('type')).toBe('range')
-    expect(customWrapper.find('input').attributes('disabled')).toBe('')
-    expect(customWrapper.find('input').attributes('max')).toBe('400')
-    expect(customWrapper.find('input').attributes('min')).toBe('50')
-    expect(customWrapper.find('input').attributes('readonly')).toBe('')
-    expect(customWrapper.find('input').attributes('steps')).toBe('10')
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormSelect.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormSelect.spec.ts
deleted file mode 100644
index 0324a2df..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormSelect.spec.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormSelect as Component } from '../../../index'
-
-const ComponentName = 'CFormSelect'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    htmlSize: 200,
-    invalid: true,
-    size: 'lg',
-    valid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('select').classes('form-select')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('select').classes('form-select')).toBe(true)
-    expect(customWrapper.find('select').classes('form-select-lg')).toBe(true)
-    expect(customWrapper.find('select').attributes('size')).toBe('200')
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormSwitch.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormSwitch.spec.ts
deleted file mode 100644
index c328b9a3..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormSwitch.spec.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormSwitch as Component } from '../../../index'
-
-const ComponentName = 'CFormSwitch'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    id: 'uniqueid',
-    invalid: true,
-    label: 'some label',
-    size: 'lg',
-    type: 'radio',
-    valid: true,
-  },
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('form-check')).toBe(true)
-    expect(defaultWrapper.classes('form-switch')).toBe(true)
-    expect(defaultWrapper.find('input').classes('form-check-input')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('form-check')).toBe(true)
-    expect(customWrapper.classes('form-switch')).toBe(true)
-    expect(customWrapper.classes('form-switch-lg')).toBe(true)
-    expect(customWrapper.classes('is-invalid')).toBe(true)
-    expect(customWrapper.classes('is-valid')).toBe(true)
-
-    expect(customWrapper.find('input').classes('form-check-input')).toBe(true)
-    expect(customWrapper.find('input').classes('is-invalid')).toBe(true)
-    expect(customWrapper.find('input').classes('is-valid')).toBe(true)
-    expect(customWrapper.find('input').attributes('type')).toBe('radio')
-    expect(customWrapper.find('input').attributes('id')).toBe('uniqueid')
-
-    expect(customWrapper.find('label').classes('form-check-label')).toBe(true)
-    expect(customWrapper.find('label').attributes('for')).toBe('uniqueid')
-
-    expect(customWrapper.find('label').text()).toContain('some label')
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormText.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormText.spec.ts
deleted file mode 100644
index 16a5de47..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormText.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormText as Component } from '../../../index'
-
-const ComponentName = 'CFormText'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as 'p',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('form-text')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('form-text')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CFormTextarea.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CFormTextarea.spec.ts
deleted file mode 100644
index a105920e..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CFormTextarea.spec.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CFormTextarea as Component } from '../../../index'
-
-const ComponentName = 'CFormTextarea'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    disabled: true,
-    invalid: true,
-    plainText: true,
-    readonly: true,
-    valid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('textarea').classes('form-control')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('textarea').classes('form-control-plaintext')).toBe(true)
-    expect(customWrapper.find('textarea').classes('is-invalid')).toBe(true)
-    expect(customWrapper.find('textarea').classes('is-valid')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CInputGroup.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CInputGroup.spec.ts
deleted file mode 100644
index 752066ac..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CInputGroup.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CInputGroup as Component } from '../../../index'
-
-const ComponentName = 'CInputGroup'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    size: 'lg',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('input-group')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('input-group')).toBe(true)
-    expect(customWrapper.classes('input-group-lg')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/CInputGroupText.spec.ts b/packages/coreui-vue/src/components/form/__tests__/CInputGroupText.spec.ts
deleted file mode 100644
index 48a39878..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/CInputGroupText.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CInputGroupText as Component } from '../../../index'
-
-const ComponentName = 'CInputGroupText'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('input-group-text')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('input-group-text')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CForm.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CForm.spec.ts.snap
deleted file mode 100644
index 644015b8..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CForm.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CForm component renders correctly 1`] = `"<form class="was-validated">Default slot</form>"`;
-
-exports[`Loads and display CForm component renders correctly 1`] = `"<form class="">Default slot</form>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormCheck.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormCheck.spec.ts.snap
deleted file mode 100644
index 80f6acce..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormCheck.spec.ts.snap
+++ /dev/null
@@ -1,13 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize with label - CFormCheck component renders correctly 1`] = `
-"<input class="btn-check is-invalid is-valid" id="uniqueid" type="checkbox">
-<label class="btn btn-outline-warning btn-lg rounded-circle" for="uniqueid">some label</label>"
-`;
-
-exports[`Customize with label in slot - CFormCheck component renders correctly 1`] = `
-"<input class="btn-check is-invalid is-valid" id="uniqueid" type="checkbox">
-<label class="btn btn-outline-warning btn-lg rounded-circle" for="uniqueid">some label</label>"
-`;
-
-exports[`Loads and display CFormCheck component renders correctly 1`] = `"<input class="form-check-input" type="checkbox">"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormFeedback.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormFeedback.spec.ts.snap
deleted file mode 100644
index 94a0f78d..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormFeedback.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (two) CFormFeedback component renders correctly 1`] = `"<h2 class="invalid-feedback valid-feedback">Default slot</h2>"`;
-
-exports[`Customize CFormFeedback component renders correctly 1`] = `"<h2 class="invalid-tooltip valid-tooltip">Default slot</h2>"`;
-
-exports[`Loads and display CFormFeedback component renders correctly 1`] = `"<div class="">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormFloating.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormFloating.spec.ts.snap
deleted file mode 100644
index 8011db77..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormFloating.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CFormFloating component renders correctly 1`] = `"<div class="form-floating">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormInput.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormInput.spec.ts.snap
deleted file mode 100644
index 2e7649fe..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormInput.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (two) CFormInput component renders correctly 1`] = `"<input class="form-control form-control-color form-control-lg is-invalid is-valid" disabled="" readonly="" type="color">"`;
-
-exports[`Customize CFormInput component renders correctly 1`] = `"<input class="form-control-plaintext form-control-color form-control-lg is-invalid is-valid" disabled="" readonly="" type="color">"`;
-
-exports[`Loads and display CFormInput component renders correctly 1`] = `"<input class="form-control" type="text">"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormLabel.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormLabel.spec.ts.snap
deleted file mode 100644
index 4bd5e697..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormLabel.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFormLabel component renders correctly 1`] = `"<label class="bazinga">Default slot</label>"`;
-
-exports[`Loads and display CFormLabel component renders correctly 1`] = `"<label class="form-label">Default slot</label>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap
deleted file mode 100644
index 3af8cac0..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFormRange component renders correctly 1`] = `"<input class="form-range" disabled="" max="400" min="50" readonly="" steps="10" type="range">"`;
-
-exports[`Loads and display CFormRange component renders correctly 1`] = `"<input class="form-range" type="range">"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormSelect.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormSelect.spec.ts.snap
deleted file mode 100644
index d6dc9c70..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormSelect.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFormSelect component renders correctly 1`] = `"<select class="form-select form-select-lg is-invalid is-valid" size="200">Default slot</select>"`;
-
-exports[`Loads and display CFormSelect component renders correctly 1`] = `"<select class="form-select">Default slot</select>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormSwitch.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormSwitch.spec.ts.snap
deleted file mode 100644
index 2a1c6bbd..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormSwitch.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFormSwitch component renders correctly 1`] = `"<div class="form-check form-switch form-switch-lg is-invalid is-valid"><input class="form-check-input is-invalid is-valid" id="uniqueid" type="radio"><label class="form-label form-check-label" for="uniqueid">some label</label></div>"`;
-
-exports[`Loads and display CFormSwitch component renders correctly 1`] = `
-"<div class="form-check form-switch"><input class="form-check-input" type="checkbox">
-  <!---->
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormText.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormText.spec.ts.snap
deleted file mode 100644
index f2b0b034..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormText.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFormText component renders correctly 1`] = `"<p class="form-text">Default slot</p>"`;
-
-exports[`Loads and display CFormText component renders correctly 1`] = `"<div class="form-text">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormTextarea.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormTextarea.spec.ts.snap
deleted file mode 100644
index a797c34d..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CFormTextarea.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CFormTextarea component renders correctly 1`] = `"<textarea disabled="" readonly="" class="form-control-plaintext is-invalid is-valid">Default slot</textarea>"`;
-
-exports[`Loads and display CFormTextarea component renders correctly 1`] = `"<textarea class="form-control">Default slot</textarea>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CInputGroup.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CInputGroup.spec.ts.snap
deleted file mode 100644
index a6f5d78b..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CInputGroup.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CInputGroup component renders correctly 1`] = `"<div class="input-group input-group-lg">Default slot</div>"`;
-
-exports[`Loads and display CInputGroup component renders correctly 1`] = `"<div class="input-group">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CInputGroupText.spec.ts.snap b/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CInputGroupText.spec.ts.snap
deleted file mode 100644
index 37737ec9..00000000
--- a/packages/coreui-vue/src/components/form/__tests__/__snapshots__/CInputGroupText.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CInputGroupText component renders correctly 1`] = `"<div class="input-group-text">Default slot</div>"`;
-
-exports[`Loads and display CInputGroupText component renders correctly 1`] = `"<span class="input-group-text">Default slot</span>"`;
diff --git a/packages/coreui-vue/src/components/form/index.ts b/packages/coreui-vue/src/components/form/index.ts
deleted file mode 100644
index 6fa6fb5c..00000000
--- a/packages/coreui-vue/src/components/form/index.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { App } from 'vue'
-import { CForm } from './CForm'
-import { CFormCheck } from './CFormCheck'
-import { CFormFeedback } from './CFormFeedback'
-import { CFormFloating } from './CFormFloating'
-import { CFormInput } from './CFormInput'
-import { CFormLabel } from './CFormLabel'
-import { CFormRange } from './CFormRange'
-import { CFormSelect } from './CFormSelect'
-import { CFormSwitch } from './CFormSwitch'
-import { CFormText } from './CFormText'
-import { CFormTextarea } from './CFormTextarea'
-import { CInputGroup } from './CInputGroup'
-import { CInputGroupText } from './CInputGroupText'
-
-const CFormPlugin = {
-  install: (app: App): void => {
-    app.component(CForm.name as string, CForm)
-    app.component(CFormCheck.name as string, CFormCheck)
-    app.component(CFormFeedback.name as string, CFormFeedback)
-    app.component(CFormFloating.name as string, CFormFloating)
-    app.component(CFormInput.name as string, CFormInput)
-    app.component(CFormLabel.name as string, CFormLabel)
-    app.component(CFormRange.name as string, CFormRange)
-    app.component(CFormSelect.name as string, CFormSelect)
-    app.component(CFormSwitch.name as string, CFormSwitch)
-    app.component(CFormText.name as string, CFormText)
-    app.component(CFormTextarea.name as string, CFormTextarea)
-    app.component(CInputGroup.name as string, CInputGroup)
-    app.component(CInputGroupText.name as string, CInputGroupText)
-  },
-}
-
-export {
-  CFormPlugin,
-  CForm,
-  CFormCheck,
-  CFormFeedback,
-  CFormFloating,
-  CFormInput,
-  CFormLabel,
-  CFormRange,
-  CFormSelect,
-  CFormSwitch,
-  CFormText,
-  CFormTextarea,
-  CInputGroup,
-  CInputGroupText,
-}
diff --git a/packages/coreui-vue/src/components/grid/CCol.ts b/packages/coreui-vue/src/components/grid/CCol.ts
deleted file mode 100644
index d630b9b2..00000000
--- a/packages/coreui-vue/src/components/grid/CCol.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import { defineComponent, h, PropType } from 'vue'
-
-type Span = 'auto' | number | string | boolean | null
-
-type BPObject = {
-  span?: Span
-  offset?: number | string | null
-  order?: 'first' | 'last' | number | string | null
-}
-
-type Col = Span | BPObject
-
-const BREAKPOINTS = [
-  'xxl' as const,
-  'xl' as const,
-  'lg' as const,
-  'md' as const,
-  'sm' as const,
-  'xs' as const,
-]
-
-const CCol = defineComponent({
-  name: 'CCol',
-  props: {
-    /**
-     * The number of columns/offset/order on extra small devices (<576px).
-     *
-     * @values 'auto' | number | string | boolean | { span: 'auto' | number | string | boolean } | { offset: number | string } | { order: 'first' | 'last' | number | string }
-     */
-    xs: {
-      type: [Boolean, Number, String, Object] as PropType<Col>,
-    },
-    /**
-     * The number of columns/offset/order on small devices (<768px).
-     *
-     * @values 'auto' | number | string | boolean | { span: 'auto' | number | string | boolean } | { offset: number | string } | { order: 'first' | 'last' | number | string }
-     */
-    sm: {
-      type: [Boolean, Number, String, Object] as PropType<Col>,
-    },
-    /**
-     * The number of columns/offset/order on medium devices (<992px).
-     *
-     * @values 'auto' | number | string | boolean | { span: 'auto' | number | string | boolean } | { offset: number | string } | { order: 'first' | 'last' | number | string }
-     */
-    md: {
-      type: [Boolean, Number, String, Object] as PropType<Col>,
-    },
-    /**
-     * The number of columns/offset/order on large devices (<1200px).
-     *
-     * @values 'auto' | number | string | boolean | { span: 'auto' | number | string | boolean } | { offset: number | string } | { order: 'first' | 'last' | number | string }
-     */
-    lg: {
-      type: [Boolean, Number, String, Object] as PropType<Col>,
-    },
-    /**
-     * The number of columns/offset/order on X-Large devices (<1400px).
-     *
-     * @values 'auto' | number | string | boolean | { span: 'auto' | number | string | boolean } | { offset: number | string } | { order: 'first' | 'last' | number | string }
-     */
-    xl: {
-      type: [Boolean, Number, String, Object] as PropType<Col>,
-    },
-    /**
-     * The number of columns/offset/order on XX-Large devices (≥1400px).
-     *
-     * @values 'auto' | number | string | boolean | { span: 'auto' | number | string | boolean } | { offset: number | string } | { order: 'first' | 'last' | number | string }
-     */
-    xxl: {
-      type: [Boolean, Number, String, Object] as PropType<Col>,
-    },
-  },
-  setup(props, { slots }) {
-    const repsonsiveClassNames: string[] = []
-
-    BREAKPOINTS.forEach((bp) => {
-      const breakpoint = props[bp]
-
-      const infix = bp === 'xs' ? '' : `-${bp}`
-
-      if (breakpoint) {
-        if (typeof breakpoint === 'number' || typeof breakpoint === 'string') {
-          repsonsiveClassNames.push(`col${infix}-${breakpoint}`)
-        }
-
-        if (typeof breakpoint === 'boolean') {
-          repsonsiveClassNames.push(`col${infix}`)
-        }
-      }
-
-      if (breakpoint && typeof breakpoint === 'object') {
-        if (typeof breakpoint.span === 'number' || typeof breakpoint.span === 'string') {
-          repsonsiveClassNames.push(`col${infix}-${breakpoint.span}`)
-        }
-
-        if (typeof breakpoint.span === 'boolean') {
-          repsonsiveClassNames.push(`col${infix}`)
-        }
-
-        if (typeof breakpoint.order === 'number' || typeof breakpoint.order === 'string') {
-          repsonsiveClassNames.push(`order${infix}-${breakpoint.order}`)
-        }
-
-        if (typeof breakpoint.offset === 'number') {
-          repsonsiveClassNames.push(`offset${infix}-${breakpoint.offset}`)
-        }
-      }
-    })
-
-    return () =>
-      h(
-        'div',
-        {
-          class: [repsonsiveClassNames.length > 0 ? repsonsiveClassNames : 'col'],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CCol }
diff --git a/packages/coreui-vue/src/components/grid/CContainer.ts b/packages/coreui-vue/src/components/grid/CContainer.ts
deleted file mode 100644
index 77f7a4f2..00000000
--- a/packages/coreui-vue/src/components/grid/CContainer.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const BREAKPOINTS = [
-  'xxl' as const,
-  'xl' as const,
-  'lg' as const,
-  'md' as const,
-  'sm' as const,
-  'fluid' as const,
-]
-
-const CContainer = defineComponent({
-  name: 'CContainer',
-  props: {
-    /**
-     * Set container 100% wide until small breakpoint.
-     */
-    sm: Boolean,
-    /**
-     * Set container 100% wide until medium breakpoint.
-     */
-    md: Boolean,
-    /**
-     * Set container 100% wide until large breakpoint.
-     */
-    lg: Boolean,
-    /**
-     * Set container 100% wide until X-large breakpoint.
-     */
-    xl: Boolean,
-    /**
-     * Set container 100% wide until XX-large breakpoint.
-     */
-    xxl: Boolean,
-    /**
-     * Set container 100% wide, spanning the entire width of the viewport.
-     */
-    fluid: Boolean,
-  },
-  setup(props, { slots }) {
-    const repsonsiveClassNames: string[] = []
-
-    BREAKPOINTS.forEach((bp) => {
-      const breakpoint = props[bp]
-
-      breakpoint && repsonsiveClassNames.push(`container-${bp}`)
-    })
-    return () =>
-      h(
-        'div',
-        {
-          class: [repsonsiveClassNames.length > 0 ? repsonsiveClassNames : 'container'],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CContainer }
diff --git a/packages/coreui-vue/src/components/grid/CRow.ts b/packages/coreui-vue/src/components/grid/CRow.ts
deleted file mode 100644
index 4501cffd..00000000
--- a/packages/coreui-vue/src/components/grid/CRow.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-export type BPObject = {
-  cols?: 'auto' | number | string | null
-  gutter?: number | string | null
-  gutterX?: number | string | null
-  gutterY?: number | string | null
-}
-
-const BREAKPOINTS = [
-  'xxl' as const,
-  'xl' as const,
-  'lg' as const,
-  'md' as const,
-  'sm' as const,
-  'xs' as const,
-]
-
-const CRow = defineComponent({
-  name: 'CRow',
-  props: {
-    /**
-     * The number of columns/offset/order on extra small devices (<576px).
-     *
-     * @values { cols: 'auto' | number | string } | { gutter: number | string } | { gutterX: number | string } | { gutterY: number | string }
-     */
-    xs: Object as () => BPObject,
-    /**
-     * The number of columns/offset/order on small devices (<768px).
-     *
-     * @values { cols: 'auto' | number | string } | { gutter: number | string } | { gutterX: number | string } | { gutterY: number | string }
-     */
-    sm: Object as () => BPObject,
-    /**
-     * The number of columns/offset/order on medium devices (<992px).
-     *
-     * @values { cols: 'auto' | number | string } | { gutter: number | string } | { gutterX: number | string } | { gutterY: number | string }
-     */
-    md: Object as () => BPObject,
-    /**
-     * The number of columns/offset/order on large devices (<1200px).
-     *
-     * @values { cols: 'auto' | number | string } | { gutter: number | string } | { gutterX: number | string } | { gutterY: number | string }
-     */
-    lg: Object as () => BPObject,
-    /**
-     * The number of columns/offset/order on X-Large devices (<1400px).
-     *
-     * @values { cols: 'auto' | number | string } | { gutter: number | string } | { gutterX: number | string } | { gutterY: number | string }
-     */
-    xl: Object as () => BPObject,
-    /**
-     * The number of columns/offset/order on XX-Large devices (≥1400px).
-     *
-     * @values { cols: 'auto' | number | string } | { gutter: number | string } | { gutterX: number | string } | { gutterY: number | string }
-     */
-    xxl: Object as () => BPObject,
-  },
-  setup(props, { slots }) {
-    const repsonsiveClassNames: string[] = []
-
-    BREAKPOINTS.forEach((bp) => {
-      const breakpoint = props[bp]
-      const infix = bp === 'xs' ? '' : `-${bp}`
-
-      if (typeof breakpoint === 'object') {
-        if (breakpoint.cols) {
-          repsonsiveClassNames.push(`row-cols${infix}-${breakpoint.cols}`)
-        }
-        if (typeof breakpoint.gutter === 'number') {
-          repsonsiveClassNames.push(`g${infix}-${breakpoint.gutter}`)
-        }
-        if (typeof breakpoint.gutterX === 'number') {
-          repsonsiveClassNames.push(`gx${infix}-${breakpoint.gutterX}`)
-        }
-        if (typeof breakpoint.gutterY === 'number') {
-          repsonsiveClassNames.push(`gy${infix}-${breakpoint.gutterY}`)
-        }
-      }
-    })
-
-    return () =>
-      h(
-        'div',
-        {
-          class: ['row', repsonsiveClassNames],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CRow }
diff --git a/packages/coreui-vue/src/components/grid/__tests__/CCol.spec.ts b/packages/coreui-vue/src/components/grid/__tests__/CCol.spec.ts
deleted file mode 100644
index 6166cb4f..00000000
--- a/packages/coreui-vue/src/components/grid/__tests__/CCol.spec.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CCol as Component } from '../../../index'
-
-const ComponentName = 'CCol'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    md: {
-      span: 'auto',
-      offset: 3,
-      order: 'last',
-    },
-    lg: 4,
-    xl: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('col')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('col-md-auto')).toBe(true)
-    expect(customWrapper.classes('offset-md-3')).toBe(true)
-    expect(customWrapper.classes('order-md-last')).toBe(true)
-    expect(customWrapper.classes('col-lg-4')).toBe(true)
-    expect(customWrapper.classes('col-xl')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/grid/__tests__/CContainer.spec.ts b/packages/coreui-vue/src/components/grid/__tests__/CContainer.spec.ts
deleted file mode 100644
index 8d220fc9..00000000
--- a/packages/coreui-vue/src/components/grid/__tests__/CContainer.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CContainer as Component } from '../../../index'
-
-const ComponentName = 'CContainer'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    md: true,
-    xl: true,
-    fluid: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('container')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('container-md')).toBe(true)
-    expect(customWrapper.classes('container-xl')).toBe(true)
-    expect(customWrapper.classes('container-fluid')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/grid/__tests__/CRow.spec.ts b/packages/coreui-vue/src/components/grid/__tests__/CRow.spec.ts
deleted file mode 100644
index 9658ab3e..00000000
--- a/packages/coreui-vue/src/components/grid/__tests__/CRow.spec.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CRow as Component } from '../../../index'
-
-const ComponentName = 'CRow'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    md: {
-      cols: 4,
-      gutter: 10,
-      gutterX: 11,
-      gutterY: 12,
-    },
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('row')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('row')).toBe(true)
-    expect(customWrapper.classes('row-cols-md-4')).toBe(true)
-    expect(customWrapper.classes('g-md-10')).toBe(true)
-    expect(customWrapper.classes('gx-md-11')).toBe(true)
-    expect(customWrapper.classes('gy-md-12')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CCol.spec.ts.snap b/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CCol.spec.ts.snap
deleted file mode 100644
index 60bb0dec..00000000
--- a/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CCol.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CCol component renders correctly 1`] = `"<div class="col-xl col-lg-4 col-md-auto order-md-last offset-md-3">Default slot</div>"`;
-
-exports[`Loads and display CCol component renders correctly 1`] = `"<div class="col">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CContainer.spec.ts.snap b/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CContainer.spec.ts.snap
deleted file mode 100644
index 15d92143..00000000
--- a/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CContainer.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CContainer component renders correctly 1`] = `"<div class="container-xl container-md container-fluid">Default slot</div>"`;
-
-exports[`Loads and display CContainer component renders correctly 1`] = `"<div class="container">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CRow.spec.ts.snap b/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CRow.spec.ts.snap
deleted file mode 100644
index 686e7491..00000000
--- a/packages/coreui-vue/src/components/grid/__tests__/__snapshots__/CRow.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CRow component renders correctly 1`] = `"<div class="row row-cols-md-4 g-md-10 gx-md-11 gy-md-12">Default slot</div>"`;
-
-exports[`Loads and display CRow component renders correctly 1`] = `"<div class="row">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/grid/index.ts b/packages/coreui-vue/src/components/grid/index.ts
deleted file mode 100644
index 785efaac..00000000
--- a/packages/coreui-vue/src/components/grid/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { App } from 'vue'
-import { CCol } from './CCol'
-import { CContainer } from './CContainer'
-import { CRow } from './CRow'
-
-const CGridPlugin = {
-  install: (app: App): void => {
-    app.component(CCol.name as string, CCol)
-    app.component(CContainer.name as string, CContainer)
-    app.component(CRow.name as string, CRow)
-  },
-}
-export { CGridPlugin, CCol, CContainer, CRow }
diff --git a/packages/coreui-vue/src/components/header/CHeader.ts b/packages/coreui-vue/src/components/header/CHeader.ts
deleted file mode 100644
index d1c23b45..00000000
--- a/packages/coreui-vue/src/components/header/CHeader.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CHeader = defineComponent({
-  name: 'CHeader',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-    /**
-     * Defines optional container wrapping children elements.
-     *
-     * @values boolean, 'sm', 'md', 'lg', 'xl', 'xxl', 'fluid'
-     */
-    container: {
-      type: [Boolean, String],
-      validator: (value: boolean | string) => {
-        return (
-          typeof value === 'boolean' || ['sm', 'md', 'lg', 'xl', 'xxl', 'fluid'].includes(value)
-        )
-      },
-    },
-    /**
-     * Place header in non-static positions.
-     *
-     * @values 'fixed', 'sticky'
-     */
-    position: {
-      type: String,
-      validator: (value: string) => {
-        return ['fixed', 'sticky'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        { class: ['header', { [`header-${props.position}`]: props.position }] },
-        props.container
-          ? h(
-              'div',
-              { class: `container${props.container === true ? '' : '-' + props.container}` },
-              slots.default && slots.default(),
-            )
-          : slots.default && slots.default(),
-      )
-  },
-})
-
-export { CHeader }
diff --git a/packages/coreui-vue/src/components/header/CHeaderBrand.ts b/packages/coreui-vue/src/components/header/CHeaderBrand.ts
deleted file mode 100644
index 3f94fb86..00000000
--- a/packages/coreui-vue/src/components/header/CHeaderBrand.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CHeaderBrand = defineComponent({
-  name: 'CHeaderBrand',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'a',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'header-brand' }, slots.default && slots.default())
-  },
-})
-
-export { CHeaderBrand }
diff --git a/packages/coreui-vue/src/components/header/CHeaderDivider.ts b/packages/coreui-vue/src/components/header/CHeaderDivider.ts
deleted file mode 100644
index 43e47645..00000000
--- a/packages/coreui-vue/src/components/header/CHeaderDivider.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CHeaderDivider = defineComponent({
-  name: 'CHeaderDivider',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'header-divider' }, slots.default && slots.default())
-  },
-})
-
-export { CHeaderDivider }
diff --git a/packages/coreui-vue/src/components/header/CHeaderNav.ts b/packages/coreui-vue/src/components/header/CHeaderNav.ts
deleted file mode 100644
index e34277e0..00000000
--- a/packages/coreui-vue/src/components/header/CHeaderNav.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CHeaderNav = defineComponent({
-  name: 'CHeaderNav',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'ul',
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: 'header-nav',
-          role: 'navigation',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CHeaderNav }
diff --git a/packages/coreui-vue/src/components/header/CHeaderText.ts b/packages/coreui-vue/src/components/header/CHeaderText.ts
deleted file mode 100644
index 8da7dd4f..00000000
--- a/packages/coreui-vue/src/components/header/CHeaderText.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CHeaderText = defineComponent({
-  name: 'CHeaderText',
-  setup(_, { slots }) {
-    return () => h('span', { class: 'header-text' }, slots.default && slots.default())
-  },
-})
-
-export { CHeaderText }
diff --git a/packages/coreui-vue/src/components/header/CHeaderToggler.ts b/packages/coreui-vue/src/components/header/CHeaderToggler.ts
deleted file mode 100644
index 2629e186..00000000
--- a/packages/coreui-vue/src/components/header/CHeaderToggler.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CHeaderToggler = defineComponent({
-  name: 'CHeaderToggler',
-  setup(_, { slots }) {
-    return () =>
-      h(
-        'button',
-        {
-          class: 'header-toggler',
-          type: 'button',
-          'aria-label': 'Toggle navigation',
-        },
-        slots.default ? slots.default() : h('span', { class: ['header-toggler-icon'] }),
-      )
-  },
-})
-
-export { CHeaderToggler }
diff --git a/packages/coreui-vue/src/components/header/__tests__/CHeader.spec.ts b/packages/coreui-vue/src/components/header/__tests__/CHeader.spec.ts
deleted file mode 100644
index 09ec0065..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/CHeader.spec.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CHeader as Component } from '../../../index'
-
-const ComponentName = 'CHeader'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    container: 'lg',
-    position: 'fixed',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    as: 'header',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('header')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('header')).toBe(true)
-    expect(customWrapper.classes('header-fixed')).toBe(true)
-    expect(customWrapper.find('.container-lg').classes('container-lg')).toBe(true)
-  })
-})
-
-
-describe(`Customize (number two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('tag name is custom', () => {
-    expect(customWrapperTwo.element.tagName).toBe('HEADER')
-  })
-})
\ No newline at end of file
diff --git a/packages/coreui-vue/src/components/header/__tests__/CHeaderBrand.spec.ts b/packages/coreui-vue/src/components/header/__tests__/CHeaderBrand.spec.ts
deleted file mode 100644
index 391e1e0d..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/CHeaderBrand.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CHeaderBrand as Component } from '../../../index'
-
-const ComponentName = 'CHeaderBrand'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('header-brand')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('header-brand')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/header/__tests__/CHeaderDivider.spec.ts b/packages/coreui-vue/src/components/header/__tests__/CHeaderDivider.spec.ts
deleted file mode 100644
index 0f6a83c4..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/CHeaderDivider.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CHeaderDivider as Component } from '../../../index'
-
-const ComponentName = 'CHeaderDivider'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('header-divider')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/header/__tests__/CHeaderNav.spec.ts b/packages/coreui-vue/src/components/header/__tests__/CHeaderNav.spec.ts
deleted file mode 100644
index 6564189f..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/CHeaderNav.spec.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CHeaderNav as Component } from '../../../index'
-
-const ComponentName = 'CHeaderNav'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('header-nav')).toBe(true)
-    expect(defaultWrapper.attributes('role')).toBe('navigation')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('header-nav')).toBe(true)
-    expect(customWrapper.attributes('role')).toBe('navigation')
-  })
-})
diff --git a/packages/coreui-vue/src/components/header/__tests__/CHeaderText.spec.ts b/packages/coreui-vue/src/components/header/__tests__/CHeaderText.spec.ts
deleted file mode 100644
index 48638b5b..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/CHeaderText.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CHeaderText as Component } from '../../../index'
-
-const ComponentName = 'CHeaderText'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('header-text')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/header/__tests__/CHeaderToggler.spec.ts b/packages/coreui-vue/src/components/header/__tests__/CHeaderToggler.spec.ts
deleted file mode 100644
index 35c6f4bf..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/CHeaderToggler.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CHeaderToggler as Component } from '../../../index'
-
-const ComponentName = 'CHeaderToggler'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('header-toggler')).toBe(true)
-    expect(defaultWrapper.attributes('type')).toBe('button')
-    expect(defaultWrapper.attributes('aria-label')).toBe('Toggle navigation')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('header-toggler')).toBe(true)
-    expect(customWrapper.attributes('type')).toBe('button')
-    expect(customWrapper.attributes('aria-label')).toBe('Toggle navigation')
-    expect(customWrapper.find('span').classes('header-toggler-icon')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeader.spec.ts.snap b/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeader.spec.ts.snap
deleted file mode 100644
index 565c875c..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeader.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CHeader component renders correctly 1`] = `
-"<div class="header header-fixed">
-  <div class="container-lg">Default slot</div>
-</div>"
-`;
-
-exports[`Loads and display CHeader component renders correctly 1`] = `"<div class="header">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderBrand.spec.ts.snap b/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderBrand.spec.ts.snap
deleted file mode 100644
index a2b61995..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderBrand.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CHeaderBrand component renders correctly 1`] = `"<div class="header-brand">Default slot</div>"`;
-
-exports[`Loads and display CHeaderBrand component renders correctly 1`] = `"<a class="header-brand">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderDivider.spec.ts.snap b/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderDivider.spec.ts.snap
deleted file mode 100644
index 36376c1f..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderDivider.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CHeaderDivider component renders correctly 1`] = `"<div class="header-divider">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderNav.spec.ts.snap b/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderNav.spec.ts.snap
deleted file mode 100644
index 0e33b9b4..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderNav.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CHeaderNav component renders correctly 1`] = `"<div class="header-nav" role="navigation">Default slot</div>"`;
-
-exports[`Loads and display CHeaderNav component renders correctly 1`] = `"<ul class="header-nav" role="navigation">Default slot</ul>"`;
diff --git a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderText.spec.ts.snap b/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderText.spec.ts.snap
deleted file mode 100644
index c9a6a8f4..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderText.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CHeaderText component renders correctly 1`] = `"<span class="header-text">Default slot</span>"`;
diff --git a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderToggler.spec.ts.snap b/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderToggler.spec.ts.snap
deleted file mode 100644
index c0da6cf0..00000000
--- a/packages/coreui-vue/src/components/header/__tests__/__snapshots__/CHeaderToggler.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CHeaderToggler component renders correctly 1`] = `"<button class="header-toggler" type="button" aria-label="Toggle navigation"><span class="header-toggler-icon"></span></button>"`;
-
-exports[`Loads and display CHeaderToggler component renders correctly 1`] = `"<button class="header-toggler" type="button" aria-label="Toggle navigation">Default slot</button>"`;
diff --git a/packages/coreui-vue/src/components/header/index.ts b/packages/coreui-vue/src/components/header/index.ts
deleted file mode 100644
index 85c25975..00000000
--- a/packages/coreui-vue/src/components/header/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { App } from 'vue'
-import { CHeader } from './CHeader'
-import { CHeaderBrand } from './CHeaderBrand'
-import { CHeaderDivider } from './CHeaderDivider'
-import { CHeaderNav } from './CHeaderNav'
-import { CHeaderText } from './CHeaderText'
-import { CHeaderToggler } from './CHeaderToggler'
-
-const CHeaderPlugin = {
-  install: (app: App): void => {
-    app.component(CHeader.name as string, CHeader)
-    app.component(CHeaderBrand.name as string, CHeaderBrand)
-    app.component(CHeaderDivider.name as string, CHeaderDivider)
-    app.component(CHeaderNav.name as string, CHeaderNav)
-    app.component(CHeaderText.name as string, CHeaderText)
-    app.component(CHeaderToggler.name as string, CHeaderToggler)
-  },
-}
-
-export {
-  CHeaderPlugin,
-  CHeader,
-  CHeaderBrand,
-  CHeaderDivider,
-  CHeaderNav,
-  CHeaderText,
-  CHeaderToggler,
-}
diff --git a/packages/coreui-vue/src/components/image/CImage.ts b/packages/coreui-vue/src/components/image/CImage.ts
deleted file mode 100644
index 9d122ee3..00000000
--- a/packages/coreui-vue/src/components/image/CImage.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CImage = defineComponent({
-  name: 'CImage',
-  props: {
-    /**
-     * Set the horizontal aligment.
-     *
-     * @values 'start', 'center', 'end'
-     */
-    align: {
-      type: String,
-      validator: (value: string) => {
-        return ['start', 'center', 'end'].includes(value)
-      },
-    },
-    /**
-     * Make image responsive.
-     */
-    fluid: Boolean,
-    /**
-     * Make image rounded.
-     */
-    rounded: Boolean,
-    /**
-     * Give an image a rounded 1px border appearance.
-     */
-    thumbnail: Boolean,
-  },
-  setup(props) {
-    return () =>
-      h('img', {
-        class: [
-          {
-            [`float-${props.align}`]:
-              props.align && (props.align === 'start' || props.align === 'end'),
-            'd-block mx-auto': props.align && props.align === 'center',
-            'img-fluid': props.fluid,
-            rounded: props.rounded,
-            'img-thumbnail': props.thumbnail,
-          },
-        ],
-      })
-  },
-})
-export { CImage }
diff --git a/packages/coreui-vue/src/components/image/__tests__/CImage.spec.ts b/packages/coreui-vue/src/components/image/__tests__/CImage.spec.ts
deleted file mode 100644
index c7c18545..00000000
--- a/packages/coreui-vue/src/components/image/__tests__/CImage.spec.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CImage as Component } from '../../../index'
-
-const ComponentName = 'CImage'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    align: 'end',
-    fluid: true,
-    rounded: true,
-    thumbnail: true,
-  },
-  slots: {},
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    align: 'center',
-  },
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('float-end')).toBe(true)
-    expect(customWrapper.classes('img-fluid')).toBe(true)
-    expect(customWrapper.classes('rounded')).toBe(true)
-    expect(customWrapper.classes('img-thumbnail')).toBe(true)
-  })
-})
-
-describe(`Customize (two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.classes('d-block')).toBe(true)
-    expect(customWrapperTwo.classes('mx-auto')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/image/__tests__/__snapshots__/CImage.spec.ts.snap b/packages/coreui-vue/src/components/image/__tests__/__snapshots__/CImage.spec.ts.snap
deleted file mode 100644
index 808f6428..00000000
--- a/packages/coreui-vue/src/components/image/__tests__/__snapshots__/CImage.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (two) CImage component renders correctly 1`] = `"<img class="d-block mx-auto">"`;
-
-exports[`Customize CImage component renders correctly 1`] = `"<img class="float-end img-fluid rounded img-thumbnail">"`;
-
-exports[`Loads and display CImage component renders correctly 1`] = `"<img class="">"`;
diff --git a/packages/coreui-vue/src/components/image/index.ts b/packages/coreui-vue/src/components/image/index.ts
deleted file mode 100644
index cd4c69ae..00000000
--- a/packages/coreui-vue/src/components/image/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CImage } from './CImage'
-
-const CImagePlugin = {
-  install: (app: App): void => {
-    app.component(CImage.name as string, CImage)
-  },
-}
-
-export { CImagePlugin, CImage }
diff --git a/packages/coreui-vue/src/components/index.ts b/packages/coreui-vue/src/components/index.ts
deleted file mode 100644
index d11d5eb0..00000000
--- a/packages/coreui-vue/src/components/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-export * from './accordion'
-export * from './alert'
-export * from './avatar'
-export * from './backdrop'
-export * from './badge'
-export * from './breadcrumb'
-export * from './button'
-export * from './button-group'
-export * from './callout'
-export * from './card'
-export * from './carousel'
-export * from './close-button'
-export * from './collapse'
-export * from './conditional-teleport'
-export * from './dropdown'
-export * from './footer'
-export * from './form'
-export * from './grid'
-export * from './header'
-export * from './image'
-export * from './link'
-export * from './list-group'
-export * from './modal'
-export * from './nav'
-export * from './navbar'
-export * from './offcanvas'
-export * from './pagination'
-export * from './placeholder'
-export * from './progress'
-export * from './popover'
-export * from './sidebar'
-export * from './spinner'
-export * from './table'
-export * from './tabs'
-export * from './toast'
-export * from './tooltip'
-export * from './widgets'
diff --git a/packages/coreui-vue/src/components/link/CLink.ts b/packages/coreui-vue/src/components/link/CLink.ts
deleted file mode 100644
index 78369306..00000000
--- a/packages/coreui-vue/src/components/link/CLink.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CLink = defineComponent({
-  name: 'CLink',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'a',
-    },
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: String,
-  },
-  emits: [
-    /**
-     * Event called when the user clicks on the component.
-     */
-    'click',
-  ],
-  setup(props, { slots, emit }) {
-    const handleClick = (event: Event) => {
-      emit('click', props.href)
-
-      if (props.href === '' || props.href === '#') {
-        event.preventDefault()
-      }
-    }
-    return () =>
-      h(
-        props.as,
-        {
-          class: [{ active: props.active, disabled: props.disabled }],
-          ...(props.active && { 'aria-current': 'page' }),
-          ...(props.as === 'a' && props.disabled && { 'aria-disabled': true, tabIndex: -1 }),
-          ...((props.as === 'a' || props.as === 'button') && {
-            onClick: handleClick,
-          }),
-          href: props.href,
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CLink }
diff --git a/packages/coreui-vue/src/components/link/__tests__/CLink.spec.ts b/packages/coreui-vue/src/components/link/__tests__/CLink.spec.ts
deleted file mode 100644
index 59a21a9c..00000000
--- a/packages/coreui-vue/src/components/link/__tests__/CLink.spec.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CLink as Component } from '../../../index'
-
-const ComponentName = 'CLink'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    disabled: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    as: 'div',
-    disabled: true,
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.attributes('aria-disabled')).toBe('true')
-    expect(defaultWrapper.attributes('tabindex')).toBe('-1')
-  })
-  it('emit event on click', () => {
-    defaultWrapper.trigger('click')
-    const incrementEvent = defaultWrapper.emitted('click')
-    expect(incrementEvent).toHaveLength(1)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.attributes('aria-current')).toBe('page')
-    expect(customWrapper.attributes('href')).toBe('/bazinga')
-  })
-})
diff --git a/packages/coreui-vue/src/components/link/__tests__/__snapshots__/CLink.spec.ts.snap b/packages/coreui-vue/src/components/link/__tests__/__snapshots__/CLink.spec.ts.snap
deleted file mode 100644
index ab1d8241..00000000
--- a/packages/coreui-vue/src/components/link/__tests__/__snapshots__/CLink.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CLink component renders correctly 1`] = `"<div class="active disabled" aria-current="page" href="/bazinga">Default slot</div>"`;
-
-exports[`Loads and display CLink component renders correctly 1`] = `"<a class="disabled" aria-disabled="true" tabindex="-1">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/link/index.ts b/packages/coreui-vue/src/components/link/index.ts
deleted file mode 100644
index 04be72dd..00000000
--- a/packages/coreui-vue/src/components/link/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CLink } from './CLink'
-
-const CCLinkPlugin = {
-  install: (app: App): void => {
-    app.component(CLink.name as string, CLink)
-  },
-}
-
-export { CCLinkPlugin, CLink }
diff --git a/packages/coreui-vue/src/components/list-group/CListGroup.ts b/packages/coreui-vue/src/components/list-group/CListGroup.ts
deleted file mode 100644
index 9a565fe0..00000000
--- a/packages/coreui-vue/src/components/list-group/CListGroup.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CListGroup = defineComponent({
-  name: 'CListGroup',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'ul',
-    },
-    /**
-     * Remove some borders and rounded corners to render list group items edge-to-edge in a parent component (e.g., `<CCard>`)
-     */
-    flush: Boolean,
-    /**
-     * Specify a layout type.
-     *
-     * @values 'horizontal', 'horizontal-sm', 'horizontal-md', 'horizontal-lg', 'horizontal-xl', 'horizontal-xxl',
-     */
-    layout: {
-      type: String,
-      validator: (value: string) => {
-        return [
-          'horizontal',
-          'horizontal-sm',
-          'horizontal-md',
-          'horizontal-lg',
-          'horizontal-xl',
-          'horizontal-xxl',
-        ].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            'list-group',
-            {
-              'list-group-flush': props.flush,
-              [`list-group-${props.layout}`]: props.layout,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CListGroup }
diff --git a/packages/coreui-vue/src/components/list-group/CListGroupItem.ts b/packages/coreui-vue/src/components/list-group/CListGroupItem.ts
deleted file mode 100644
index 204df42f..00000000
--- a/packages/coreui-vue/src/components/list-group/CListGroupItem.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CListGroupItem = defineComponent({
-  name: 'CListGroupItem',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'li',
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            'list-group-item',
-            {
-              [`list-group-item-${props.color}`]: props.color,
-              'list-group-item-action': props.as === 'a' || props.as === 'button',
-              [`active`]: props.active,
-              [`disabled`]: props.disabled,
-            },
-          ],
-          ...((props.as === 'a' || props.as === 'button') && {
-            active: props.active,
-            disabled: props.disabled,
-          }),
-          ...(props.active && { 'aria-current': true }),
-          ...(props.disabled && { 'aria-disabled': true }),
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CListGroupItem }
diff --git a/packages/coreui-vue/src/components/list-group/__tests__/CListGroup.spec.ts b/packages/coreui-vue/src/components/list-group/__tests__/CListGroup.spec.ts
deleted file mode 100644
index f80906c1..00000000
--- a/packages/coreui-vue/src/components/list-group/__tests__/CListGroup.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CListGroup as Component } from '../../../index'
-
-const ComponentName = 'CListGroup'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-    flush: true,
-    layout: 'horizontal-lg',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('list-group')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('list-group')).toBe(true)
-    expect(customWrapper.classes('list-group-flush')).toBe(true)
-    expect(customWrapper.classes('list-group-horizontal-lg')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/list-group/__tests__/CListGroupItem.spec.ts b/packages/coreui-vue/src/components/list-group/__tests__/CListGroupItem.spec.ts
deleted file mode 100644
index 763880b5..00000000
--- a/packages/coreui-vue/src/components/list-group/__tests__/CListGroupItem.spec.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CListGroupItem as Component } from '../../../index'
-
-const ComponentName = 'CListGroupItem'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    as: 'div',
-    color: 'warning',
-    disabled: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    active: true,
-    as: 'button',
-    disabled: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('list-group-item')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('list-group-item')).toBe(true)
-    expect(customWrapper.classes('list-group-item-warning')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.attributes('aria-current')).toBe('true')
-    expect(customWrapper.attributes('aria-disabled')).toBe('true')
-  })
-})
-
-describe(`Customize (two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.text()).toContain('Default slot')
-    expect(customWrapperTwo.classes('list-group-item')).toBe(true)
-    expect(customWrapperTwo.classes('list-group-item-action')).toBe(true)
-    expect(customWrapperTwo.attributes('active')).toBe('true')
-    expect(customWrapperTwo.attributes('disabled')).toBe('')
-  })
-})
diff --git a/packages/coreui-vue/src/components/list-group/__tests__/__snapshots__/CListGroup.spec.ts.snap b/packages/coreui-vue/src/components/list-group/__tests__/__snapshots__/CListGroup.spec.ts.snap
deleted file mode 100644
index dca65991..00000000
--- a/packages/coreui-vue/src/components/list-group/__tests__/__snapshots__/CListGroup.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CListGroup component renders correctly 1`] = `"<div class="list-group list-group-flush list-group-horizontal-lg">Default slot</div>"`;
-
-exports[`Loads and display CListGroup component renders correctly 1`] = `"<ul class="list-group">Default slot</ul>"`;
diff --git a/packages/coreui-vue/src/components/list-group/__tests__/__snapshots__/CListGroupItem.spec.ts.snap b/packages/coreui-vue/src/components/list-group/__tests__/__snapshots__/CListGroupItem.spec.ts.snap
deleted file mode 100644
index 198cf490..00000000
--- a/packages/coreui-vue/src/components/list-group/__tests__/__snapshots__/CListGroupItem.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (two) CListGroupItem component renders correctly 1`] = `"<button class="list-group-item list-group-item-action active disabled" active="true" disabled="" aria-current="true" aria-disabled="true">Default slot</button>"`;
-
-exports[`Customize CListGroupItem component renders correctly 1`] = `"<div class="list-group-item list-group-item-warning active disabled" aria-current="true" aria-disabled="true">Default slot</div>"`;
-
-exports[`Loads and display CListGroupItem component renders correctly 1`] = `"<li class="list-group-item">Default slot</li>"`;
diff --git a/packages/coreui-vue/src/components/list-group/index.ts b/packages/coreui-vue/src/components/list-group/index.ts
deleted file mode 100644
index d969a028..00000000
--- a/packages/coreui-vue/src/components/list-group/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { App } from 'vue'
-import { CListGroup } from './CListGroup'
-import { CListGroupItem } from './CListGroupItem'
-
-const CListGroupPlugin = {
-  install: (app: App): void => {
-    app.component(CListGroup.name as string, CListGroup)
-    app.component(CListGroupItem.name as string, CListGroupItem)
-  },
-}
-
-export { CListGroupPlugin, CListGroup, CListGroupItem }
diff --git a/packages/coreui-vue/src/components/modal/CModal.ts b/packages/coreui-vue/src/components/modal/CModal.ts
deleted file mode 100644
index e2e1947d..00000000
--- a/packages/coreui-vue/src/components/modal/CModal.ts
+++ /dev/null
@@ -1,321 +0,0 @@
-import {
-  defineComponent,
-  h,
-  PropType,
-  provide,
-  ref,
-  RendererElement,
-  Transition,
-  vShow,
-  watch,
-  withDirectives,
-} from 'vue'
-
-import { CBackdrop } from '../backdrop/CBackdrop'
-import { CConditionalTeleport } from '../conditional-teleport'
-
-import { executeAfterTransition } from '../../utils/transition'
-
-const CModal = defineComponent({
-  name: 'CModal',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Align the modal in the center or top of the screen.
-     *
-     * @values 'top', 'center'
-     */
-    alignment: {
-      default: 'top',
-      validator: (value: string) => {
-        return ['top', 'center'].includes(value)
-      },
-    },
-    /**
-     * Apply a backdrop on body while offcanvas is open.
-     *
-     * @values boolean | 'static'
-     */
-    backdrop: {
-      type: [Boolean, String],
-      default: true,
-      validator: (value: boolean | string) => {
-        if (typeof value == 'string') {
-          return ['static'].includes(value)
-        }
-        if (typeof value == 'boolean') {
-          return true
-        }
-        return false
-      },
-    },
-    /**
-     * Appends the vue popover to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
-     *
-     * @since 5.3.0
-     */
-    container: {
-      type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
-      default: 'body',
-    },
-    /**
-     * A string of all className you want applied to the modal content component.
-     */
-    contentClassName: String,
-    /**
-     * Puts the focus on the modal when shown.
-     *
-     * @since 5.0.0
-     */
-    focus: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Set modal to covers the entire user viewport
-     *
-     * @values boolean, 'sm', 'md', 'lg', 'xl', 'xxl'
-     */
-    fullscreen: {
-      type: [Boolean, String],
-      validator: (value: boolean | string) => {
-        if (typeof value == 'string') {
-          return ['sm', 'md', 'lg', 'xl', 'xxl'].includes(value)
-        }
-        if (typeof value == 'boolean') {
-          return true
-        }
-        return false
-      },
-    },
-    /**
-     * Closes the modal when escape key is pressed.
-     */
-    keyboard: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Create a scrollable modal that allows scrolling the modal body.
-     */
-    scrollable: Boolean,
-    /**
-     * Size the component small, large, or extra large.
-     *
-     * @values 'sm', 'lg', 'xl'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg', 'xl'].includes(value)
-      },
-    },
-    /**
-     * Generates modal using Teleport.
-     *
-     * @since 5.3.0
-     */
-    teleport: {
-      type: Boolean,
-      default: false,
-    },
-    /**
-     * Remove animation to create modal that simply appear rather than fade in to view.
-     */
-    transition: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * By default the component is unmounted after close animation, if you want to keep the component mounted set this property to false.
-     */
-    unmountOnClose: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Toggle the visibility of alert component.
-     */
-    visible: Boolean,
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be closed.
-     */
-    'close',
-    /**
-     * Callback fired when the component requests to be closed.
-     */
-    'close-prevented',
-    /**
-     * Callback fired when the modal is shown, its backdrop is static and a click outside the modal or an escape key press is performed with the keyboard option set to false.
-     */
-    'show',
-  ],
-  setup(props, { slots, attrs, emit }) {
-    const activeElementRef = ref()
-    const modalRef = ref()
-    const modalContentRef = ref()
-    const visible = ref(props.visible)
-
-    watch(
-      () => props.visible,
-      () => {
-        visible.value = props.visible
-      },
-    )
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      activeElementRef.value = document.activeElement as HTMLElement | null
-      executeAfterTransition(() => done(), el as HTMLElement)
-      document.body.classList.add('modal-open')
-      document.body.style.overflow = 'hidden'
-      document.body.style.paddingRight = '0px'
-      el.style.display = 'block'
-      setTimeout(() => {
-        el.classList.add('show')
-      }, 1)
-      emit('show')
-    }
-
-    const handleAfterEnter = () => {
-      props.focus && modalRef.value?.focus()
-      window.addEventListener('mousedown', handleMouseDown)
-      window.addEventListener('keyup', handleKeyUp)
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      executeAfterTransition(() => done(), el as HTMLElement)
-      document.body.classList.remove('modal-open')
-      document.body.style.removeProperty('overflow')
-      document.body.style.removeProperty('padding-right')
-      if (document.body.className === '') {
-        document.body.removeAttribute('class')
-      }
-
-      el.classList.remove('show')
-    }
-
-    const handleAfterLeave = (el: RendererElement) => {
-      activeElementRef.value?.focus()
-      window.removeEventListener('mousedown', handleMouseDown)
-      window.removeEventListener('keyup', handleKeyUp)
-      el.style.display = 'none'
-    }
-
-    const handleDismiss = () => {
-      emit('close')
-      visible.value = false
-    }
-
-    const handleKeyUp = (event: KeyboardEvent) => {
-      if (modalContentRef.value && !modalContentRef.value.contains(event.target as HTMLElement)) {
-        if (props.backdrop !== 'static' && event.key === 'Escape' && props.keyboard) {
-          handleDismiss()
-        }
-
-        if (props.backdrop === 'static') {
-          modalRef.value.classList.add('modal-static')
-          emit('close-prevented')
-          setTimeout(() => {
-            modalRef.value.classList.remove('modal-static')
-          }, 300)
-        }
-      }
-    }
-
-    const handleMouseDown = (event: Event) => {
-      window.addEventListener('mouseup', () => handleMouseUp(event), { once: true })
-    }
-
-    const handleMouseUp = (event: Event) => {
-      if (modalContentRef.value && !modalContentRef.value.contains(event.target as HTMLElement)) {
-        if (props.backdrop !== 'static') {
-          handleDismiss()
-        }
-
-        if (props.backdrop === 'static') {
-          modalRef.value.classList.add('modal-static')
-          setTimeout(() => {
-            modalRef.value.classList.remove('modal-static')
-          }, 300)
-        }
-      }
-    }
-
-    provide('handleDismiss', handleDismiss)
-
-    const modal = () =>
-      h(
-        'div',
-        {
-          ...attrs,
-          class: [
-            'modal',
-            {
-              ['fade']: props.transition,
-            },
-            attrs.class,
-          ],
-          ...(visible.value ? { 'aria-modal': true, role: 'dialog' } : { 'aria-hidden': 'true' }),
-          ref: modalRef,
-        },
-        h(
-          'div',
-          {
-            class: [
-              'modal-dialog',
-              {
-                'modal-dialog-centered': props.alignment === 'center',
-                [`modal-fullscreen-${props.fullscreen}-down`]:
-                  props.fullscreen && typeof props.fullscreen === 'string',
-                'modal-fullscreen': props.fullscreen && typeof props.fullscreen === 'boolean',
-                ['modal-dialog-scrollable']: props.scrollable,
-                [`modal-${props.size}`]: props.size,
-              },
-            ],
-          },
-          h(
-            'div',
-            { class: ['modal-content', props.contentClassName], ref: modalContentRef },
-            slots.default && slots.default(),
-          ),
-        ),
-      )
-
-    return () =>
-      h(
-        CConditionalTeleport,
-        {
-          container: props.container,
-          teleport: props.teleport,
-        },
-        {
-          default: () => [
-            h(
-              Transition,
-              {
-                css: false,
-                onEnter: (el, done) => handleEnter(el, done),
-                onAfterEnter: () => handleAfterEnter(),
-                onLeave: (el, done) => handleLeave(el, done),
-                onAfterLeave: (el) => handleAfterLeave(el),
-              },
-              () =>
-                props.unmountOnClose
-                  ? visible.value && modal()
-                  : withDirectives(modal(), [[vShow, visible.value]]),
-            ),
-            props.backdrop &&
-              h(CBackdrop, {
-                class: 'modal-backdrop',
-                visible: visible.value,
-              }),
-          ],
-        },
-      )
-  },
-})
-
-export { CModal }
diff --git a/packages/coreui-vue/src/components/modal/CModalBody.ts b/packages/coreui-vue/src/components/modal/CModalBody.ts
deleted file mode 100644
index 9e6f8597..00000000
--- a/packages/coreui-vue/src/components/modal/CModalBody.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CModalBody = defineComponent({
-  name: 'CModalBody',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'modal-body' }, slots.default && slots.default())
-  },
-})
-
-export { CModalBody }
diff --git a/packages/coreui-vue/src/components/modal/CModalFooter.ts b/packages/coreui-vue/src/components/modal/CModalFooter.ts
deleted file mode 100644
index b9721746..00000000
--- a/packages/coreui-vue/src/components/modal/CModalFooter.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CModalFooter = defineComponent({
-  name: 'CModalFooter',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'modal-footer' }, slots.default && slots.default())
-  },
-})
-
-export { CModalFooter }
diff --git a/packages/coreui-vue/src/components/modal/CModalHeader.ts b/packages/coreui-vue/src/components/modal/CModalHeader.ts
deleted file mode 100644
index 108a8ff2..00000000
--- a/packages/coreui-vue/src/components/modal/CModalHeader.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { defineComponent, h, inject } from 'vue'
-
-import { CCloseButton } from '../close-button/CCloseButton'
-
-const CModalHeader = defineComponent({
-  name: 'CModalHeader',
-  props: {
-    /**
-     * Add a close button component to the header.
-     */
-    closeButton: {
-      type: Boolean,
-      default: true,
-    },
-  },
-  setup(props, { slots }) {
-    const handleDismiss = inject('handleDismiss') as () => void
-    return () =>
-      h('span', { class: 'modal-header' }, [
-        slots.default && slots.default(),
-        props.closeButton && h(CCloseButton, { onClick: () => handleDismiss() }, ''),
-      ])
-  },
-})
-
-export { CModalHeader }
diff --git a/packages/coreui-vue/src/components/modal/CModalTitle.ts b/packages/coreui-vue/src/components/modal/CModalTitle.ts
deleted file mode 100644
index a845f68c..00000000
--- a/packages/coreui-vue/src/components/modal/CModalTitle.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CModalTitle = defineComponent({
-  name: 'CModalTitle',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'h5',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'modal-title' }, slots.default && slots.default())
-  },
-})
-
-export { CModalTitle }
diff --git a/packages/coreui-vue/src/components/modal/__tests__/CModal.spec.ts b/packages/coreui-vue/src/components/modal/__tests__/CModal.spec.ts
deleted file mode 100644
index 93f86be3..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/CModal.spec.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CModal as Component } from '../../../index'
-
-const ComponentName = 'CModal'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    fullscreen: true,
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    alignment: 'center',
-    backdrop: false,
-    contentClassName: 'bazinga',
-    fullscreen: 'lg',
-    keyboard: true,
-    scrollable: true,
-    size: 'lg',
-    transition: false,
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('.modal').classes('modal')).toBe(true)
-    expect(defaultWrapper.find('.modal').classes('fade')).toBe(true)
-    expect(defaultWrapper.find('.modal-dialog').classes('modal-dialog')).toBe(true)
-    expect(defaultWrapper.find('.modal-dialog').classes('modal-fullscreen')).toBe(true)
-    expect(defaultWrapper.find('.modal-content').classes('modal-content')).toBe(true)
-    expect(defaultWrapper.find('.modal-backdrop').classes('modal-backdrop')).toBe(true)
-  })
-  /*
-  it('event on click backdrop', async () => {
-    await defaultWrapper.find('.modal-backdrop').trigger('click')
-    const incrementEvent = defaultWrapper.emitted('dismiss')
-    expect(incrementEvent).toHaveLength(1)
-  })
-  */
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('.modal').classes('modal')).toBe(true)
-    expect(customWrapper.find('.modal-dialog').classes('modal-dialog')).toBe(true)
-    expect(customWrapper.find('.modal-dialog').classes('modal-dialog-centered')).toBe(true)
-    expect(customWrapper.find('.modal-dialog').classes('modal-fullscreen-lg-down')).toBe(true)
-    expect(customWrapper.find('.modal-dialog').classes('modal-dialog-scrollable')).toBe(true)
-    expect(customWrapper.find('.modal-dialog').classes('modal-lg')).toBe(true)
-    expect(customWrapper.find('.modal-content').classes('modal-content')).toBe(true)
-    expect(customWrapper.find('.modal-content').classes('bazinga')).toBe(true)
-  })
-  /*
-
-  TODO: Test keyup and click on backdrop (events are init on transition onAfterEnter)
-
-  it('event on keyup', async () => {
-    await nextTick()
-    await customWrapper.trigger('keyup', {
-      keyCode: 27
-    })
-    const incrementEvent = customWrapper.emitted('dismiss')
-    expect(incrementEvent).toHaveLength(1)
-  })
-  */
-})
diff --git a/packages/coreui-vue/src/components/modal/__tests__/CModalBody.spec.ts b/packages/coreui-vue/src/components/modal/__tests__/CModalBody.spec.ts
deleted file mode 100644
index 18e96d7c..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/CModalBody.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CModalBody as Component } from '../../../index'
-
-const ComponentName = 'CModalBody'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('modal-body')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/modal/__tests__/CModalFooter.spec.ts b/packages/coreui-vue/src/components/modal/__tests__/CModalFooter.spec.ts
deleted file mode 100644
index 7be6fb79..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/CModalFooter.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CModalFooter as Component } from '../../../index'
-
-const ComponentName = 'CModalFooter'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('modal-footer')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/modal/__tests__/CModalHeader.spec.ts b/packages/coreui-vue/src/components/modal/__tests__/CModalHeader.spec.ts
deleted file mode 100644
index 6a2cba15..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/CModalHeader.spec.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CModalHeader as Component } from '../../../index'
-
-const ComponentName = 'CModalHeader'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    closeButton: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('modal-header')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('modal-header')).toBe(true)
-    expect(customWrapper.find('button').classes('btn')).toBe(true)
-    expect(customWrapper.find('button').classes('btn-close')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/modal/__tests__/CModalTitle.spec.ts b/packages/coreui-vue/src/components/modal/__tests__/CModalTitle.spec.ts
deleted file mode 100644
index 387f355d..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/CModalTitle.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CModalTitle as Component } from '../../../index'
-
-const ComponentName = 'CModalTitle'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('modal-title')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('modal-title')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap b/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap
deleted file mode 100644
index b818db63..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap
+++ /dev/null
@@ -1,24 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CModal component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="false">
-  <div class="modal" aria-modal="true" role="dialog">
-    <div class="modal-dialog modal-dialog-centered modal-fullscreen-lg-down modal-dialog-scrollable modal-lg">
-      <div class="modal-content bazinga">Default slot</div>
-    </div>
-  </div>
-</transition-stub>"
-`;
-
-exports[`Loads and display CModal component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="false">
-  <div class="modal fade" aria-modal="true" role="dialog">
-    <div class="modal-dialog modal-fullscreen">
-      <div class="modal-content">Default slot</div>
-    </div>
-  </div>
-</transition-stub>
-<transition-stub appear="false" persisted="false" css="true" class="modal-backdrop">
-  <div class="fade"></div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalBody.spec.ts.snap b/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalBody.spec.ts.snap
deleted file mode 100644
index b3bcb34c..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalBody.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CModalBody component renders correctly 1`] = `"<div class="modal-body">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalFooter.spec.ts.snap b/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalFooter.spec.ts.snap
deleted file mode 100644
index a87577d0..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalFooter.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CModalFooter component renders correctly 1`] = `"<div class="modal-footer">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalHeader.spec.ts.snap b/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalHeader.spec.ts.snap
deleted file mode 100644
index abeb2a67..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalHeader.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CModalHeader component renders correctly 1`] = `"<span class="modal-header">Default slot<button type="button" class="btn btn-close" aria-label="Close"></button></span>"`;
-
-exports[`Loads and display CModalHeader component renders correctly 1`] = `"<span class="modal-header">Default slot<button type="button" class="btn btn-close" aria-label="Close"></button></span>"`;
diff --git a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalTitle.spec.ts.snap b/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalTitle.spec.ts.snap
deleted file mode 100644
index fe60a9b6..00000000
--- a/packages/coreui-vue/src/components/modal/__tests__/__snapshots__/CModalTitle.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CModalTitle component renders correctly 1`] = `"<div class="modal-title">Default slot</div>"`;
-
-exports[`Loads and display CModalTitle component renders correctly 1`] = `"<h5 class="modal-title">Default slot</h5>"`;
diff --git a/packages/coreui-vue/src/components/modal/index.ts b/packages/coreui-vue/src/components/modal/index.ts
deleted file mode 100644
index 4ebad336..00000000
--- a/packages/coreui-vue/src/components/modal/index.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { App } from 'vue'
-import { CModal } from './CModal'
-import { CModalBody } from './CModalBody'
-import { CModalFooter } from './CModalFooter'
-import { CModalHeader } from './CModalHeader'
-import { CModalTitle } from './CModalTitle'
-
-const CModalPlugin = {
-  install: (app: App): void => {
-    app.component(CModal.name as string, CModal)
-    app.component(CModalBody.name as string, CModalBody)
-    app.component(CModalFooter.name as string, CModalFooter)
-    app.component(CModalHeader.name as string, CModalHeader)
-    app.component(CModalTitle.name as string, CModalTitle)
-  },
-}
-
-export { CModalPlugin, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle }
diff --git a/packages/coreui-vue/src/components/nav/CNav.ts b/packages/coreui-vue/src/components/nav/CNav.ts
deleted file mode 100644
index 6b5b7384..00000000
--- a/packages/coreui-vue/src/components/nav/CNav.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNav = defineComponent({
-  name: 'CNav',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'ul',
-    },
-    /**
-     * Specify a layout type for component.
-     *
-     * @values 'fill', 'justified'
-     */
-    layout: {
-      type: String,
-      validator: (value: string) => {
-        return ['fill', 'justified'].includes(value)
-      },
-    },
-    /**
-     * Set the nav variant to tabs or pills.
-     *
-     * @values 'enclosed', 'enclosed-pills', 'pills', 'tabs', 'underline', 'underline-border'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return ['enclosed', 'enclosed-pills', 'pills', 'tabs', 'underline', 'underline-border'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            'nav',
-            props.variant === 'enclosed-pills' && 'nav-enclosed',
-            {
-              [`nav-${props.layout}`]: props.layout,
-              [`nav-${props.variant}`]: props.variant,
-            },
-          ],
-          role: 'navigation',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CNav }
diff --git a/packages/coreui-vue/src/components/nav/CNavGroup.ts b/packages/coreui-vue/src/components/nav/CNavGroup.ts
deleted file mode 100644
index 7c45bd7c..00000000
--- a/packages/coreui-vue/src/components/nav/CNavGroup.ts
+++ /dev/null
@@ -1,167 +0,0 @@
-import { defineComponent, h, onMounted, ref, RendererElement, Transition, watch } from 'vue'
-
-import { executeAfterTransition } from '../../utils/transition'
-
-const CNavGroup = defineComponent({
-  name: 'CNavGroup',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'li',
-    },
-    /**
-     * Make nav group more compact by cutting all `padding` in half.
-     */
-    compact: Boolean,
-    /**
-     * Show nav group items.
-     */
-    visible: Boolean,
-  },
-  emits: ['visible-change'],
-  setup(props, { slots, emit }) {
-    const visible = ref()
-    const navGroupRef = ref()
-    const visibleGroup = ref()
-
-    const handleVisibleChange = (visible: boolean, index: number) => {
-      if (visible) {
-        visibleGroup.value = index
-      } else {
-        if (visibleGroup.value === index) {
-          visibleGroup.value = 0
-        }
-      }
-    }
-
-    const isVisible = (index: number) => Boolean(visibleGroup.value === index)
-
-    onMounted(() => {
-      visible.value = props.visible
-      if (props.visible) {
-        navGroupRef.value.classList.add('show')
-      }
-
-      emit('visible-change', visible.value)
-    })
-
-    watch(
-      () => props.visible,
-      () => {
-        visible.value = props.visible
-
-        if (visible.value === false) {
-          visibleGroup.value = undefined
-        }
-      },
-    )
-
-    watch(visible, () => {
-      emit('visible-change', visible.value)
-    })
-
-    const handleTogglerClick = (event: Event) => {
-      event.preventDefault()
-      visible.value = !visible.value
-      emit('visible-change', visible.value)
-    }
-
-    const handleBeforeEnter = (el: RendererElement) => {
-      el.style.height = '0px'
-      navGroupRef.value.classList.add('show')
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      executeAfterTransition(() => done(), el as HTMLElement)
-      el.style.height = `${el.scrollHeight}px`
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleAfterEnter = (el: RendererElement) => {
-      el.style.height = 'auto'
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleBeforeLeave = (el: RendererElement) => {
-      el.style.height = `${el.scrollHeight}px`
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      executeAfterTransition(() => done(), el as HTMLElement)
-      setTimeout(() => {
-        el.style.height = '0px'
-      }, 1)
-    }
-
-    const handleAfterLeave = () => {
-      navGroupRef.value.classList.remove('show')
-    }
-
-    return () =>
-      h(
-        props.as,
-        {
-          class: 'nav-group',
-          ref: navGroupRef,
-        },
-        [
-          slots.togglerContent &&
-            h(
-              'a',
-              {
-                class: ['nav-link', 'nav-group-toggle'],
-                href: '#',
-                onClick: handleTogglerClick,
-              },
-              slots.togglerContent && slots.togglerContent(),
-            ),
-          h(
-            Transition,
-            {
-              css: false,
-              onBeforeEnter: (el) => handleBeforeEnter(el),
-              onEnter: (el, done) => handleEnter(el, done),
-              onAfterEnter: (el) => handleAfterEnter(el),
-              onBeforeLeave: (el) => handleBeforeLeave(el),
-              onLeave: (el, done) => handleLeave(el, done),
-              onAfterLeave: () => handleAfterLeave(),
-            },
-            {
-              default: () =>
-                visible.value &&
-                h(
-                  props.as === 'div' ? 'div' : 'ul',
-                  {
-                    class: [
-                      'nav-group-items',
-                      {
-                        compact: props.compact,
-                      },
-                    ],
-                  },
-                  slots.default &&
-                    slots.default().map((vnode, index) => {
-                      // @ts-expect-error name is defined in component
-                      if (vnode.type.name === 'CNavGroup') {
-                        return h(vnode, {
-                          onVisibleChange: (visible: boolean) =>
-                            handleVisibleChange(visible, index + 1),
-                          ...(visibleGroup.value && { visible: isVisible(index + 1) }),
-                        })
-                      }
-                      return vnode
-                    }),
-                ),
-            },
-          ),
-        ],
-      )
-  },
-})
-
-export { CNavGroup }
diff --git a/packages/coreui-vue/src/components/nav/CNavGroupItems.ts b/packages/coreui-vue/src/components/nav/CNavGroupItems.ts
deleted file mode 100644
index 3988b260..00000000
--- a/packages/coreui-vue/src/components/nav/CNavGroupItems.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNavGroupItems = defineComponent({
-  name: 'CNavGroupItems',
-  setup(_, { slots }) {
-    return () => h('ul', { class: 'nav-group-items' }, slots.default && slots.default())
-  },
-})
-
-export { CNavGroupItems }
diff --git a/packages/coreui-vue/src/components/nav/CNavItem.ts b/packages/coreui-vue/src/components/nav/CNavItem.ts
deleted file mode 100644
index e660c01a..00000000
--- a/packages/coreui-vue/src/components/nav/CNavItem.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CNavLink } from './CNavLink'
-
-import type { ComponentProps } from '../../utils/ComponentProps'
-
-interface CNavItemProps extends ComponentProps<typeof CNavLink> {
-  as: string
-  class: string
-}
-
-const CNavItem = defineComponent({
-  name: 'CNavItem',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'li',
-    },
-    /**
-     * A string of all className you want applied to the component.
-     */
-    class: String,
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * @ignore
-     */
-    href: String,
-  },
-  setup(props: CNavItemProps, { attrs, slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: ['nav-item', props.class],
-        },
-        props.href
-          ? h(
-              CNavLink,
-              {
-                ...attrs,
-                active: props.active,
-                disabled: props.disabled,
-                href: props.href,
-              },
-              {
-                default: () => slots.default && slots.default(),
-              },
-            )
-          : slots.default && slots.default(),
-      )
-  },
-})
-
-export { CNavItem }
diff --git a/packages/coreui-vue/src/components/nav/CNavLink.ts b/packages/coreui-vue/src/components/nav/CNavLink.ts
deleted file mode 100644
index 63c2af94..00000000
--- a/packages/coreui-vue/src/components/nav/CNavLink.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CLink } from '../link/CLink'
-
-const CNavLink = defineComponent({
-  name: 'CNavLink',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'a',
-    },
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * @ignore
-     */
-    href: String,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CLink,
-        {
-          as: props.as,
-          active: props.active,
-          class: 'nav-link',
-          disabled: props.disabled,
-          href: props.href,
-        },
-        {
-          default: () => slots.default && slots.default(),
-        },
-      )
-  },
-})
-
-export { CNavLink }
diff --git a/packages/coreui-vue/src/components/nav/CNavTitle.ts b/packages/coreui-vue/src/components/nav/CNavTitle.ts
deleted file mode 100644
index 6a808a42..00000000
--- a/packages/coreui-vue/src/components/nav/CNavTitle.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNavTitle = defineComponent({
-  name: 'CNavTitle',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'li',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'nav-title' }, slots.default && slots.default())
-  },
-})
-
-export { CNavTitle }
diff --git a/packages/coreui-vue/src/components/nav/__tests__/CNav.spec.ts b/packages/coreui-vue/src/components/nav/__tests__/CNav.spec.ts
deleted file mode 100644
index 7b94d89b..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/CNav.spec.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNav as Component } from '../../../index'
-
-const ComponentName = 'CNav'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-    layout: 'fill',
-    variant: 'pills',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('nav')).toBe(true)
-    expect(defaultWrapper.attributes('role')).toBe('navigation')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('nav')).toBe(true)
-    expect(customWrapper.classes('nav-fill')).toBe(true)
-    expect(customWrapper.classes('nav-pills')).toBe(true)
-    expect(customWrapper.attributes('role')).toBe('navigation')
-  })
-})
diff --git a/packages/coreui-vue/src/components/nav/__tests__/CNavGroup.spec.ts b/packages/coreui-vue/src/components/nav/__tests__/CNavGroup.spec.ts
deleted file mode 100644
index 8bf3cda9..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/CNavGroup.spec.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavGroup as Component } from '../../../index'
-
-const ComponentName = 'CNavGroup'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    compact: true,
-    visible: true,
-  },
-  slots: {
-    togglerContent: 'togglerContent',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('nav-group')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.find('a').text()).toContain('togglerContent')
-    expect(customWrapper.find('a').classes('nav-link')).toBe(true)
-    expect(customWrapper.find('a').classes('nav-group-toggle')).toBe(true)
-    expect(customWrapper.find('ul').classes('nav-group-items')).toBe(true)
-    expect(customWrapper.find('ul').classes('compact')).toBe(true)
-    expect(customWrapper.classes('nav-group')).toBe(true)
-  })
-  it('emit event visible-change on click nav-group-toggle', () => {
-    let incrementEvent = customWrapper.emitted('visible-change')
-    customWrapper.find('.nav-group-toggle').trigger('click')
-    incrementEvent = customWrapper.emitted('visible-change')
-    expect(incrementEvent).toHaveLength(3)
-  })
-})
diff --git a/packages/coreui-vue/src/components/nav/__tests__/CNavGroupItems.spec.ts b/packages/coreui-vue/src/components/nav/__tests__/CNavGroupItems.spec.ts
deleted file mode 100644
index 2e593021..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/CNavGroupItems.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavGroupItems as Component } from '../../../index'
-
-const ComponentName = 'CNavGroupItems'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('nav-group-items')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/nav/__tests__/CNavItem.spec.ts b/packages/coreui-vue/src/components/nav/__tests__/CNavItem.spec.ts
deleted file mode 100644
index fc24c1c2..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/CNavItem.spec.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavItem as Component } from '../../../index'
-
-const ComponentName = 'CNavItem'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    href: '/bazinga',
-    active: true,
-    as: 'div',
-    disabled: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('nav-item')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.find('div').text()).toContain('Default slot')
-    expect(customWrapper.classes('nav-item')).toBe(true)
-    expect(customWrapper.find('div').classes('nav-link')).toBe(true)
-    expect(customWrapper.find('div').classes('active')).toBe(true)
-    expect(customWrapper.find('div').classes('disabled')).toBe(true)
-    expect(customWrapper.find('div').attributes('href')).toBe('/bazinga')
-    expect(customWrapper.find('div').attributes('aria-current')).toBe('page')
-  })
-})
diff --git a/packages/coreui-vue/src/components/nav/__tests__/CNavLink.spec.ts b/packages/coreui-vue/src/components/nav/__tests__/CNavLink.spec.ts
deleted file mode 100644
index 0220a67c..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/CNavLink.spec.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavLink as Component } from '../../../index'
-
-const ComponentName = 'CNavLink'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    href: '/bazinga',
-    active: true,
-    as: 'div',
-    disabled: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('nav-link')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('nav-link')).toBe(true)
-    expect(customWrapper.classes('active')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.attributes('href')).toBe('/bazinga')
-    expect(customWrapper.attributes('aria-current')).toBe('page')
-  })
-})
diff --git a/packages/coreui-vue/src/components/nav/__tests__/CNavTitle.spec.ts b/packages/coreui-vue/src/components/nav/__tests__/CNavTitle.spec.ts
deleted file mode 100644
index 36c84be9..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/CNavTitle.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavTitle as Component } from '../../../index'
-
-const ComponentName = 'CNavTitle'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('nav-title')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNav.spec.ts.snap b/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNav.spec.ts.snap
deleted file mode 100644
index 4d306a7d..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNav.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNav component renders correctly 1`] = `"<div class="nav nav-fill nav-pills" role="navigation">Default slot</div>"`;
-
-exports[`Loads and display CNav component renders correctly 1`] = `"<ul class="nav" role="navigation">Default slot</ul>"`;
diff --git a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap b/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap
deleted file mode 100644
index 78b1e4cb..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap
+++ /dev/null
@@ -1,18 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNavGroup component renders correctly 1`] = `
-"<li class="nav-group show"><a class="nav-link nav-group-toggle">togglerContent</a>
-  <transition-stub appear="false" persisted="false" css="false">
-    <ul class="nav-group-items compact"></ul>
-  </transition-stub>
-</li>"
-`;
-
-exports[`Loads and display CNavGroup component renders correctly 1`] = `
-"<li class="nav-group">
-  <!---->
-  <transition-stub appear="false" persisted="false" css="false">
-    <!---->
-  </transition-stub>
-</li>"
-`;
diff --git a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavGroupItems.spec.ts.snap b/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavGroupItems.spec.ts.snap
deleted file mode 100644
index 7e5bd579..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavGroupItems.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CNavGroupItems component renders correctly 1`] = `"<ul class="nav-group-items">Default slot</ul>"`;
diff --git a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap b/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap
deleted file mode 100644
index 7147ee44..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNavItem component renders correctly 1`] = `
-"<li class="nav-item">
-  <div class="active disabled nav-link" aria-current="page" href="/bazinga">Default slot</div>
-</li>"
-`;
-
-exports[`Loads and display CNavItem component renders correctly 1`] = `"<li class="nav-item">Default slot</li>"`;
diff --git a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavLink.spec.ts.snap b/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavLink.spec.ts.snap
deleted file mode 100644
index 343e8754..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavLink.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNavLink component renders correctly 1`] = `"<div class="active disabled nav-link" aria-current="page" href="/bazinga">Default slot</div>"`;
-
-exports[`Loads and display CNavLink component renders correctly 1`] = `"<a class="nav-link">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavTitle.spec.ts.snap b/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavTitle.spec.ts.snap
deleted file mode 100644
index 44eee351..00000000
--- a/packages/coreui-vue/src/components/nav/__tests__/__snapshots__/CNavTitle.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CNavTitle component renders correctly 1`] = `"<li class="nav-title">Default slot</li>"`;
diff --git a/packages/coreui-vue/src/components/nav/index.ts b/packages/coreui-vue/src/components/nav/index.ts
deleted file mode 100644
index d38a6cfd..00000000
--- a/packages/coreui-vue/src/components/nav/index.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { App } from 'vue'
-import { CNav } from './CNav'
-import { CNavGroup } from './CNavGroup'
-import { CNavGroupItems } from './CNavGroupItems'
-import { CNavItem } from './CNavItem'
-import { CNavLink } from './CNavLink'
-import { CNavTitle } from './CNavTitle'
-
-const CNavPlugin = {
-  install: (app: App): void => {
-    app.component(CNav.name as string, CNav)
-    app.component(CNavGroup.name as string, CNavGroup)
-    app.component(CNavGroupItems.name as string, CNavGroupItems)
-    app.component(CNavItem.name as string, CNavItem)
-    app.component(CNavLink.name as string, CNavLink)
-    app.component(CNavTitle.name as string, CNavTitle)
-  },
-}
-
-export { CNavPlugin, CNav, CNavGroup, CNavGroupItems, CNavItem, CNavLink, CNavTitle }
diff --git a/packages/coreui-vue/src/components/navbar/CNavbar.ts b/packages/coreui-vue/src/components/navbar/CNavbar.ts
deleted file mode 100644
index ec6f4991..00000000
--- a/packages/coreui-vue/src/components/navbar/CNavbar.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CNavbar = defineComponent({
-  name: 'CNavbar',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'nav',
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-    /**
-     * Sets if the color of text should be colored for a light or dark dark background.
-     *
-     * @values 'dark', 'light'
-     */
-    colorScheme: {
-      type: String,
-      validator: (value: string) => {
-        return ['dark', 'light'].includes(value)
-      },
-    },
-    /**
-     * Defines optional container wrapping children elements.
-     *
-     * @values boolean, 'sm', 'md', 'lg', 'xl', 'xxl', 'fluid'
-     */
-    container: {
-      type: [Boolean, String],
-      validator: (value: boolean | string) => {
-        return (
-          typeof value === 'boolean' || ['sm', 'md', 'lg', 'xl', 'xxl', 'fluid'].includes(value)
-        )
-      },
-    },
-    /**
-     * Defines the responsive breakpoint to determine when content collapses.
-     *
-     * @values boolean, 'sm', 'md', 'lg', 'xl', 'xxl'
-     */
-    expand: {
-      type: [Boolean, String],
-      validator: (value: boolean | string) => {
-        return typeof value === 'boolean' || ['sm', 'md', 'lg', 'xl', 'xxl'].includes(value)
-      },
-    },
-    /**
-     * Place component in non-static positions.
-     *
-     * @values 'fixed-top', 'fixed-bottom', 'sticky-top'
-     */
-    placement: {
-      type: String,
-      validator: (value: string) => {
-        return ['fixed-top', 'fixed-bottom', 'sticky-top'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            'navbar',
-            {
-              [`bg-${props.color}`]: props.color,
-              [typeof props.expand === 'boolean'
-                ? 'navbar-expand'
-                : `navbar-expand-${props.expand}`]: props.expand,
-            },
-            props.placement,
-          ],
-          ...(props.colorScheme && { 'data-coreui-theme': props.colorScheme }),
-        },
-        props.container
-          ? h(
-              'div',
-              { class: [`container${props.container === true ? '' : '-' + props.container}`] },
-              slots.default && slots.default(),
-            )
-          : slots.default && slots.default(),
-      )
-  },
-})
-
-export { CNavbar }
diff --git a/packages/coreui-vue/src/components/navbar/CNavbarBrand.ts b/packages/coreui-vue/src/components/navbar/CNavbarBrand.ts
deleted file mode 100644
index 25a50b93..00000000
--- a/packages/coreui-vue/src/components/navbar/CNavbarBrand.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNavbarBrand = defineComponent({
-  name: 'CNavbarBrand',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     *
-     */
-    as: {
-      type: String,
-      default: 'a',
-    },
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: String,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as ?? (props.href ? 'a' : 'span'),
-        {
-          class: 'navbar-brand',
-          href: props.href,
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CNavbarBrand }
diff --git a/packages/coreui-vue/src/components/navbar/CNavbarNav.ts b/packages/coreui-vue/src/components/navbar/CNavbarNav.ts
deleted file mode 100644
index 338882e1..00000000
--- a/packages/coreui-vue/src/components/navbar/CNavbarNav.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNavbarNav = defineComponent({
-  name: 'CNavbarNav',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'ul',
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: 'navbar-nav',
-          role: 'navigation',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CNavbarNav }
diff --git a/packages/coreui-vue/src/components/navbar/CNavbarText.ts b/packages/coreui-vue/src/components/navbar/CNavbarText.ts
deleted file mode 100644
index bdc07fb5..00000000
--- a/packages/coreui-vue/src/components/navbar/CNavbarText.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNavbarText = defineComponent({
-  name: 'CNavbarText',
-  setup(_, { slots }) {
-    return () => h('span', { class: 'navbar-text' }, slots.default && slots.default())
-  },
-})
-
-export { CNavbarText }
diff --git a/packages/coreui-vue/src/components/navbar/CNavbarToggler.ts b/packages/coreui-vue/src/components/navbar/CNavbarToggler.ts
deleted file mode 100644
index 1ca4cca5..00000000
--- a/packages/coreui-vue/src/components/navbar/CNavbarToggler.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CNavbarToggler = defineComponent({
-  name: 'CNavbarToggler',
-  setup(_, { slots }) {
-    return () =>
-      h(
-        'button',
-        {
-          class: 'navbar-toggler',
-        },
-        slots.default ? slots.default() : h('span', { class: ['navbar-toggler-icon'] }),
-      )
-  },
-})
-
-export { CNavbarToggler }
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/CNavbar.spec.ts b/packages/coreui-vue/src/components/navbar/__tests__/CNavbar.spec.ts
deleted file mode 100644
index 6c533fb4..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/CNavbar.spec.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavbar as Component } from '../../../index'
-
-const ComponentName = 'CNavbar'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-    color: 'warning',
-    colorScheme: 'light',
-    container: 'lg',
-    expand: 'xl',
-    placement: 'fixed-bottom',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('navbar')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('navbar')).toBe(true)
-    expect(customWrapper.classes('bg-warning')).toBe(true)
-    expect(customWrapper.classes('navbar-light')).toBe(true)
-    expect(customWrapper.classes('navbar-expand-xl')).toBe(true)
-    expect(customWrapper.classes('fixed-bottom')).toBe(true)
-    expect(customWrapper.find('.container-lg').classes('container-lg')).toBe(true)
-    expect(customWrapper.find('.container-lg').text()).toContain('Default slot')
-  })
-})
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarBrand.spec.ts b/packages/coreui-vue/src/components/navbar/__tests__/CNavbarBrand.spec.ts
deleted file mode 100644
index 8f9b1b7e..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarBrand.spec.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavbarBrand as Component } from '../../../index'
-
-const ComponentName = 'CNavbarBrand'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapperTwo = mount(Component, {
-  propsData: {
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('navbar-brand')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('navbar-brand')).toBe(true)
-    expect(customWrapper.attributes('href')).toBe('/bazinga')
-  })
-})
-
-describe(`Customize (two) ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapperTwo.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapperTwo.text()).toContain('Default slot')
-    expect(customWrapperTwo.classes('navbar-brand')).toBe(true)
-    expect(customWrapperTwo.attributes('href')).toBe('/bazinga')
-  })
-})
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarNav.spec.ts b/packages/coreui-vue/src/components/navbar/__tests__/CNavbarNav.spec.ts
deleted file mode 100644
index 3c51ea8c..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarNav.spec.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavbarNav as Component } from '../../../index'
-
-const ComponentName = 'CNavbarNav'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('navbar-nav')).toBe(true)
-    expect(defaultWrapper.attributes('role')).toBe('navigation')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('navbar-nav')).toBe(true)
-    expect(customWrapper.attributes('role')).toBe('navigation')
-  })
-})
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarText.spec.ts b/packages/coreui-vue/src/components/navbar/__tests__/CNavbarText.spec.ts
deleted file mode 100644
index f8532a99..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarText.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavbarText as Component } from '../../../index'
-
-const ComponentName = 'CNavbarText'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('navbar-text')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarToggler.spec.ts b/packages/coreui-vue/src/components/navbar/__tests__/CNavbarToggler.spec.ts
deleted file mode 100644
index 2633bf2c..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/CNavbarToggler.spec.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CNavbarToggler as Component } from '../../../index'
-
-const ComponentName = 'CNavbarToggler'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-const customWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('navbar-toggler')).toBe(true)
-    expect(defaultWrapper.find('span').classes('navbar-toggler-icon')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('navbar-toggler')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbar.spec.ts.snap b/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbar.spec.ts.snap
deleted file mode 100644
index 8c12255a..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbar.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNavbar component renders correctly 1`] = `
-"<div class="navbar bg-warning navbar-expand-xl fixed-bottom" data-coreui-theme="light">
-  <div class="container-lg">Default slot</div>
-</div>"
-`;
-
-exports[`Loads and display CNavbar component renders correctly 1`] = `"<nav class="navbar">Default slot</nav>"`;
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarBrand.spec.ts.snap b/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarBrand.spec.ts.snap
deleted file mode 100644
index 0ddb600e..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarBrand.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize (two) CNavbarBrand component renders correctly 1`] = `"<a class="navbar-brand" href="/bazinga">Default slot</a>"`;
-
-exports[`Customize CNavbarBrand component renders correctly 1`] = `"<div class="navbar-brand" href="/bazinga">Default slot</div>"`;
-
-exports[`Loads and display CNavbarBrand component renders correctly 1`] = `"<a class="navbar-brand">Default slot</a>"`;
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarNav.spec.ts.snap b/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarNav.spec.ts.snap
deleted file mode 100644
index d2e23afd..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarNav.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNavbarNav component renders correctly 1`] = `"<div class="navbar-nav" role="navigation">Default slot</div>"`;
-
-exports[`Loads and display CNavbarNav component renders correctly 1`] = `"<ul class="navbar-nav" role="navigation">Default slot</ul>"`;
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarText.spec.ts.snap b/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarText.spec.ts.snap
deleted file mode 100644
index 24487886..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarText.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CNavbarText component renders correctly 1`] = `"<span class="navbar-text">Default slot</span>"`;
diff --git a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarToggler.spec.ts.snap b/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarToggler.spec.ts.snap
deleted file mode 100644
index 7054937b..00000000
--- a/packages/coreui-vue/src/components/navbar/__tests__/__snapshots__/CNavbarToggler.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CNavbarToggler component renders correctly 1`] = `"<button class="navbar-toggler">Default slot</button>"`;
-
-exports[`Loads and display CNavbarToggler component renders correctly 1`] = `"<button class="navbar-toggler"><span class="navbar-toggler-icon"></span></button>"`;
diff --git a/packages/coreui-vue/src/components/navbar/index.ts b/packages/coreui-vue/src/components/navbar/index.ts
deleted file mode 100644
index c466c871..00000000
--- a/packages/coreui-vue/src/components/navbar/index.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { App } from 'vue'
-import { CNavbar } from './CNavbar'
-import { CNavbarBrand } from './CNavbarBrand'
-import { CNavbarNav } from './CNavbarNav'
-import { CNavbarText } from './CNavbarText'
-import { CNavbarToggler } from './CNavbarToggler'
-
-const CNavbarPlugin = {
-  install: (app: App): void => {
-    app.component(CNavbar.name as string, CNavbar)
-    app.component(CNavbarBrand.name as string, CNavbarBrand)
-    app.component(CNavbarNav.name as string, CNavbarNav)
-    app.component(CNavbarText.name as string, CNavbarText)
-    app.component(CNavbarToggler.name as string, CNavbarToggler)
-  },
-}
-
-export { CNavbarPlugin, CNavbar, CNavbarBrand, CNavbarNav, CNavbarText, CNavbarToggler }
diff --git a/packages/coreui-vue/src/components/offcanvas/COffcanvas.ts b/packages/coreui-vue/src/components/offcanvas/COffcanvas.ts
deleted file mode 100644
index 5377fa72..00000000
--- a/packages/coreui-vue/src/components/offcanvas/COffcanvas.ts
+++ /dev/null
@@ -1,210 +0,0 @@
-import { defineComponent, h, ref, RendererElement, Transition, watch, withDirectives } from 'vue'
-
-import { CBackdrop } from '../backdrop'
-
-import { vVisible } from '../../directives/v-c-visible'
-import { executeAfterTransition } from '../../utils/transition'
-
-const COffcanvas = defineComponent({
-  name: 'COffcanvas',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Apply a backdrop on body while offcanvas is open.
-     *
-     * @values boolean | 'static'
-     */
-    backdrop: {
-      type: [Boolean, String],
-      default: true,
-      validator: (value: boolean | string) => {
-        if (typeof value === 'string') {
-          return ['static'].includes(value)
-        }
-        if (typeof value === 'boolean') {
-          return true
-        }
-        return false
-      },
-    },
-    /**
-     * Sets a darker color scheme.
-     */
-    dark: Boolean,
-    /**
-     * Closes the offcanvas when escape key is pressed.
-     */
-    keyboard: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Components placement, there’s no default placement.
-     *
-     * @values 'start', 'end', 'top', 'bottom'
-     */
-    placement: {
-      type: String,
-      require: true,
-      validator: (value: string) => {
-        return ['start', 'end', 'top', 'bottom'].includes(value)
-      },
-    },
-    /**
-     * Responsive offcanvas property hide content outside the viewport from a specified breakpoint and down.
-     *
-     * @values boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'
-     * @since 4.7.0
-     */
-    responsive: {
-      type: [Boolean, String],
-      default: true,
-      validator: (value: boolean | string) => {
-        if (typeof value === 'string') {
-          return ['sm', 'md', 'lg', 'xl', 'xxl'].includes(value)
-        }
-        if (typeof value === 'boolean') {
-          return true
-        }
-        return false
-      },
-    },
-    /**
-     * Allow body scrolling while offcanvas is open
-     */
-    scroll: {
-      type: Boolean,
-      default: false,
-    },
-
-    /**
-     * Toggle the visibility of offcanvas component.
-     */
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { attrs, emit, slots }) {
-    const offcanvasRef = ref()
-    const visible = ref(props.visible)
-
-    watch(
-      () => props.visible,
-      () => {
-        visible.value = props.visible
-      },
-    )
-
-    watch(visible, () => {
-      if (visible.value && !props.scroll) {
-        document.body.style.overflow = 'hidden'
-        document.body.style.paddingRight = '0px'
-
-        return
-      }
-
-      if (!props.scroll) {
-        document.body.style.removeProperty('overflow')
-        document.body.style.removeProperty('padding-right')
-      }
-    })
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      emit('show')
-      executeAfterTransition(() => done(), el as HTMLElement)
-      setTimeout(() => {
-        el.classList.add('show')
-      }, 1)
-    }
-
-    const handleAfterEnter = () => {
-      offcanvasRef.value.focus()
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      executeAfterTransition(() => done(), el as HTMLElement)
-      el.classList.add('hiding')
-    }
-
-    // eslint-disable-next-line unicorn/consistent-function-scoping
-    const handleAfterLeave = (el: RendererElement) => {
-      el.classList.remove('show', 'hiding')
-    }
-
-    const handleDismiss = () => {
-      visible.value = false
-      emit('hide')
-    }
-
-    const handleBackdropDismiss = () => {
-      if (props.backdrop !== 'static') {
-        handleDismiss()
-      }
-    }
-
-    const handleKeyDown = (event: KeyboardEvent) => {
-      if (event.key === 'Escape' && props.keyboard) {
-        handleDismiss()
-      }
-    }
-
-    return () => [
-      h(
-        Transition,
-        {
-          appear: visible.value,
-          css: false,
-          onEnter: (el, done) => handleEnter(el, done),
-          onAfterEnter: () => handleAfterEnter(),
-          onLeave: (el, done) => handleLeave(el, done),
-          onAfterLeave: (el) => handleAfterLeave(el),
-        },
-        () =>
-          withDirectives(
-            h(
-              'div',
-              {
-                ...attrs,
-                class: [
-                  {
-                    [`offcanvas${
-                      typeof props.responsive === 'boolean' ? '' : '-' + props.responsive
-                    }`]: props.responsive,
-                    [`offcanvas-${props.placement}`]: props.placement,
-                  },
-                  attrs.class,
-                ],
-                onKeydown: (event: KeyboardEvent) => handleKeyDown(event),
-                ref: offcanvasRef,
-                role: 'dialog',
-                tabindex: -1,
-                ...(props.dark && { 'data-coreui-theme': 'dark' }),
-              },
-              slots.default && slots.default(),
-            ),
-            [[vVisible, props.visible]],
-          ),
-      ),
-      props.backdrop &&
-        h(CBackdrop, {
-          class: 'offcanvas-backdrop',
-          onClick: handleBackdropDismiss,
-          visible: visible.value,
-        }),
-    ]
-  },
-})
-
-export { COffcanvas }
diff --git a/packages/coreui-vue/src/components/offcanvas/COffcanvasBody.ts b/packages/coreui-vue/src/components/offcanvas/COffcanvasBody.ts
deleted file mode 100644
index 384599c4..00000000
--- a/packages/coreui-vue/src/components/offcanvas/COffcanvasBody.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const COffcanvasBody = defineComponent({
-  name: 'COffcanvasBody',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'offcanvas-body' }, slots.default && slots.default())
-  },
-})
-
-export { COffcanvasBody }
diff --git a/packages/coreui-vue/src/components/offcanvas/COffcanvasHeader.ts b/packages/coreui-vue/src/components/offcanvas/COffcanvasHeader.ts
deleted file mode 100644
index 8758643d..00000000
--- a/packages/coreui-vue/src/components/offcanvas/COffcanvasHeader.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const COffcanvasHeader = defineComponent({
-  name: 'COffcanvasHeader',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'offcanvas-header' }, slots.default && slots.default())
-  },
-})
-
-export { COffcanvasHeader }
diff --git a/packages/coreui-vue/src/components/offcanvas/COffcanvasTitle.ts b/packages/coreui-vue/src/components/offcanvas/COffcanvasTitle.ts
deleted file mode 100644
index 6a1cc18e..00000000
--- a/packages/coreui-vue/src/components/offcanvas/COffcanvasTitle.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const COffcanvasTitle = defineComponent({
-  name: 'COffcanvasTitle',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'h5',
-    },
-  },
-  setup(props, { slots }) {
-    return () => h(props.as, { class: 'offcanvas-title' }, slots.default && slots.default())
-  },
-})
-
-export { COffcanvasTitle }
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvas.spec.ts b/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvas.spec.ts
deleted file mode 100644
index c7bb8e12..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvas.spec.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { COffcanvas as Component } from '../../../index'
-
-const ComponentName = 'COffcanvas'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    visible: true,
-    placement: 'end',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    backdrop: true,
-    keyboard: true,
-    placement: 'bottom',
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('div').classes('offcanvas')).toBe(true)
-    expect(defaultWrapper.find('div').classes('offcanvas-end')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('div').classes('offcanvas')).toBe(true)
-    expect(customWrapper.find('div').classes('offcanvas-bottom')).toBe(true)
-    expect(customWrapper.find('.offcanvas-backdrop').classes('offcanvas-backdrop')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasBody.spec.ts b/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasBody.spec.ts
deleted file mode 100644
index ae5dca6c..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasBody.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { COffcanvasBody as Component } from '../../../index'
-
-const ComponentName = 'COffcanvasBody'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('offcanvas-body')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasHeader.spec.ts b/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasHeader.spec.ts
deleted file mode 100644
index e19de432..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasHeader.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { COffcanvasHeader as Component } from '../../../index'
-
-const ComponentName = 'COffcanvasHeader'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('offcanvas-header')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasTitle.spec.ts b/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasTitle.spec.ts
deleted file mode 100644
index 7e27792f..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/COffcanvasTitle.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { COffcanvasTitle as Component } from '../../../index'
-
-const ComponentName = 'COffcanvasTitle'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'div',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('offcanvas-title')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('offcanvas-title')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvas.spec.ts.snap b/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvas.spec.ts.snap
deleted file mode 100644
index c05805a4..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvas.spec.ts.snap
+++ /dev/null
@@ -1,19 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize COffcanvas component renders correctly 1`] = `
-"<transition-stub appear="true" persisted="false" css="false">
-  <div class="offcanvas offcanvas-bottom" role="dialog" tabindex="-1">Default slot</div>
-</transition-stub>
-<transition-stub appear="false" persisted="false" css="true" class="offcanvas-backdrop">
-  <div class="fade"></div>
-</transition-stub>"
-`;
-
-exports[`Loads and display COffcanvas component renders correctly 1`] = `
-"<transition-stub appear="true" persisted="false" css="false">
-  <div class="offcanvas offcanvas-end" role="dialog" tabindex="-1">Default slot</div>
-</transition-stub>
-<transition-stub appear="false" persisted="false" css="true" class="offcanvas-backdrop">
-  <div class="fade"></div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasBody.spec.ts.snap b/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasBody.spec.ts.snap
deleted file mode 100644
index 86cbd126..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasBody.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display COffcanvasBody component renders correctly 1`] = `"<div class="offcanvas-body">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasHeader.spec.ts.snap b/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasHeader.spec.ts.snap
deleted file mode 100644
index f3a255fc..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasHeader.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display COffcanvasHeader component renders correctly 1`] = `"<div class="offcanvas-header">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasTitle.spec.ts.snap b/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasTitle.spec.ts.snap
deleted file mode 100644
index 52e231f8..00000000
--- a/packages/coreui-vue/src/components/offcanvas/__tests__/__snapshots__/COffcanvasTitle.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize COffcanvasTitle component renders correctly 1`] = `"<div class="offcanvas-title">Default slot</div>"`;
-
-exports[`Loads and display COffcanvasTitle component renders correctly 1`] = `"<h5 class="offcanvas-title">Default slot</h5>"`;
diff --git a/packages/coreui-vue/src/components/offcanvas/index.ts b/packages/coreui-vue/src/components/offcanvas/index.ts
deleted file mode 100644
index 28572037..00000000
--- a/packages/coreui-vue/src/components/offcanvas/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { App } from 'vue'
-import { COffcanvas } from './COffcanvas'
-import { COffcanvasBody } from './COffcanvasBody'
-import { COffcanvasHeader } from './COffcanvasHeader'
-import { COffcanvasTitle } from './COffcanvasTitle'
-
-const COffcanvasPlugin = {
-  install: (app: App): void => {
-    app.component(COffcanvas.name as string, COffcanvas)
-    app.component(COffcanvasBody.name as string, COffcanvasBody)
-    app.component(COffcanvasHeader.name as string, COffcanvasHeader)
-    app.component(COffcanvasTitle.name as string, COffcanvasTitle)
-  },
-}
-
-export { COffcanvasPlugin, COffcanvas, COffcanvasBody, COffcanvasHeader, COffcanvasTitle }
diff --git a/packages/coreui-vue/src/components/pagination/CPagination.ts b/packages/coreui-vue/src/components/pagination/CPagination.ts
deleted file mode 100644
index 9f0bc7c4..00000000
--- a/packages/coreui-vue/src/components/pagination/CPagination.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CPagination = defineComponent({
-  name: 'CPagination',
-  props: {
-    /**
-     * Set the alignment of pagination components.
-     *
-     * @values 'start', 'center', 'end'
-     */
-    align: {
-      type: String,
-      validator: (value: string) => {
-        return ['start', 'center', 'end'].includes(value)
-      },
-    },
-    /**
-     * Size the component small or large.
-     *
-     * @values 'sm', 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'nav',
-        {},
-        h(
-          'ul',
-          {
-            class: [
-              'pagination',
-              {
-                [`justify-content-${props.align}`]: props.align,
-                [`pagination-${props.size}`]: props.size,
-              },
-            ],
-          },
-          slots.default && slots.default(),
-        ),
-      )
-  },
-})
-
-export { CPagination }
diff --git a/packages/coreui-vue/src/components/pagination/CPaginationItem.ts b/packages/coreui-vue/src/components/pagination/CPaginationItem.ts
deleted file mode 100644
index c4085a9a..00000000
--- a/packages/coreui-vue/src/components/pagination/CPaginationItem.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CLink } from '../link/CLink'
-
-const CPaginationItem = defineComponent({
-  name: 'CPaginationItem',
-  props: {
-    /**
-     * Toggle the active state for the component.
-     */
-    active: Boolean,
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: String,
-    /**
-     * Toggle the disabled state for the component.
-     */
-    disabled: Boolean,
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: String,
-  },
-  setup(props, { slots }) {
-    return () => {
-      const component = props.as ?? (props.active ? 'span' : 'a')
-      return h(
-        'li',
-        {
-          class: [
-            'page-item',
-            {
-              ['active']: props.active,
-              ['disabled']: props.disabled,
-            },
-          ],
-          ...(props.active && { active: props.active, 'aria-current': 'page' }),
-        },
-        component === 'a'
-          ? h(
-              CLink,
-              {
-                as: component,
-                class: ['page-link'],
-                href: props.href,
-              },
-              {
-                default: () => slots.default && slots.default(),
-              },
-            )
-          : h(component, { class: ['page-link'] }, slots.default && slots.default()),
-      )
-    }
-  },
-})
-
-export { CPaginationItem }
diff --git a/packages/coreui-vue/src/components/pagination/__tests__/CPagination.spec.ts b/packages/coreui-vue/src/components/pagination/__tests__/CPagination.spec.ts
deleted file mode 100644
index 1bd9ee7b..00000000
--- a/packages/coreui-vue/src/components/pagination/__tests__/CPagination.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CPagination as Component } from '../../../index'
-
-const ComponentName = 'CPagination'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    size: 'lg',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.find('ul').text()).toContain('Default slot')
-    expect(defaultWrapper.find('ul').classes('pagination')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.find('ul').text()).toContain('Default slot')
-    expect(customWrapper.find('ul').classes('pagination')).toBe(true)
-    expect(customWrapper.find('ul').classes('pagination-lg')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/pagination/__tests__/CPaginationItem.spec.ts b/packages/coreui-vue/src/components/pagination/__tests__/CPaginationItem.spec.ts
deleted file mode 100644
index e4d6015e..00000000
--- a/packages/coreui-vue/src/components/pagination/__tests__/CPaginationItem.spec.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CPaginationItem as Component } from '../../../index'
-
-const ComponentName = 'CPaginationItem'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    disabled: true,
-    href: '/bazinga',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.find('.page-link').text()).toContain('Default slot')
-    expect(defaultWrapper.classes('page-item')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.find('.page-link').text()).toContain('Default slot')
-    expect(customWrapper.classes('page-item')).toBe(true)
-    expect(customWrapper.classes('disabled')).toBe(true)
-    expect(customWrapper.find('.page-link').attributes('href')).toContain('bazinga') // TODO: It must be working!
-  })
-})
diff --git a/packages/coreui-vue/src/components/pagination/__tests__/__snapshots__/CPagination.spec.ts.snap b/packages/coreui-vue/src/components/pagination/__tests__/__snapshots__/CPagination.spec.ts.snap
deleted file mode 100644
index df7177ab..00000000
--- a/packages/coreui-vue/src/components/pagination/__tests__/__snapshots__/CPagination.spec.ts.snap
+++ /dev/null
@@ -1,13 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CPagination component renders correctly 1`] = `
-"<nav>
-  <ul class="pagination pagination-lg">Default slot</ul>
-</nav>"
-`;
-
-exports[`Loads and display CPagination component renders correctly 1`] = `
-"<nav>
-  <ul class="pagination">Default slot</ul>
-</nav>"
-`;
diff --git a/packages/coreui-vue/src/components/pagination/__tests__/__snapshots__/CPaginationItem.spec.ts.snap b/packages/coreui-vue/src/components/pagination/__tests__/__snapshots__/CPaginationItem.spec.ts.snap
deleted file mode 100644
index 440c37db..00000000
--- a/packages/coreui-vue/src/components/pagination/__tests__/__snapshots__/CPaginationItem.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CPaginationItem component renders correctly 1`] = `"<li class="page-item disabled"><a class="page-link" href="/bazinga">Default slot</a></li>"`;
-
-exports[`Loads and display CPaginationItem component renders correctly 1`] = `"<li class="page-item"><a class="page-link">Default slot</a></li>"`;
diff --git a/packages/coreui-vue/src/components/pagination/index.ts b/packages/coreui-vue/src/components/pagination/index.ts
deleted file mode 100644
index 8c7d5e7c..00000000
--- a/packages/coreui-vue/src/components/pagination/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { App } from 'vue'
-import { CPagination } from './CPagination'
-import { CPaginationItem } from './CPaginationItem'
-
-const CPaginationPlugin = {
-  install: (app: App): void => {
-    app.component(CPagination.name as string, CPagination)
-    app.component(CPaginationItem.name as string, CPaginationItem)
-  },
-}
-
-export { CPaginationPlugin, CPagination, CPaginationItem }
diff --git a/packages/coreui-vue/src/components/placeholder/CPlaceholder.ts b/packages/coreui-vue/src/components/placeholder/CPlaceholder.ts
deleted file mode 100644
index 9217bf91..00000000
--- a/packages/coreui-vue/src/components/placeholder/CPlaceholder.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const BREAKPOINTS = [
-  'xxl' as const,
-  'xl' as const,
-  'lg' as const,
-  'md' as const,
-  'sm' as const,
-  'xs' as const,
-]
-
-export const CPlaceholder = defineComponent({
-  name: 'CPlaceholder',
-  props: {
-    /**
-     * Set animation type to better convey the perception of something being actively loaded.
-     *
-     * @values 'glow', 'wave'
-     */
-    animation: {
-      type: String,
-      validator: (value: string) => {
-        return ['glow', 'wave'].includes(value)
-      },
-    },
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: String,
-      default: 'span',
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Size the component extra small, small, or large.
-     *
-     * @values 'xs', 'sm', 'lg'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['xs', 'sm', 'lg'].includes(value)
-      },
-    },
-    /**
-     * The number of columns on extra small devices (<576px).
-     */
-    xs: Number,
-    /**
-     * The number of columns on small devices (<768px).
-     */
-    sm: Number,
-    /**
-     * The number of columns on medium devices (<992px).
-     */
-    md: Number,
-    /**
-     * The number of columns on large devices (<1200px).
-     */
-    lg: Number,
-    /**
-     * The number of columns on X-Large devices (<1400px).
-     */
-    xl: Number,
-    /**
-     * The number of columns on XX-Large devices (≥1400px).
-     */
-    xxl: Number,
-  },
-  setup(props, { slots }) {
-    const repsonsiveClassNames: string[] = []
-
-    BREAKPOINTS.forEach((bp) => {
-      const breakpoint = props[bp]
-
-      const infix = bp === 'xs' ? '' : `-${bp}`
-
-      if (typeof breakpoint === 'number') {
-        repsonsiveClassNames.push(`col${infix}-${breakpoint}`)
-      }
-
-      if (typeof breakpoint === 'boolean') {
-        repsonsiveClassNames.push(`col${infix}`)
-      }
-    })
-
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            props.animation ? `placeholder-${props.animation}` : 'placeholder',
-            {
-              [`bg-${props.color}`]: props.color,
-              [`placeholder-${props.size}`]: props.size,
-            },
-            repsonsiveClassNames,
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
diff --git a/packages/coreui-vue/src/components/placeholder/__tests__/CPlaceholder.spec.ts b/packages/coreui-vue/src/components/placeholder/__tests__/CPlaceholder.spec.ts
deleted file mode 100644
index 2f3cff8f..00000000
--- a/packages/coreui-vue/src/components/placeholder/__tests__/CPlaceholder.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { shallowMount } from '@vue/test-utils'
-import { CPlaceholder as Component } from '../../'
-
-const ComponentName = 'CPlaceholder'
-const wrapper = shallowMount(Component)
-const customWrapper = shallowMount(Component, {
-  props: {
-    animation: 'glow',
-    color: 'secondary',
-    size: 'lg',
-    sm: 7,
-  },
-  attrs: {
-    class: 'bazinga',
-  },
-  slots: {
-    default: 'Hello World!',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(wrapper.element).toMatchSnapshot()
-  })
-  it('renders correctly with slot', () => {
-    expect(customWrapper.element).toMatchSnapshot()
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('has a prope class names', () => {
-    expect(customWrapper.find('span').classes('bazinga')).toBe(true)
-    expect(customWrapper.find('span').classes('bg-secondary')).toBe(true)
-    expect(customWrapper.find('span').classes('col-sm-7')).toBe(true)
-    expect(customWrapper.find('span').classes('placeholder-glow')).toBe(true)
-    expect(customWrapper.find('span').classes('placeholder-lg')).toBe(true)
-  })
-  it('default slot contains text', () => {
-    expect(customWrapper.text()).toBe('Hello World!')
-  })
-})
diff --git a/packages/coreui-vue/src/components/placeholder/__tests__/__snapshots__/CPlaceholder.spec.ts.snap b/packages/coreui-vue/src/components/placeholder/__tests__/__snapshots__/CPlaceholder.spec.ts.snap
deleted file mode 100644
index 3f43d58c..00000000
--- a/packages/coreui-vue/src/components/placeholder/__tests__/__snapshots__/CPlaceholder.spec.ts.snap
+++ /dev/null
@@ -1,15 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CPlaceholder component renders correctly 1`] = `
-<span
-  class="placeholder"
-/>
-`;
-
-exports[`Loads and display CPlaceholder component renders correctly with slot 1`] = `
-<span
-  class="placeholder-glow bg-secondary placeholder-lg col-sm-7 bazinga"
->
-  Hello World!
-</span>
-`;
diff --git a/packages/coreui-vue/src/components/placeholder/index.ts b/packages/coreui-vue/src/components/placeholder/index.ts
deleted file mode 100644
index 87038824..00000000
--- a/packages/coreui-vue/src/components/placeholder/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CPlaceholder } from './CPlaceholder'
-
-const CPlaceholderPlugin = {
-  install: (app: App): void => {
-    app.component(CPlaceholder.name as string, CPlaceholder)
-  },
-}
-
-export { CPlaceholderPlugin, CPlaceholder }
diff --git a/packages/coreui-vue/src/components/popover/CPopover.ts b/packages/coreui-vue/src/components/popover/CPopover.ts
deleted file mode 100644
index 300f876a..00000000
--- a/packages/coreui-vue/src/components/popover/CPopover.ts
+++ /dev/null
@@ -1,256 +0,0 @@
-import { defineComponent, h, PropType, ref, RendererElement, Transition, useId } from 'vue'
-import type { Placement } from '@popperjs/core'
-
-import { CConditionalTeleport } from '../conditional-teleport'
-import { usePopper } from '../../composables'
-import type { Placements, Triggers } from '../../types'
-import { executeAfterTransition } from '../../utils/transition'
-import { getRTLPlacement } from '../../utils'
-
-const CPopover = defineComponent({
-  name: 'CPopover',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Apply a CSS fade transition to the popover.
-     *
-     * @since 4.9.0
-     */
-    animation: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Appends the vue popover to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
-     *
-     * @since 5.0.0
-     */
-    container: {
-      type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
-      default: 'body',
-    },
-    /**
-     * Content for your component. If you want to pass non-string value please use dedicated slot `<template #content>...</template>`
-     */
-    content: String,
-    /**
-     * The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`.
-     *
-     * @since 4.9.0
-     */
-    delay: {
-      type: [Number, Object] as PropType<number | { show: number; hide: number }>,
-      default: 0,
-    },
-    /**
-     * Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.
-     *
-     * @since 4.9.0
-     */
-    fallbackPlacements: {
-      type: [String, Array] as PropType<Placements | Placements[]>,
-      default: () => ['top', 'right', 'bottom', 'left'],
-      validator: (value: Placements | Placements[]) => {
-        if (typeof value === 'string') {
-          return ['top', 'right', 'bottom', 'left'].includes(value)
-        }
-        if (Array.isArray(value)) {
-          return value.every((e) => ['top', 'right', 'bottom', 'left'].includes(e))
-        }
-        return false
-      },
-    },
-    /**
-     * Offset of the popover relative to its target.
-     */
-    offset: {
-      type: Array,
-      default: () => [0, 8],
-    },
-    /**
-     * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.
-     */
-    placement: {
-      type: String as PropType<Placement>,
-      default: 'top',
-      validator: (value: string) => {
-        return ['top', 'right', 'bottom', 'left'].includes(value)
-      },
-    },
-    /**
-     * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
-     */
-    title: String,
-    /**
-     * Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.
-     *
-     * @values 'click', 'focus', 'hover'
-     */
-    trigger: {
-      type: [String, Array] as PropType<Triggers | Triggers[]>,
-      default: 'click',
-      validator: (value: Triggers | Triggers[]) => {
-        if (typeof value === 'string') {
-          return ['click', 'focus', 'hover'].includes(value)
-        }
-        if (Array.isArray(value)) {
-          return value.every((e) => ['click', 'focus', 'hover'].includes(e))
-        }
-        return false
-      },
-    },
-    /**
-     * Toggle the visibility of popover component.
-     */
-    visible: Boolean,
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { attrs, slots, emit }) {
-    const togglerRef = ref()
-    const popoverRef = ref()
-    const visible = ref(props.visible)
-
-    const { initPopper, destroyPopper } = usePopper()
-    const uniqueId = `popover-${useId()}`
-
-    const delay =
-      typeof props.delay === 'number' ? { show: props.delay, hide: props.delay } : props.delay
-
-    const popperConfig = {
-      modifiers: [
-        {
-          name: 'arrow',
-          options: {
-            element: '.popover-arrow',
-          },
-        },
-        {
-          name: 'flip',
-          options: {
-            fallbackPlacements: props.fallbackPlacements,
-          },
-        },
-        {
-          name: 'offset',
-          options: {
-            offset: props.offset,
-          },
-        },
-      ],
-      placement: getRTLPlacement(props.placement, togglerRef.value),
-    }
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      emit('show')
-      initPopper(togglerRef.value, popoverRef.value, popperConfig)
-      el.classList.add('show')
-      executeAfterTransition(() => done(), el as HTMLElement)
-    }
-
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      emit('hide')
-      el.classList.remove('show')
-      executeAfterTransition(() => {
-        done()
-        destroyPopper()
-      }, el as HTMLElement)
-    }
-
-    const toggleVisible = (event: Event, _visible: boolean) => {
-      togglerRef.value = event.target
-      if (_visible) {
-        setTimeout(() => {
-          visible.value = true
-        }, delay.show)
-        return
-      }
-
-      setTimeout(() => {
-        visible.value = false
-      }, delay.hide)
-    }
-
-    return () => [
-      h(
-        CConditionalTeleport,
-        {
-          container: props.container,
-          teleport: true,
-        },
-        {
-          default: () =>
-            h(
-              Transition,
-              {
-                onEnter: (el, done) => handleEnter(el, done),
-                onLeave: (el, done) => handleLeave(el, done),
-              },
-              () =>
-                visible.value &&
-                h(
-                  'div',
-                  {
-                    ...attrs,
-                    class: [
-                      'popover',
-                      'bs-popover-auto',
-                      {
-                        fade: props.animation,
-                      },
-                      attrs.class,
-                    ],
-                    id: uniqueId,
-                    ref: popoverRef,
-                    role: 'tooltip',
-                  },
-                  [
-                    h('div', { class: 'popover-arrow' }),
-                    (props.title || slots.title) &&
-                      h(
-                        'div',
-                        { class: 'popover-header' },
-                        {
-                          default: () => (slots.title && slots.title()) || props.title,
-                        },
-                      ),
-                    (props.content || slots.content) &&
-                      h(
-                        'div',
-                        { class: 'popover-body' },
-                        {
-                          default: () => (slots.content && slots.content()) || props.content,
-                        },
-                      ),
-                  ],
-                ),
-            ),
-        },
-      ),
-      slots.toggler &&
-        slots.toggler({
-          id: visible.value ? uniqueId : null,
-          on: {
-            click: (event: Event) =>
-              props.trigger.includes('click') && toggleVisible(event, !visible.value),
-            blur: (event: Event) => props.trigger.includes('focus') && toggleVisible(event, false),
-            focus: (event: Event) => props.trigger.includes('focus') && toggleVisible(event, true),
-            mouseenter: (event: Event) =>
-              props.trigger.includes('hover') && toggleVisible(event, true),
-            mouseleave: (event: Event) =>
-              props.trigger.includes('hover') && toggleVisible(event, false),
-          },
-        }),
-    ]
-  },
-})
-
-export { CPopover }
diff --git a/packages/coreui-vue/src/components/popover/index.ts b/packages/coreui-vue/src/components/popover/index.ts
deleted file mode 100644
index 261dae00..00000000
--- a/packages/coreui-vue/src/components/popover/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CPopover } from './CPopover'
-
-const CPopoverPlugin = {
-  install: (app: App): void => {
-    app.component(CPopover.name as string, CPopover)
-  },
-}
-
-export { CPopoverPlugin, CPopover }
diff --git a/packages/coreui-vue/src/components/progress/CProgress.ts b/packages/coreui-vue/src/components/progress/CProgress.ts
deleted file mode 100644
index 03c39ed3..00000000
--- a/packages/coreui-vue/src/components/progress/CProgress.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { defineComponent, h, inject } from 'vue'
-
-import { CProgressBar } from './CProgressBar'
-import { Color } from '../../props'
-
-const CProgress = defineComponent({
-  name: 'CProgress',
-  props: {
-    /**
-     * Use to animate the stripes right to left via CSS3 animations.
-     */
-    animated: Boolean,
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Sets the height of the component. If you set that value the inner `<CProgressBar>` will automatically resize accordingly.
-     */
-    height: Number,
-    /**
-     * A string of all className you want applied to the <CProgressBar/> component.
-     *
-     * @since 5.0.0
-     */
-    progressBarClassName: String,
-    /**
-     * Makes progress bar thinner.
-     */
-    thin: Boolean,
-    /**
-     * The percent to progress the ProgressBar.
-     */
-    value: {
-      type: Number,
-      default: 0,
-    },
-    /**
-     * Set the progress bar variant to optional striped.
-     *
-     * @values 'striped'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return value === 'striped'
-      },
-    },
-    /**
-     * Change the default color to white.
-     */
-    white: Boolean,
-  },
-  setup(props, { slots }) {
-    const stacked = inject('stacked', false) as boolean
-
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'progress',
-            {
-              'progress-thin': props.thin,
-              'progress-white': props.white,
-            },
-          ],
-          style: {
-            ...(props.height ? { height: `${props.height}px` } : {}),
-            ...(stacked ? { width: `${props.value}%` } : {}),
-          },
-          ...(props.value !== undefined && {
-            role: 'progressbar',
-            'aria-valuenow': props.value,
-            'aria-valuemin': 0,
-            'aria-valuemax': 100,
-          }),
-        },
-        // @ts-expect-error name is defined in component
-        slots.default && slots.default().some((vnode) => vnode.type.name === 'CProgressBar')
-          ? slots.default().map((vnode) => {
-              // @ts-expect-error name is defined in component
-              if (vnode.type.name === 'CProgressBar') {
-                return h(vnode, {
-                  ...(props.animated && { animated: props.animated }),
-                  ...(props.color && { color: props.color }),
-                  ...(props.value && { value: props.value }),
-                  ...(props.variant && { variant: props.variant }),
-                })
-              }
-              return vnode
-            })
-          : h(
-              CProgressBar,
-              {
-                ...(props.progressBarClassName && { class: props.progressBarClassName }),
-                animated: props.animated,
-                color: props.color,
-                value: props.value,
-                variant: props.variant,
-              },
-              () => slots.default && slots.default(),
-            ),
-      )
-  },
-})
-
-export { CProgress }
diff --git a/packages/coreui-vue/src/components/progress/CProgressBar.ts b/packages/coreui-vue/src/components/progress/CProgressBar.ts
deleted file mode 100644
index a483cbde..00000000
--- a/packages/coreui-vue/src/components/progress/CProgressBar.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { defineComponent, h, inject } from 'vue'
-
-import { Color } from '../../props'
-
-const CProgressBar = defineComponent({
-  name: 'CProgressBar',
-  props: {
-    /**
-     * Use to animate the stripes right to left via CSS3 animations.
-     */
-    animated: Boolean,
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * The percent to progress the ProgressBar.
-     */
-    value: {
-      type: Number,
-      default: 0,
-    },
-    /**
-     * Set the progress bar variant to optional striped.
-     *
-     * @values 'striped'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return value === 'striped'
-      },
-    },
-  },
-  setup(props, { slots }) {
-    const stacked = inject('stacked', false) as boolean
-
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'progress-bar',
-            `bg-${props.color}`,
-            {
-              [`progress-bar-${props.variant}`]: props.variant,
-              ['progress-bar-animated']: props.animated,
-            },
-          ],
-          ...(!stacked && { style: { width: `${props.value}%` } }),
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CProgressBar }
diff --git a/packages/coreui-vue/src/components/progress/CProgressStacked.ts b/packages/coreui-vue/src/components/progress/CProgressStacked.ts
deleted file mode 100644
index efa48cca..00000000
--- a/packages/coreui-vue/src/components/progress/CProgressStacked.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineComponent, h, provide } from 'vue'
-
-const CProgressStacked = defineComponent({
-  name: 'CProgressStacked',
-  props: {},
-  setup(_, { slots }) {
-    provide('stacked', true)
-    return () =>
-      h(
-        'div',
-        {
-          class: 'progress-stacked',
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CProgressStacked }
diff --git a/packages/coreui-vue/src/components/progress/__tests__/CProgress.spec.ts b/packages/coreui-vue/src/components/progress/__tests__/CProgress.spec.ts
deleted file mode 100644
index c9425d64..00000000
--- a/packages/coreui-vue/src/components/progress/__tests__/CProgress.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CProgress as Component } from '../../../index'
-
-const ComponentName = 'CProgress'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    height: 100,
-    thin: true,
-    white: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('progress')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('progress')).toBe(true)
-    expect(customWrapper.classes('progress-thin')).toBe(true)
-    expect(customWrapper.classes('progress-white')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/progress/__tests__/CProgressBar.spec.ts b/packages/coreui-vue/src/components/progress/__tests__/CProgressBar.spec.ts
deleted file mode 100644
index e5545ebf..00000000
--- a/packages/coreui-vue/src/components/progress/__tests__/CProgressBar.spec.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CProgressBar as Component } from '../../../index'
-
-const ComponentName = 'CProgressBar'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    animated: true,
-    color: 'warning',
-    value: 75,
-    variant: 'striped',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('progress-bar')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('progress-bar')).toBe(true)
-    expect(customWrapper.classes('progress-bar-striped')).toBe(true)
-    expect(customWrapper.classes('progress-bar-animated')).toBe(true)
-    expect(customWrapper.classes('bg-warning')).toBe(true)
-    expect(customWrapper.attributes('role')).toBe('progressbar')
-    expect(customWrapper.attributes('style')).toBe('width: 75%;')
-    expect(customWrapper.attributes('aria-valuenow')).toBe('75')
-    expect(customWrapper.attributes('aria-valuemin')).toBe('0')
-    expect(customWrapper.attributes('aria-valuemax')).toBe('100')
-  })
-})
diff --git a/packages/coreui-vue/src/components/progress/__tests__/__snapshots__/CProgress.spec.ts.snap b/packages/coreui-vue/src/components/progress/__tests__/__snapshots__/CProgress.spec.ts.snap
deleted file mode 100644
index d4477a07..00000000
--- a/packages/coreui-vue/src/components/progress/__tests__/__snapshots__/CProgress.spec.ts.snap
+++ /dev/null
@@ -1,13 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CProgress component renders correctly 1`] = `
-"<div class="progress progress-thin progress-white" style="height: 100px;" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
-  <div class="progress-bar bg-undefined" style="width: 0%;">Default slot</div>
-</div>"
-`;
-
-exports[`Loads and display CProgress component renders correctly 1`] = `
-"<div class="progress" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
-  <div class="progress-bar bg-undefined" style="width: 0%;">Default slot</div>
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/progress/__tests__/__snapshots__/CProgressBar.spec.ts.snap b/packages/coreui-vue/src/components/progress/__tests__/__snapshots__/CProgressBar.spec.ts.snap
deleted file mode 100644
index f5e81a11..00000000
--- a/packages/coreui-vue/src/components/progress/__tests__/__snapshots__/CProgressBar.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CProgressBar component renders correctly 1`] = `"<div class="progress-bar bg-warning progress-bar-striped progress-bar-animated" style="width: 75%;">Default slot</div>"`;
-
-exports[`Loads and display CProgressBar component renders correctly 1`] = `"<div class="progress-bar bg-undefined" style="width: 0%;">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/progress/index.ts b/packages/coreui-vue/src/components/progress/index.ts
deleted file mode 100644
index ae6fabfc..00000000
--- a/packages/coreui-vue/src/components/progress/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { App } from 'vue'
-import { CProgress } from './CProgress'
-import { CProgressBar } from './CProgressBar'
-import { CProgressStacked } from './CProgressStacked'
-
-const CProgressPlugin = {
-  install: (app: App): void => {
-    app.component(CProgress.name as string, CProgress)
-    app.component(CProgressBar.name as string, CProgressBar)
-    app.component(CProgressStacked.name as string, CProgressStacked)
-  },
-}
-
-export { CProgressPlugin, CProgress, CProgressBar, CProgressStacked }
diff --git a/packages/coreui-vue/src/components/sidebar/CSidebar.ts b/packages/coreui-vue/src/components/sidebar/CSidebar.ts
deleted file mode 100644
index 64a5ef73..00000000
--- a/packages/coreui-vue/src/components/sidebar/CSidebar.ts
+++ /dev/null
@@ -1,218 +0,0 @@
-import { defineComponent, h, onBeforeUnmount, onMounted, ref, watch } from 'vue'
-import { CBackdrop } from '../backdrop'
-
-import { isInViewport } from '../../utils'
-
-const isOnMobile = (element: HTMLDivElement) => {
-  if (!element) {
-    return
-  }
-
-  return Boolean(getComputedStyle(element).getPropertyValue('--cui-is-mobile'))
-}
-
-const CSidebar = defineComponent({
-  name: 'CSidebar',
-  props: {
-    /**
-     * Sets if the color of text should be colored for a light or dark dark background.
-     *
-     * @values 'dark', light'
-     */
-    colorScheme: {
-      type: String,
-      default: undefined,
-      validator: (value: string) => {
-        return ['dark', 'light'].includes(value)
-      },
-    },
-    /**
-     * Make sidebar narrow.
-     */
-    narrow: Boolean,
-    /**
-     * Set sidebar to overlaid variant.
-     */
-    overlaid: Boolean,
-    /**
-     * Components placement, there’s no default placement.
-     * @values 'start', 'end'
-     */
-    placement: {
-      type: String,
-      default: undefined,
-      validator: (value: string) => {
-        return ['start', 'end'].includes(value)
-      },
-    },
-    /**
-     * Place sidebar in non-static positions.
-     */
-    position: {
-      type: String,
-      validator: (value: string) => {
-        return ['fixed'].includes(value)
-      },
-    },
-    /**
-     * Size the component small, large, or extra large.
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return ['sm', 'lg', 'xl'].includes(value)
-      },
-    },
-    /**
-     * Expand narrowed sidebar on hover.
-     */
-    unfoldable: Boolean,
-    /**
-     * Toggle the visibility of sidebar component.
-     */
-    visible: {
-      type: Boolean,
-      default: undefined,
-    },
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-    /**
-     * Event emitted after visibility of component changed.
-     */
-    'visible-change',
-  ],
-  setup(props, { attrs, slots, emit }) {
-    const sidebarRef = ref()
-
-    const inViewport = ref()
-    const mobile = ref()
-    const visibleMobile = ref(false)
-    const visibleDesktop = ref(
-      props.visible === undefined ? (props.overlaid ? false : true) : props.visible,
-    )
-
-    watch(inViewport, () => {
-      emit('visible-change', inViewport.value)
-      inViewport.value ? emit('show') : emit('hide')
-    })
-
-    watch(
-      () => props.visible,
-      () => props.visible !== undefined && handleVisibleChange(props.visible),
-    )
-
-    watch(mobile, () => {
-      if (mobile.value) {
-        console.log('mobile')
-        visibleMobile.value = false
-      }
-    })
-
-    onMounted(() => {
-      mobile.value = isOnMobile(sidebarRef.value)
-      inViewport.value = isInViewport(sidebarRef.value)
-
-      window.addEventListener('resize', handleResize)
-      window.addEventListener('mouseup', handleClickOutside)
-      window.addEventListener('keyup', handleKeyup)
-
-      sidebarRef.value.addEventListener('mouseup', handleOnClick)
-      sidebarRef.value.addEventListener('transitionend', () => {
-        inViewport.value = isInViewport(sidebarRef.value)
-      })
-    })
-
-    onBeforeUnmount(() => {
-      window.removeEventListener('resize', handleResize)
-      window.removeEventListener('mouseup', handleClickOutside)
-      window.removeEventListener('keyup', handleKeyup)
-
-      sidebarRef.value.removeEventListener('mouseup', handleOnClick)
-      // eslint-disable-next-line unicorn/no-invalid-remove-event-listener
-      sidebarRef.value.removeEventListener('transitionend', () => {
-        inViewport.value = isInViewport(sidebarRef.value)
-      })
-    })
-
-    const handleVisibleChange = (visible: boolean) => {
-      if (mobile.value) {
-        visibleMobile.value = visible
-        return
-      }
-
-      visibleDesktop.value = visible
-    }
-
-    const handleHide = () => {
-      handleVisibleChange(false)
-      emit('visible-change', false)
-    }
-
-    const handleResize = () => {
-      mobile.value = isOnMobile(sidebarRef.value)
-      inViewport.value = isInViewport(sidebarRef.value)
-    }
-
-    const handleKeyup = (event: Event) => {
-      if (mobile.value && !sidebarRef.value.contains(event.target as HTMLElement)) {
-        handleHide()
-      }
-    }
-    const handleClickOutside = (event: Event) => {
-      if (mobile.value && !sidebarRef.value.contains(event.target as HTMLElement)) {
-        handleHide()
-      }
-    }
-
-    const handleOnClick = (event: Event) => {
-      const target = event.target as HTMLAnchorElement
-      target &&
-        target.classList.contains('nav-link') &&
-        !target.classList.contains('nav-group-toggle') &&
-        mobile.value &&
-        handleHide()
-    }
-
-    return () => [
-      h(
-        'div',
-        {
-          class: [
-            'sidebar',
-            {
-              [`sidebar-${props.colorScheme}`]: props.colorScheme,
-              'sidebar-narrow': props.narrow,
-              'sidebar-overlaid': props.overlaid,
-              [`sidebar-${props.placement}`]: props.placement,
-              [`sidebar-${props.position}`]: props.position,
-              [`sidebar-${props.size}`]: props.size,
-              'sidebar-narrow-unfoldable': props.unfoldable,
-              show:
-                (mobile.value && visibleMobile.value) || (props.overlaid && visibleDesktop.value),
-              hide: visibleDesktop.value === false && !mobile.value && !props.overlaid,
-            },
-            attrs.class,
-          ],
-          ref: sidebarRef,
-        },
-        slots.default && slots.default(),
-      ),
-      mobile.value &&
-        h(CBackdrop, {
-          class: 'sidebar-backdrop',
-          visible: visibleMobile.value,
-          onClick: () => handleHide(),
-        }),
-    ]
-  },
-})
-
-export { CSidebar }
diff --git a/packages/coreui-vue/src/components/sidebar/CSidebarBrand.ts b/packages/coreui-vue/src/components/sidebar/CSidebarBrand.ts
deleted file mode 100644
index d58b5803..00000000
--- a/packages/coreui-vue/src/components/sidebar/CSidebarBrand.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CSidebarBrand = defineComponent({
-  name: 'CSidebarBrand',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     *
-     */
-    as: {
-      type: String,
-      default: 'div',
-    },
-    /**
-     * The href attribute specifies the URL of the page the link goes to.
-     */
-    href: String,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.as ?? (props.href ? 'a' : 'div'),
-        { class: 'sidebar-brand', href: props.href },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CSidebarBrand }
diff --git a/packages/coreui-vue/src/components/sidebar/CSidebarFooter.ts b/packages/coreui-vue/src/components/sidebar/CSidebarFooter.ts
deleted file mode 100644
index 7f7cd837..00000000
--- a/packages/coreui-vue/src/components/sidebar/CSidebarFooter.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CSidebarFooter = defineComponent({
-  name: 'CSidebarFooter',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'sidebar-footer' }, slots.default && slots.default())
-  },
-})
-
-export { CSidebarFooter }
diff --git a/packages/coreui-vue/src/components/sidebar/CSidebarHeader.ts b/packages/coreui-vue/src/components/sidebar/CSidebarHeader.ts
deleted file mode 100644
index 4851fd3f..00000000
--- a/packages/coreui-vue/src/components/sidebar/CSidebarHeader.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CSidebarHeader = defineComponent({
-  name: 'CSidebarHeader',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'sidebar-header' }, slots.default && slots.default())
-  },
-})
-
-export { CSidebarHeader }
diff --git a/packages/coreui-vue/src/components/sidebar/CSidebarNav.ts b/packages/coreui-vue/src/components/sidebar/CSidebarNav.ts
deleted file mode 100644
index daea06af..00000000
--- a/packages/coreui-vue/src/components/sidebar/CSidebarNav.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Component, defineComponent, h, ref, PropType } from 'vue'
-
-const CSidebarNav = defineComponent({
-  name: 'CSidebarNav',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: {
-      type: [Object, String] as PropType<string | Component>,
-      default: 'ul',
-    },
-  },
-  setup(props, { slots }) {
-    const visibleGroup = ref()
-
-    const handleVisibleChange = (visible: boolean, index: number) => {
-      if (visible) {
-        visibleGroup.value = index
-      } else {
-        if (visibleGroup.value === index) {
-          visibleGroup.value = 0
-        }
-      }
-    }
-
-    const isVisible = (index: number) => Boolean(visibleGroup.value === index)
-
-    return () =>
-      h(
-        props.as,
-        {
-          class: 'sidebar-nav',
-        },
-        {
-          default: () =>
-            slots.default &&
-            slots.default().map((vnode, index) => {
-              // @ts-expect-error name is defined in component
-              if (vnode.type.name === 'CNavGroup') {
-                return h(vnode, {
-                  onVisibleChange: (visible: boolean) => handleVisibleChange(visible, index + 1),
-                  ...(visibleGroup.value && { visible: isVisible(index + 1) }),
-                })
-              }
-              return vnode
-            }),
-        },
-      )
-  },
-})
-
-export { CSidebarNav }
diff --git a/packages/coreui-vue/src/components/sidebar/CSidebarToggler.ts b/packages/coreui-vue/src/components/sidebar/CSidebarToggler.ts
deleted file mode 100644
index 315fb5c9..00000000
--- a/packages/coreui-vue/src/components/sidebar/CSidebarToggler.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CSidebarToggler = defineComponent({
-  name: 'CSidebarToggler',
-  setup(_, { slots }) {
-    return () => h('button', { class: 'sidebar-toggler' }, slots.default && slots.default())
-  },
-})
-
-export { CSidebarToggler }
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebar.spec.ts b/packages/coreui-vue/src/components/sidebar/__tests__/CSidebar.spec.ts
deleted file mode 100644
index 9343351d..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebar.spec.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSidebar as Component } from '../../../index'
-
-const ComponentName = 'CSidebar'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    narrow: true,
-    overlaid: true,
-    position: 'fixed',
-    size: 'xl',
-    unfoldable: true,
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('.sidebar').classes('sidebar')).toBe(true)
-    expect(defaultWrapper.find('.sidebar').classes('hide')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('.sidebar').classes('sidebar')).toBe(true)
-    expect(customWrapper.find('.sidebar').classes('sidebar-narrow')).toBe(true)
-    expect(customWrapper.find('.sidebar').classes('sidebar-overlaid')).toBe(true)
-    expect(customWrapper.find('.sidebar').classes('sidebar-fixed')).toBe(true)
-    expect(customWrapper.find('.sidebar').classes('sidebar-xl')).toBe(true)
-    expect(customWrapper.find('.sidebar').classes('sidebar-narrow-unfoldable')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarBrand.spec.ts b/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarBrand.spec.ts
deleted file mode 100644
index 1b849317..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarBrand.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSidebarBrand as Component } from '../../../index'
-
-const ComponentName = 'CSidebarBrand'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('sidebar-brand')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarFooter.spec.ts b/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarFooter.spec.ts
deleted file mode 100644
index 27830c41..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarFooter.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSidebarFooter as Component } from '../../../index'
-
-const ComponentName = 'CSidebarFooter'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('sidebar-footer')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarHeader.spec.ts b/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarHeader.spec.ts
deleted file mode 100644
index ced864e1..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarHeader.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSidebarHeader as Component } from '../../../index'
-
-const ComponentName = 'CSidebarHeader'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('sidebar-header')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarNav.spec.ts b/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarNav.spec.ts
deleted file mode 100644
index d1bfc88d..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarNav.spec.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSidebarNav as Component } from '../../../index'
-
-const ComponentName = 'CSidebarNav'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('sidebar-nav')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarToggler.spec.ts b/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarToggler.spec.ts
deleted file mode 100644
index 630609e6..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/CSidebarToggler.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSidebarToggler as Component } from '../../../index'
-
-const ComponentName = 'CSidebarToggler'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('sidebar-toggler')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebar.spec.ts.snap b/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebar.spec.ts.snap
deleted file mode 100644
index 15a3cec4..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebar.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CSidebar component renders correctly 1`] = `"<div class="sidebar sidebar-narrow sidebar-overlaid sidebar-fixed sidebar-xl sidebar-narrow-unfoldable show">Default slot</div>"`;
-
-exports[`Loads and display CSidebar component renders correctly 1`] = `"<div class="sidebar">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarBrand.spec.ts.snap b/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarBrand.spec.ts.snap
deleted file mode 100644
index 5b05d064..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarBrand.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CSidebarBrand component renders correctly 1`] = `"<div class="sidebar-brand">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarFooter.spec.ts.snap b/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarFooter.spec.ts.snap
deleted file mode 100644
index c275d81c..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarFooter.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CSidebarFooter component renders correctly 1`] = `"<div class="sidebar-footer">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarHeader.spec.ts.snap b/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarHeader.spec.ts.snap
deleted file mode 100644
index edf15cc3..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarHeader.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CSidebarHeader component renders correctly 1`] = `"<div class="sidebar-header">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarNav.spec.ts.snap b/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarNav.spec.ts.snap
deleted file mode 100644
index b476da94..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarNav.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CSidebarNav component renders correctly 1`] = `"<ul class="sidebar-nav"></ul>"`;
diff --git a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarToggler.spec.ts.snap b/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarToggler.spec.ts.snap
deleted file mode 100644
index 402da170..00000000
--- a/packages/coreui-vue/src/components/sidebar/__tests__/__snapshots__/CSidebarToggler.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CSidebarToggler component renders correctly 1`] = `"<button class="sidebar-toggler">Default slot</button>"`;
diff --git a/packages/coreui-vue/src/components/sidebar/index.ts b/packages/coreui-vue/src/components/sidebar/index.ts
deleted file mode 100644
index 11dd0095..00000000
--- a/packages/coreui-vue/src/components/sidebar/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { App } from 'vue'
-import { CSidebar } from './CSidebar'
-import { CSidebarBrand } from './CSidebarBrand'
-import { CSidebarFooter } from './CSidebarFooter'
-import { CSidebarHeader } from './CSidebarHeader'
-import { CSidebarNav } from './CSidebarNav'
-import { CSidebarToggler } from './CSidebarToggler'
-
-const CSidebarPlugin = {
-  install: (app: App): void => {
-    app.component(CSidebar.name as string, CSidebar)
-    app.component(CSidebarBrand.name as string, CSidebarBrand)
-    app.component(CSidebarFooter.name as string, CSidebarFooter)
-    app.component(CSidebarHeader.name as string, CSidebarHeader)
-    app.component(CSidebarNav.name as string, CSidebarNav)
-    app.component(CSidebarToggler.name as string, CSidebarToggler)
-  },
-}
-
-export {
-  CSidebarPlugin,
-  CSidebar,
-  CSidebarBrand,
-  CSidebarFooter,
-  CSidebarHeader,
-  CSidebarNav,
-  CSidebarToggler,
-}
diff --git a/packages/coreui-vue/src/components/spinner/CSpinner.ts b/packages/coreui-vue/src/components/spinner/CSpinner.ts
deleted file mode 100644
index 1e4f0f26..00000000
--- a/packages/coreui-vue/src/components/spinner/CSpinner.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CSpinner = defineComponent({
-  name: 'CSpinner',
-  props: {
-        /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-        as: {
-          type: String,
-          default: 'div',
-        },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: {
-      type: String,
-      validator: (value: string) => {
-        return [
-          'primary',
-          'secondary',
-          'success',
-          'danger',
-          'warning',
-          'info',
-          'dark',
-          'light',
-        ].includes(value)
-      },
-    },
-    /**
-     * Size the component small.
-     *
-     * @values 'sm'
-     */
-    size: {
-      type: String,
-      validator: (value: string) => {
-        return value === 'sm'
-      },
-    },
-    /**
-     * Set the button variant to an outlined button or a ghost button.
-     *
-     * @values 'border', 'grow'
-     */
-    variant: {
-      type: String,
-      default: 'border',
-      validator: (value: string) => {
-        return ['border', 'grow'].includes(value)
-      },
-    },
-    /**
-     * Set visually hidden label for accessibility purposes.
-     */
-    visuallyHiddenLabel: {
-      type: String,
-      default: 'Loading...',
-    },
-  },
-  setup(props) {
-    return () =>
-      h(
-        props.as,
-        {
-          class: [
-            `spinner-${props.variant}`,
-            {
-              [`spinner-${props.variant}-${props.size}`]: props.size,
-              [`text-${props.color}`]: props.color,
-            },
-          ],
-          role: 'status',
-        },
-        h('span', { class: ['visually-hidden'] }, props.visuallyHiddenLabel),
-      )
-  },
-})
-
-export { CSpinner }
diff --git a/packages/coreui-vue/src/components/spinner/__tests__/CSpinner.spec.ts b/packages/coreui-vue/src/components/spinner/__tests__/CSpinner.spec.ts
deleted file mode 100644
index f007df07..00000000
--- a/packages/coreui-vue/src/components/spinner/__tests__/CSpinner.spec.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CSpinner as Component } from '../../../index'
-
-const ComponentName = 'CSpinner'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: 'h4',
-    color: 'warning',
-    size: 'sm',
-    variant: 'grow',
-    visuallyHiddenLabel: 'visuallyHiddenLabel',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('spinner-border')).toBe(true)
-    expect(defaultWrapper.classes('text-undefined')).toBe(true)
-    expect(defaultWrapper.find('span').classes('visually-hidden')).toBe(true)
-    expect(defaultWrapper.find('span').text()).toContain('Loading...')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.classes('spinner-grow')).toBe(true)
-    expect(customWrapper.classes('text-warning')).toBe(true)
-    expect(customWrapper.classes('spinner-grow-sm')).toBe(true)
-    expect(customWrapper.find('span').classes('visually-hidden')).toBe(true)
-    expect(customWrapper.find('span').text()).toContain('visuallyHiddenLabel')
-  })
-})
diff --git a/packages/coreui-vue/src/components/spinner/__tests__/__snapshots__/CSpinner.spec.ts.snap b/packages/coreui-vue/src/components/spinner/__tests__/__snapshots__/CSpinner.spec.ts.snap
deleted file mode 100644
index 2147b3ac..00000000
--- a/packages/coreui-vue/src/components/spinner/__tests__/__snapshots__/CSpinner.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CSpinner component renders correctly 1`] = `"<h4 class="spinner-grow spinner-grow-sm text-warning" role="status"><span class="visually-hidden">visuallyHiddenLabel</span></h4>"`;
-
-exports[`Loads and display CSpinner component renders correctly 1`] = `"<div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div>"`;
diff --git a/packages/coreui-vue/src/components/spinner/index.ts b/packages/coreui-vue/src/components/spinner/index.ts
deleted file mode 100644
index 8bcffb6d..00000000
--- a/packages/coreui-vue/src/components/spinner/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CSpinner } from './CSpinner'
-
-const CSpinnerPlugin = {
-  install: (app: App): void => {
-    app.component(CSpinner.name as string, CSpinner)
-  },
-}
-
-export { CSpinnerPlugin, CSpinner }
diff --git a/packages/coreui-vue/src/components/table/CTable.ts b/packages/coreui-vue/src/components/table/CTable.ts
deleted file mode 100644
index 563f6ac8..00000000
--- a/packages/coreui-vue/src/components/table/CTable.ts
+++ /dev/null
@@ -1,317 +0,0 @@
-import { computed, defineComponent, h, PropType } from 'vue'
-
-import { CTableBody } from './CTableBody'
-import { CTableCaption } from './CTableCaption'
-import { CTableDataCell } from './CTableDataCell'
-import { CTableFoot } from './CTableFoot'
-import { CTableHead } from './CTableHead'
-import { CTableHeaderCell } from './CTableHeaderCell'
-import { CTableRow } from './CTableRow'
-
-import { Color } from '../../props'
-import { getColumnLabel, getColumnNames } from './utils'
-import type { Column, FooterItem, Item } from './types'
-
-const CTable = defineComponent({
-  name: 'CTable',
-  props: {
-    /**
-     * Set the vertical aligment.
-     *
-     * @values 'bottom', 'middle', 'top'
-     */
-    align: {
-      type: String,
-      validator: (value: string) => {
-        return ['bottom', 'middle', 'top'].includes(value)
-      },
-    },
-    /**
-     * Sets the border color of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    borderColor: Color,
-    /**
-     * Add borders on all sides of the table and cells.
-     */
-    bordered: Boolean,
-    /**
-     * Remove borders on all sides of the table and cells.
-     */
-    borderless: Boolean,
-    /**
-     * Put the `<caption>` on the top of the table.
-     *
-     * @values 'top' | string
-     */
-    caption: String,
-    /**
-     * Set the text of the table caption and the caption on the top of the table.
-     *
-     * @since 4.5.0
-     */
-    captionTop: String,
-    /**
-     * Prop for table columns configuration. If prop is not defined, table will display columns based on the first item keys, omitting keys that begins with underscore (e.g. '_props')
-     *
-     * In columns prop each array item represents one column. Item might be specified in two ways:
-     * String: each item define column name equal to item value.
-     * Object: item is object with following keys available as column configuration:
-     * - key (required)(String) - define column name equal to item key.
-     * - label (String) - define visible label of column. If not defined, label will be generated automatically based on column name, by converting kebab-case and snake_case to individual words and capitalization of each word.
-     * - _props (Object) - adds classes to all cels in column, ex. _props: { scope: 'col', className: 'custom-class' },
-     * - _style (Object) - adds styles to the column header (useful for defining widths)
-     *
-     * @since 4.5.0
-     */
-    columns: {
-      type: Array as PropType<(Column | string)[]>,
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-    /**
-     * Array of objects or strings, where each element represents one cell in the table footer.
-     *
-     * Example items:
-     * ['FooterCell', 'FooterCell', 'FooterCell']
-     * or
-     * [{ label: 'FooterCell', _props: { color: 'success' }, ...]
-     *
-     * @since 4.5.0
-     */
-    footer: {
-      type: Array as PropType<(FooterItem | string)[]>,
-    },
-    /**
-     * Enable a hover state on table rows within a `<CTableBody>`.
-     */
-    hover: Boolean,
-    /**
-     * Array of objects, where each object represents one item - row in table. Additionally, you can add style classes to each row by passing them by '_props' key and to single cell by '_cellProps'.
-     *
-     * Example item:
-     * { name: 'John' , age: 12, _props: { color: 'success' }, _cellProps: { age: { className: 'fw-bold'}}}
-     *
-     * @since 4.5.0
-     */
-    items: {
-      type: Array as PropType<Item[]>,
-    },
-    responsive: {
-      type: [Boolean, String],
-      validator: (value: boolean | string) => {
-        if (typeof value == 'string') {
-          return ['sm', 'md', 'lg', 'xl', 'xxl'].includes(value)
-        }
-        if (typeof value == 'boolean') {
-          return true
-        }
-        return false
-      },
-    },
-    /**
-     * Make table more compact by cutting all cell `padding` in half.
-     */
-    small: Boolean,
-    /**
-     * Add zebra-striping to any table row within the `<CTableBody>`.
-     */
-    striped: Boolean,
-    /**
-     * Add zebra-striping to any table column.
-     *
-     * @since 4.4.0
-     */
-    stripedColumns: Boolean,
-    /**
-     * Properties that will be passed to the table footer component.
-     *
-     * Properties to [CTableFoot](#ctablefoot) component.
-     * @since 4.5.0
-     */
-    tableFootProps: {
-      type: Object,
-    },
-    /**
-     * Properties that will be passed to the table head component.
-     *
-     *  Properties to [CTableHead](#ctablehead) component.
-     * @since 4.5.0
-     */
-    tableHeadProps: {
-      type: Object,
-    },
-  },
-  setup(props, { slots, attrs }) {
-    const columnNames = computed(() => getColumnNames(props.columns, props.items))
-    //   props.columns
-    //     ? props.columns.map((column: Column | string) => {
-    //         if (typeof column === 'object') return column.key
-    //         else return column
-    //       })
-    //     : Object.keys((props.items && props.items[0]) || {}).filter((el) => el.charAt(0) !== '_'),
-    // )
-
-    const table = () =>
-      h(
-        'table',
-        {
-          class: [
-            'table',
-            {
-              [`align-${props.align}`]: props.align,
-              [`caption-top`]: props.captionTop || props.caption === 'top',
-              [`border-${props.borderColor}`]: props.borderColor,
-              'table-bordered': props.bordered,
-              'table-borderless': props.borderless,
-              [`table-${props.color}`]: props.color,
-              'table-hover': props.hover,
-              'table-sm': props.small,
-              'table-striped': props.striped,
-              'table-striped-columns': props.stripedColumns,
-            },
-            attrs.class,
-          ],
-        },
-        {
-          default: () => [
-            ((props.caption && props.caption !== 'top') || props.captionTop) &&
-              h(
-                CTableCaption,
-                {},
-                {
-                  default: () => props.caption || props.captionTop,
-                },
-              ),
-            props.columns &&
-              h(
-                CTableHead,
-                {
-                  ...props.tableHeadProps,
-                },
-                {
-                  default: () =>
-                    h(
-                      CTableRow,
-                      {},
-                      {
-                        default: () => [
-                          props.columns &&
-                            props.columns.map((column: Column | string) =>
-                              h(
-                                CTableHeaderCell,
-                                {
-                                  ...(typeof column === 'object' &&
-                                    column._props && { ...column._props }),
-                                  ...(typeof column === 'object' &&
-                                    column._style && { style: { ...column._style } }),
-                                },
-                                {
-                                  default: () => getColumnLabel(column),
-                                },
-                              ),
-                            ),
-                        ],
-                      },
-                    ),
-                },
-              ),
-            props.items &&
-              h(
-                CTableBody,
-                {},
-                {
-                  default: () => [
-                    props.items &&
-                      props.items.map((item: Item) =>
-                        h(
-                          CTableRow,
-                          {
-                            ...(item._props && { ...item._props }),
-                          },
-                          {
-                            default: () => [
-                              columnNames.value &&
-                                columnNames.value.map(
-                                  (colName: string) =>
-                                    item[colName] !== undefined &&
-                                    h(
-                                      CTableDataCell,
-                                      {
-                                        ...(item._cellProps &&
-                                          item._cellProps['all'] && { ...item._cellProps['all'] }),
-                                        ...(item._cellProps &&
-                                          item._cellProps[colName] && {
-                                            ...item._cellProps[colName],
-                                          }),
-                                      },
-                                      {
-                                        default: () => item[colName],
-                                      },
-                                    ),
-                                ),
-                            ],
-                          },
-                        ),
-                      ),
-                  ],
-                },
-              ),
-            slots.default && slots.default(),
-            props.footer &&
-              h(
-                CTableFoot,
-                {
-                  ...props.tableFootProps,
-                },
-                {
-                  default: () =>
-                    h(
-                      CTableRow,
-                      {},
-                      {
-                        default: () => [
-                          props.footer &&
-                            props.footer.map((item: FooterItem | string) =>
-                              h(
-                                CTableDataCell,
-                                {
-                                  ...(typeof item === 'object' &&
-                                    item._props && { ...item._props }),
-                                },
-                                {
-                                  default: () => (typeof item === 'object' ? item.label : item),
-                                },
-                              ),
-                            ),
-                        ],
-                      },
-                    ),
-                },
-              ),
-          ],
-        },
-      )
-    return () => [
-      props.responsive
-        ? h(
-            'div',
-            {
-              class:
-                typeof props.responsive === 'boolean'
-                  ? 'table-responsive'
-                  : `table-responsive-${props.responsive}`,
-            },
-            table(),
-          )
-        : table(),
-    ]
-  },
-})
-
-export { CTable }
diff --git a/packages/coreui-vue/src/components/table/CTableBody.ts b/packages/coreui-vue/src/components/table/CTableBody.ts
deleted file mode 100644
index 83526901..00000000
--- a/packages/coreui-vue/src/components/table/CTableBody.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CTableBody = defineComponent({
-  name: 'CTableBody',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'tbody',
-        {
-          class: [
-            {
-              [`table-${props.color}`]: props.color,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTableBody }
diff --git a/packages/coreui-vue/src/components/table/CTableCaption.ts b/packages/coreui-vue/src/components/table/CTableCaption.ts
deleted file mode 100644
index ef069990..00000000
--- a/packages/coreui-vue/src/components/table/CTableCaption.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CTableCaption = defineComponent({
-  name: 'CTableCaption',
-  setup(_, { slots }) {
-    return () => h('caption', {}, slots.default && slots.default())
-  },
-})
-
-export { CTableCaption }
diff --git a/packages/coreui-vue/src/components/table/CTableDataCell.ts b/packages/coreui-vue/src/components/table/CTableDataCell.ts
deleted file mode 100644
index fa60429c..00000000
--- a/packages/coreui-vue/src/components/table/CTableDataCell.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CTableDataCell = defineComponent({
-  name: 'CTableDataCell',
-  props: {
-    /**
-     * Highlight a table row or cell.
-     */
-    active: Boolean,
-    /**
-     * Set the vertical aligment.
-     *
-     * @values 'bottom', 'middle', 'top'
-     */
-    align: {
-      type: String,
-      validator: (value: string) => {
-        return ['bottom', 'middle', 'top'].includes(value)
-      },
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-    /**
-     * @ignore
-     */
-    scope: String,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        props.scope ? 'th' : 'td',
-        {
-          class: [
-            {
-              [`align-${props.align}`]: props.align,
-              'table-active': props.active,
-              [`table-${props.color}`]: props.color,
-            },
-          ],
-          ...(props.scope && { scope: props.scope }),
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTableDataCell }
diff --git a/packages/coreui-vue/src/components/table/CTableFoot.ts b/packages/coreui-vue/src/components/table/CTableFoot.ts
deleted file mode 100644
index 3876e05c..00000000
--- a/packages/coreui-vue/src/components/table/CTableFoot.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CTableFoot = defineComponent({
-  name: 'CTableFoot',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'tfoot',
-        {
-          class: [
-            {
-              [`table-${props.color}`]: props.color,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTableFoot }
diff --git a/packages/coreui-vue/src/components/table/CTableHead.ts b/packages/coreui-vue/src/components/table/CTableHead.ts
deleted file mode 100644
index 85a50aa2..00000000
--- a/packages/coreui-vue/src/components/table/CTableHead.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CTableHead = defineComponent({
-  name: 'CTableHead',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'thead',
-        {
-          class: [
-            {
-              [`table-${props.color}`]: props.color,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTableHead }
diff --git a/packages/coreui-vue/src/components/table/CTableHeaderCell.ts b/packages/coreui-vue/src/components/table/CTableHeaderCell.ts
deleted file mode 100644
index fb4c9bea..00000000
--- a/packages/coreui-vue/src/components/table/CTableHeaderCell.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CTableHeaderCell = defineComponent({
-  name: 'CTableHeaderCell',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'th',
-        {
-          class: [
-            {
-              [`table-${props.color}`]: props.color,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTableHeaderCell }
diff --git a/packages/coreui-vue/src/components/table/CTableRow.ts b/packages/coreui-vue/src/components/table/CTableRow.ts
deleted file mode 100644
index 40dfeb66..00000000
--- a/packages/coreui-vue/src/components/table/CTableRow.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { Color } from '../../props'
-
-const CTableRow = defineComponent({
-  name: 'CTableRow',
-  props: {
-    /**
-     * Highlight a table row or cell..
-     */
-    active: Boolean,
-    /**
-     * Set the vertical aligment.
-     *
-     * @values 'bottom', 'middle', 'top'
-     */
-    align: {
-      type: String,
-      validator: (value: string) => {
-        return ['bottom', 'middle', 'top'].includes(value)
-      },
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values  'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'tr',
-        {
-          class: [
-            {
-              [`align-${props.align}`]: props.align,
-              'table-active': props.active,
-              [`table-${props.color}`]: props.color,
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTableRow }
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTable.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTable.spec.ts
deleted file mode 100644
index 04a481f0..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTable.spec.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTable as Component } from '../../../index'
-
-const ComponentName = 'CTable'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    align: 'center',
-    borderColor: 'dark',
-    bordered: true,
-    borderless: true,
-    caption: 'top',
-    color: 'warning',
-    hover: true,
-    responsive: 'lg',
-    small: true,
-    striped: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.find('table').text()).toContain('Default slot')
-    expect(defaultWrapper.find('table').classes('table')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.find('div').classes('table-responsive-lg')).toBe(true)
-    expect(customWrapper.find('table').text()).toContain('Default slot')
-    expect(customWrapper.find('table').classes('table')).toBe(true)
-    expect(customWrapper.find('table').classes('align-center')).toBe(true)
-    expect(customWrapper.find('table').classes('table')).toBe(true)
-    expect(customWrapper.find('table').classes('caption-top')).toBe(true)
-    expect(customWrapper.find('table').classes('border-dark')).toBe(true)
-    expect(customWrapper.find('table').classes('table-bordered')).toBe(true)
-    expect(customWrapper.find('table').classes('table-borderless')).toBe(true)
-    expect(customWrapper.find('table').classes('table-warning')).toBe(true)
-    expect(customWrapper.find('table').classes('table-hover')).toBe(true)
-    expect(customWrapper.find('table').classes('table-sm')).toBe(true)
-    expect(customWrapper.find('table').classes('table-striped')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableBody.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableBody.spec.ts
deleted file mode 100644
index abbdc049..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableBody.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableBody as Component } from '../../../index'
-
-const ComponentName = 'CTableBody'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('table-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableCaption.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableCaption.spec.ts
deleted file mode 100644
index aa388314..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableCaption.spec.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableCaption as Component } from '../../../index'
-
-const ComponentName = 'CTableCaption'
-
-const defaultWrapper = mount(Component, {
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableDataCell.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableDataCell.spec.ts
deleted file mode 100644
index 530fac28..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableDataCell.spec.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableDataCell as Component } from '../../../index'
-
-const ComponentName = 'CTableDataCell'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    align: 'middle',
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('align-middle')).toBe(true)
-    expect(customWrapper.classes('table-active')).toBe(true)
-    expect(customWrapper.classes('table-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableFoot.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableFoot.spec.ts
deleted file mode 100644
index ccb2a125..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableFoot.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableFoot as Component } from '../../../index'
-
-const ComponentName = 'CTableFoot'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('table-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableHead.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableHead.spec.ts
deleted file mode 100644
index fa8672a9..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableHead.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableHead as Component } from '../../../index'
-
-const ComponentName = 'CTableHead'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('table-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableHeaderCell.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableHeaderCell.spec.ts
deleted file mode 100644
index e79a589d..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableHeaderCell.spec.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableHeaderCell as Component } from '../../../index'
-
-const ComponentName = 'CTableHeaderCell'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('table-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/CTableRow.spec.ts b/packages/coreui-vue/src/components/table/__tests__/CTableRow.spec.ts
deleted file mode 100644
index 755b0da4..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/CTableRow.spec.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTableRow as Component } from '../../../index'
-
-const ComponentName = 'CTableRow'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    active: true,
-    align: 'middle',
-    color: 'warning',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('align-middle')).toBe(true)
-    expect(customWrapper.classes('table-active')).toBe(true)
-    expect(customWrapper.classes('table-warning')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTable.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTable.spec.ts.snap
deleted file mode 100644
index 896ca48b..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTable.spec.ts.snap
+++ /dev/null
@@ -1,21 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTable component renders correctly 1`] = `
-"<div class="table-responsive-lg">
-  <table class="table align-center caption-top border-dark table-bordered table-borderless table-warning table-hover table-sm table-striped">
-    <!---->
-    <!---->
-    <!---->Default slot
-    <!---->
-  </table>
-</div>"
-`;
-
-exports[`Loads and display CTable component renders correctly 1`] = `
-"<table class="table">
-  <!---->
-  <!---->
-  <!---->Default slot
-  <!---->
-</table>"
-`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableBody.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableBody.spec.ts.snap
deleted file mode 100644
index fc64a172..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableBody.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTableBody component renders correctly 1`] = `"<tbody class="table-warning">Default slot</tbody>"`;
-
-exports[`Loads and display CTableBody component renders correctly 1`] = `"<tbody class="">Default slot</tbody>"`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableCaption.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableCaption.spec.ts.snap
deleted file mode 100644
index 51b451b6..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableCaption.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CTableCaption component renders correctly 1`] = `"<caption>Default slot</caption>"`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableDataCell.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableDataCell.spec.ts.snap
deleted file mode 100644
index 75f33858..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableDataCell.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTableDataCell component renders correctly 1`] = `"<td class="align-middle table-active table-warning">Default slot</td>"`;
-
-exports[`Loads and display CTableDataCell component renders correctly 1`] = `"<td class="">Default slot</td>"`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableFoot.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableFoot.spec.ts.snap
deleted file mode 100644
index 4d50b597..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableFoot.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTableFoot component renders correctly 1`] = `"<tfoot class="table-warning">Default slot</tfoot>"`;
-
-exports[`Loads and display CTableFoot component renders correctly 1`] = `"<tfoot class="">Default slot</tfoot>"`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableHead.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableHead.spec.ts.snap
deleted file mode 100644
index e2a9c114..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableHead.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTableHead component renders correctly 1`] = `"<thead class="table-warning">Default slot</thead>"`;
-
-exports[`Loads and display CTableHead component renders correctly 1`] = `"<thead class="">Default slot</thead>"`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableHeaderCell.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableHeaderCell.spec.ts.snap
deleted file mode 100644
index b5523d84..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableHeaderCell.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTableHeaderCell component renders correctly 1`] = `"<th class="table-warning">Default slot</th>"`;
-
-exports[`Loads and display CTableHeaderCell component renders correctly 1`] = `"<th class="">Default slot</th>"`;
diff --git a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableRow.spec.ts.snap b/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableRow.spec.ts.snap
deleted file mode 100644
index 11c6d246..00000000
--- a/packages/coreui-vue/src/components/table/__tests__/__snapshots__/CTableRow.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTableRow component renders correctly 1`] = `"<tr class="align-middle table-active table-warning">Default slot</tr>"`;
-
-exports[`Loads and display CTableRow component renders correctly 1`] = `"<tr class="">Default slot</tr>"`;
diff --git a/packages/coreui-vue/src/components/table/index.ts b/packages/coreui-vue/src/components/table/index.ts
deleted file mode 100644
index 96b44727..00000000
--- a/packages/coreui-vue/src/components/table/index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { App } from 'vue'
-import { CTable } from './CTable'
-import { CTableBody } from './CTableBody'
-import { CTableCaption } from './CTableCaption'
-import { CTableDataCell } from './CTableDataCell'
-import { CTableFoot } from './CTableFoot'
-import { CTableHead } from './CTableHead'
-import { CTableHeaderCell } from './CTableHeaderCell'
-import { CTableRow } from './CTableRow'
-
-const CTablePlugin = {
-  install: (app: App): void => {
-    app.component(CTable.name as string, CTable)
-    app.component(CTableBody.name as string, CTableBody)
-    app.component(CTableCaption.name as string, CTableCaption)
-    app.component(CTableDataCell.name as string, CTableDataCell)
-    app.component(CTableFoot.name as string, CTableFoot)
-    app.component(CTableHead.name as string, CTableHead)
-    app.component(CTableHeaderCell.name as string, CTableHeaderCell)
-    app.component(CTableRow.name as string, CTableRow)
-  },
-}
-
-export {
-  CTablePlugin,
-  CTable,
-  CTableBody,
-  CTableCaption,
-  CTableDataCell,
-  CTableFoot,
-  CTableHead,
-  CTableHeaderCell,
-  CTableRow,
-}
diff --git a/packages/coreui-vue/src/components/table/types.ts b/packages/coreui-vue/src/components/table/types.ts
deleted file mode 100644
index 8f96b27b..00000000
--- a/packages/coreui-vue/src/components/table/types.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-export type Column = {
-  label?: string
-  key: string
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  _style?: any
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  _props?: any
-}
-
-export type FooterItem = {
-  label?: string
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  _props?: any
-}
-
-export type Item = {
-  [key: string]: number | string | any
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  _props?: any
-}
diff --git a/packages/coreui-vue/src/components/table/utils.ts b/packages/coreui-vue/src/components/table/utils.ts
deleted file mode 100644
index 9c55ade1..00000000
--- a/packages/coreui-vue/src/components/table/utils.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import type { Column, Item } from './types'
-
-export const pretifyName = (name: string) => {
-  return name
-    .replace(/[-_.]/g, ' ')
-    .replace(/ +/g, ' ')
-    .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
-    .split(' ')
-    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
-    .join(' ')
-}
-
-export const getColumnLabel = (column: Column | string) =>
-  typeof column === 'object' ? column.label ?? pretifyName(column.key) : pretifyName(column)
-
-export const getColumnNames = (columns: (string | Column)[] | undefined, items?: Item[]) =>
-  columns
-    ? columns.map((column: Column | string) => {
-        return typeof column === 'object' ? column.key : column
-      })
-    : items && getColumnNamesFromItems(items)
-
-export const getColumnNamesFromItems = (items: Item[]) =>
-  Object.keys(items[0] || {}).filter((el) => el.charAt(0) !== '_')
diff --git a/packages/coreui-vue/src/components/tabs/CTab.ts b/packages/coreui-vue/src/components/tabs/CTab.ts
deleted file mode 100644
index 5eb4c513..00000000
--- a/packages/coreui-vue/src/components/tabs/CTab.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { defineComponent, h, inject, Ref } from 'vue'
-
-const CTab = defineComponent({
-  name: 'CTab',
-  props: {
-    /**
-     * Toggle the disabled state for the component.
-     *
-     * @since 5.4.0
-     */
-    disabled: Boolean,
-    /**
-     * Item key.
-     */
-    itemKey: {
-      type: [Number, String],
-      required: true,
-    },
-  },
-  setup(props, { slots }) {
-    const activeItemKey = inject('activeItemKey') as Ref<number | string>
-    const id = inject('id')
-    const setActiveItemKey = inject('setActiveItemKey') as (key: number | string) => void
-
-    const isActive = () => props.itemKey === activeItemKey.value
-
-    return () =>
-      h(
-        'button',
-        {
-          class: [
-            'nav-link',
-            {
-              active: isActive(),
-            },
-          ],
-          id: `${props.itemKey}-tab-${id}`,
-          role: 'tab',
-          tabindex: isActive() ? 0 : -1,
-          type: 'button',
-          'aria-controls': `${props.itemKey}-tab-panel-${id}`,
-          'aria-selected': isActive(),
-          disabled: props.disabled,
-          onClick: () => setActiveItemKey(props.itemKey),
-          onFocus: () => setActiveItemKey(props.itemKey),
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTab }
diff --git a/packages/coreui-vue/src/components/tabs/CTabContent.ts b/packages/coreui-vue/src/components/tabs/CTabContent.ts
deleted file mode 100644
index f0ad00b1..00000000
--- a/packages/coreui-vue/src/components/tabs/CTabContent.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CTabContent = defineComponent({
-  name: 'CTabContent',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'tab-content' }, slots.default && slots.default())
-  },
-})
-
-export { CTabContent }
diff --git a/packages/coreui-vue/src/components/tabs/CTabList.ts b/packages/coreui-vue/src/components/tabs/CTabList.ts
deleted file mode 100644
index d73bb17d..00000000
--- a/packages/coreui-vue/src/components/tabs/CTabList.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import { defineComponent, h, ref } from 'vue'
-import { getNextActiveElement } from '../../utils'
-
-const CTabList = defineComponent({
-  name: 'CTabList',
-  props: {
-    /**
-     * Specify a layout type for component.
-     *
-     * @values 'fill', 'justified'
-     */
-    layout: {
-      type: String,
-      validator: (value: string) => {
-        return ['fill', 'justified'].includes(value)
-      },
-    },
-    /**
-     * Set the nav variant to tabs or pills.
-     *
-     * @values 'enclosed', 'enclosed-pills', 'pills', 'tabs', 'underline', 'underline-border'
-     */
-    variant: {
-      type: String,
-      validator: (value: string) => {
-        return ['enclosed', 'enclosed-pills', 'pills', 'tabs', 'underline', 'underline-border'].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    const tabListRef = ref<HTMLDivElement>()
-
-    const handleKeydown = (event: KeyboardEvent) => {
-      if (
-        tabListRef.value &&
-        (event.key === 'ArrowDown' ||
-          event.key === 'ArrowUp' ||
-          event.key === 'ArrowLeft' ||
-          event.key === 'ArrowRight' ||
-          event.key === 'Home' ||
-          event.key === 'End')
-      ) {
-        event.preventDefault()
-        const target = event.target as HTMLElement
-        // eslint-disable-next-line unicorn/prefer-spread
-        const items: HTMLElement[] = Array.from(
-          tabListRef.value.querySelectorAll('.nav-link:not(.disabled):not(:disabled)'),
-        )
-
-        let nextActiveElement
-
-        if (event.key === 'Home' || event.key === 'End') {
-          nextActiveElement = event.key === 'End' ? items.at(-1) : items[0]
-        } else {
-          nextActiveElement = getNextActiveElement(
-            items,
-            target,
-            event.key === 'ArrowDown' || event.key === 'ArrowRight',
-            true,
-          )
-        }
-
-        if (nextActiveElement) {
-          nextActiveElement.focus({ preventScroll: true })
-        }
-      }
-    }
-
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'nav',
-            props.variant === 'enclosed-pills' && 'nav-enclosed',
-            {
-              [`nav-${props.layout}`]: props.layout,
-              [`nav-${props.variant}`]: props.variant,
-            },
-          ],
-          role: 'tablist',
-          onKeydown: (event) => handleKeydown(event),
-          ref: tabListRef,
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CTabList }
diff --git a/packages/coreui-vue/src/components/tabs/CTabPane.ts b/packages/coreui-vue/src/components/tabs/CTabPane.ts
deleted file mode 100644
index 7614c346..00000000
--- a/packages/coreui-vue/src/components/tabs/CTabPane.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { defineComponent, h, ref, RendererElement, Transition, vShow, withDirectives } from 'vue'
-
-import { executeAfterTransition } from '../../utils/transition'
-
-const CTabPane = defineComponent({
-  name: 'CTabPane',
-  props: {
-    /**
-     * Enable fade in and fade out transition.
-     *
-     * @since 5.1.0
-     */
-    transition: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Toggle the visibility of component.
-     */
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { slots, emit }) {
-    const tabPaneRef = ref()
-    const firstRender = ref(true)
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      firstRender.value = false
-      emit('show')
-      setTimeout(() => {
-        executeAfterTransition(() => done(), el as HTMLElement)
-        el.classList.add('show')
-      }, 1)
-    }
-
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      firstRender.value = false
-      emit('hide')
-      el.classList.remove('show')
-      executeAfterTransition(() => done(), el as HTMLElement)
-    }
-
-    return () =>
-      h(
-        Transition,
-        {
-          onEnter: (el, done) => handleEnter(el, done),
-          onLeave: (el, done) => handleLeave(el, done),
-        },
-        () =>
-          withDirectives(
-            h(
-              'div',
-              {
-                class: [
-                  'tab-pane',
-                  {
-                    active: props.visible,
-                    fade: props.transition,
-                    show: firstRender.value && props.visible,
-                  },
-                ],
-                ref: tabPaneRef,
-              },
-              slots.default && slots.default(),
-            ),
-            [[vShow, props.visible]],
-          ),
-      )
-  },
-})
-
-export { CTabPane }
diff --git a/packages/coreui-vue/src/components/tabs/CTabPanel.ts b/packages/coreui-vue/src/components/tabs/CTabPanel.ts
deleted file mode 100644
index 3182e74f..00000000
--- a/packages/coreui-vue/src/components/tabs/CTabPanel.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import {
-  defineComponent,
-  h,
-  inject,
-  ref,
-  Ref,
-  RendererElement,
-  Transition,
-  vShow,
-  watch,
-  withDirectives,
-} from 'vue'
-
-import { executeAfterTransition } from '../../utils/transition'
-
-const CTabPanel = defineComponent({
-  name: 'CTabPanel',
-  props: {
-    /**
-     * Item key.
-     */
-    itemKey: {
-      type: [Number, String],
-      required: true,
-    },
-    /**
-     * Enable fade in and fade out transition.
-     */
-    transition: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Toggle the visibility of component.
-     */
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { slots, emit }) {
-    const activeItemKey = inject('activeItemKey') as Ref<number | string>
-    const id = inject('id')
-    const tabPaneRef = ref()
-    const firstRender = ref(true)
-    const visible = ref()
-
-    watch(
-      () => props.visible,
-      () => {
-        visible.value = props.visible
-      },
-      {
-        immediate: true,
-      },
-    )
-
-    watch(
-      activeItemKey,
-      () => {
-        visible.value = Boolean(activeItemKey.value === props.itemKey)
-      },
-      {
-        immediate: true,
-      },
-    )
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      firstRender.value = false
-      emit('show')
-      setTimeout(() => {
-        executeAfterTransition(() => done(), el as HTMLElement)
-        el.classList.add('show')
-      }, 1)
-    }
-
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      firstRender.value = false
-      emit('hide')
-      el.classList.remove('show')
-      executeAfterTransition(() => done(), el as HTMLElement)
-    }
-
-    return () =>
-      h(
-        Transition,
-        {
-          onEnter: (el, done) => handleEnter(el, done),
-          onLeave: (el, done) => handleLeave(el, done),
-        },
-        () =>
-          withDirectives(
-            h(
-              'div',
-              {
-                class: [
-                  'tab-pane',
-                  {
-                    active: visible.value,
-                    fade: props.transition,
-                    show: firstRender.value && visible.value,
-                  },
-                ],
-                id: `${props.itemKey}-tab-panel-${id}`,
-                role: 'tabpanel',
-                'aria-labelledby': `${props.itemKey}-tab-${id}`,
-                tabindex: 0,
-                ref: tabPaneRef,
-              },
-              slots.default && slots.default(),
-            ),
-            [[vShow, visible.value]],
-          ),
-      )
-  },
-})
-
-export { CTabPanel }
diff --git a/packages/coreui-vue/src/components/tabs/CTabs.ts b/packages/coreui-vue/src/components/tabs/CTabs.ts
deleted file mode 100644
index b61908c2..00000000
--- a/packages/coreui-vue/src/components/tabs/CTabs.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { defineComponent, h, provide, ref, useId, watch } from 'vue'
-
-const CTabs = defineComponent({
-  name: 'CTabs',
-  props: {
-    /**
-     * The active item key.
-     */
-    activeItemKey: {
-      type: [Number, String],
-      required: true,
-    }
-  },
-  emits: [
-    /**
-     * The callback is fired when the active tab changes.
-     */
-    'change',
-  ],
-  setup(props, { slots, emit }) {
-    const activeItemKey = ref(props.activeItemKey)
-    const uniqueId = useId()
-    const setActiveItemKey = (key: string | number) => {
-      activeItemKey.value = key
-    }
-
-    watch(
-      () => props.activeItemKey,
-      (value) => {
-        activeItemKey.value = value
-        emit('change', value)
-      },
-    )
-
-    provide('activeItemKey', activeItemKey)
-    provide('id', uniqueId)
-    provide('setActiveItemKey', setActiveItemKey)
-
-    return () => h('div', { class: 'tabs' }, slots.default && slots.default())
-  },
-})
-
-export { CTabs }
diff --git a/packages/coreui-vue/src/components/tabs/__tests__/CTabContent.spec.ts b/packages/coreui-vue/src/components/tabs/__tests__/CTabContent.spec.ts
deleted file mode 100644
index 20f4ffaf..00000000
--- a/packages/coreui-vue/src/components/tabs/__tests__/CTabContent.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTabContent as Component } from '../../../index'
-
-const ComponentName = 'CTabContent'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('tab-content')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/tabs/__tests__/CTabPane.spec.ts b/packages/coreui-vue/src/components/tabs/__tests__/CTabPane.spec.ts
deleted file mode 100644
index 21b235f6..00000000
--- a/packages/coreui-vue/src/components/tabs/__tests__/CTabPane.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CTabPane as Component } from '../../../index'
-
-const ComponentName = 'CTabPane'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.find('.tab-pane').classes('tab-pane')).toBe(true)
-    expect(defaultWrapper.find('.tab-pane').classes('fade')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.find('.tab-pane').classes('tab-pane')).toBe(true)
-    expect(customWrapper.find('.tab-pane').classes('fade')).toBe(true)
-    expect(customWrapper.find('.tab-pane').classes('show')).toBe(true)
-    expect(customWrapper.find('.tab-pane').classes('active')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/tabs/__tests__/__snapshots__/CTabContent.spec.ts.snap b/packages/coreui-vue/src/components/tabs/__tests__/__snapshots__/CTabContent.spec.ts.snap
deleted file mode 100644
index a6fe655d..00000000
--- a/packages/coreui-vue/src/components/tabs/__tests__/__snapshots__/CTabContent.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CTabContent component renders correctly 1`] = `"<div class="tab-content">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap b/packages/coreui-vue/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap
deleted file mode 100644
index 49b97a03..00000000
--- a/packages/coreui-vue/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap
+++ /dev/null
@@ -1,13 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CTabPane component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="true">
-  <div class="tab-pane fade active show">Default slot</div>
-</transition-stub>"
-`;
-
-exports[`Loads and display CTabPane component renders correctly 1`] = `
-"<transition-stub appear="false" persisted="false" css="true">
-  <div class="tab-pane fade" style="display: none;">Default slot</div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/tabs/index.ts b/packages/coreui-vue/src/components/tabs/index.ts
deleted file mode 100644
index 7c848b03..00000000
--- a/packages/coreui-vue/src/components/tabs/index.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { App } from 'vue'
-import { CTab } from './CTab'
-import { CTabContent } from './CTabContent'
-import { CTabList } from './CTabList'
-import { CTabPane } from './CTabPane'
-import { CTabPanel } from './CTabPanel'
-import { CTabs } from './CTabs'
-
-const CTabsPlugin = {
-  install: (app: App): void => {
-    app.component(CTab.name as string, CTab)
-    app.component(CTabContent.name as string, CTabContent)
-    app.component(CTabList.name as string, CTabList)
-    app.component(CTabPane.name as string, CTabPane)
-    app.component(CTabPanel.name as string, CTabPanel)
-    app.component(CTabs.name as string, CTabs)
-  },
-}
-
-export { CTabsPlugin, CTab, CTabContent, CTabList, CTabPane, CTabPanel, CTabs }
diff --git a/packages/coreui-vue/src/components/toast/CToast.ts b/packages/coreui-vue/src/components/toast/CToast.ts
deleted file mode 100644
index eb6c84e5..00000000
--- a/packages/coreui-vue/src/components/toast/CToast.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import { defineComponent, h, onMounted, provide, ref, Transition } from 'vue'
-
-import { Color } from '../../props'
-
-const CToast = defineComponent({
-  name: 'CToast',
-  props: {
-    /**
-     * Auto hide the toast.
-     */
-    autohide: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light', string
-     */
-    color: Color,
-    /**
-     * Delay hiding the toast (ms).
-     */
-    delay: {
-      type: Number,
-      default: 5000,
-    },
-    /**
-     * Optionally add a close button to component and allow it to self dismiss.
-     */
-    dismissible: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * index of the component.
-     */
-    index: Number,
-    /**
-     * Title node for your component.
-     */
-    title: String,
-    /**
-     * Toggle the visibility of component.
-     */
-    visible: Boolean,
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be closed.
-     */
-    'close',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { slots, emit }) {
-    const timeout = ref(0)
-    const visible = ref()
-
-    const updateVisible = (_visible: boolean) => {
-      visible.value = _visible
-    }
-
-    provide('updateVisible', updateVisible)
-
-    onMounted(() => {
-      if (props.visible) {
-        visible.value = props.visible
-      }
-
-      if (props.autohide) {
-        clearTimeout(timeout.value)
-        timeout.value = window.setTimeout(() => {
-          visible.value = false
-          emit('close')
-        }, props.delay)
-      }
-    })
-
-    return () =>
-      h(
-        Transition,
-        {
-          appear: true,
-          enterFromClass: '',
-          enterActiveClass: 'show showing',
-          enterToClass: 'show',
-          leaveFromClass: 'show',
-          leaveActiveClass: 'show showing',
-          leaveToClass: 'show',
-          onAfterEnter: (el) => {
-            el.classList.add('show')
-            props.index ? emit('show', props.index) : emit('show')
-          },
-          onAfterLeave: () => {
-            props.index ? emit('close', props.index) : emit('close')
-          },
-        },
-        {
-          default: () =>
-            visible.value &&
-            h(
-              'div',
-              {
-                class: [
-                  'toast fade',
-                  {
-                    [`bg-${props.color}`]: props.color,
-                  },
-                ],
-                'aria-live': 'assertive',
-                'aria-atomic': true,
-                role: 'alert',
-              },
-              slots.default && slots.default(),
-            ),
-        },
-      )
-  },
-})
-
-export { CToast }
diff --git a/packages/coreui-vue/src/components/toast/CToastBody.ts b/packages/coreui-vue/src/components/toast/CToastBody.ts
deleted file mode 100644
index 7d935069..00000000
--- a/packages/coreui-vue/src/components/toast/CToastBody.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CToastBody = defineComponent({
-  name: 'CToastBody',
-  setup(_, { slots }) {
-    return () => h('div', { class: 'toast-body' }, slots.default && slots.default())
-  },
-})
-
-export { CToastBody }
diff --git a/packages/coreui-vue/src/components/toast/CToastClose.ts b/packages/coreui-vue/src/components/toast/CToastClose.ts
deleted file mode 100644
index a190e323..00000000
--- a/packages/coreui-vue/src/components/toast/CToastClose.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { defineComponent, h, inject, resolveComponent } from 'vue'
-import { CCloseButton } from '../close-button/CCloseButton'
-
-import type { ComponentProps } from '../../utils/ComponentProps'
-
-interface CCloseButtonProps extends ComponentProps<typeof CCloseButton> {
-  as?: string
-}
-
-const CToastClose = defineComponent({
-  name: 'CToastClose',
-  props: {
-    /**
-     * Component used for the root node. Either a string to use a HTML element or a component.
-     */
-    as: String,
-    ...CCloseButton.props,
-  },
-  emits: [
-    /**
-     * Event called before the dissmiss animation has started.
-     */
-    'close',
-  ],
-  setup(props: CCloseButtonProps, { slots, emit }) {
-    // eslint-disable-next-line no-unused-vars
-    const updateVisible = inject('updateVisible') as (visible: boolean) => void
-    const handleClose = () => {
-      emit('close')
-      updateVisible(false)
-    }
-    return () =>
-      props.as
-        ? h(
-            resolveComponent(props.as),
-            {
-              onClick: () => {
-                handleClose()
-              },
-            },
-            () => slots.default && slots.default(),
-          )
-        : h(CCloseButton, {
-            ...props,
-            onClick: () => {
-              handleClose()
-            },
-          })
-  },
-})
-
-export { CToastClose }
diff --git a/packages/coreui-vue/src/components/toast/CToastHeader.ts b/packages/coreui-vue/src/components/toast/CToastHeader.ts
deleted file mode 100644
index 3f822da0..00000000
--- a/packages/coreui-vue/src/components/toast/CToastHeader.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { CToastClose } from './CToastClose'
-
-const CToastHeader = defineComponent({
-  name: 'CToastHeader',
-  props: {
-    /**
-     * Automatically add a close button to the header.
-     */
-    closeButton: Boolean,
-  },
-  setup(props, { slots }) {
-    return () =>
-      h('div', { class: 'toast-header' }, [
-        slots.default && slots.default(),
-        props.closeButton && h(CToastClose),
-      ])
-  },
-})
-
-export { CToastHeader }
diff --git a/packages/coreui-vue/src/components/toast/CToaster.ts b/packages/coreui-vue/src/components/toast/CToaster.ts
deleted file mode 100644
index 12217da4..00000000
--- a/packages/coreui-vue/src/components/toast/CToaster.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-const CToaster = defineComponent({
-  name: 'CToaster',
-  props: {
-    /**
-     * Describes the placement of component.
-     *
-     * @values 'top-start', 'top', 'top-end', 'middle-start', 'middle', 'middle-end', 'bottom-start', 'bottom', 'bottom-end'
-     */
-    placement: {
-      type: String,
-      validator: (value: string) => {
-        return [
-          'top-start',
-          'top-center',
-          'top-end',
-          'middle-start',
-          'middle-center',
-          'middle-end',
-          'bottom-start',
-          'bottom-center',
-          'bottom-end',
-        ].includes(value)
-      },
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        'div',
-        {
-          class: [
-            'toaster toast-container',
-            {
-              'position-fixed': props.placement,
-              'top-0': props.placement && props.placement.includes('top'),
-              'top-50 translate-middle-y': props.placement && props.placement.includes('middle'),
-              'bottom-0': props.placement && props.placement.includes('bottom'),
-              'start-0': props.placement && props.placement.includes('start'),
-              'start-50 translate-middle-x': props.placement && props.placement.includes('center'),
-              'end-0': props.placement && props.placement.includes('end'),
-            },
-          ],
-        },
-        slots.default && slots.default(),
-      )
-  },
-})
-
-export { CToaster }
diff --git a/packages/coreui-vue/src/components/toast/__tests__/CToast.spec.ts b/packages/coreui-vue/src/components/toast/__tests__/CToast.spec.ts
deleted file mode 100644
index c6296599..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/CToast.spec.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CToast as Component } from '../../../index'
-
-const ComponentName = 'CToast'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    autohide: false,
-    color: 'warning',
-    delay: 3000,
-    dismissible: false,
-    key: 123,
-    title: 'title',
-    visible: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.find('div').text()).toContain('Default slot')
-    expect(defaultWrapper.find('div').classes('toast')).toBe(true)
-    expect(defaultWrapper.find('div').classes('fade')).toBe(true)
-    expect(defaultWrapper.find('div').attributes('aria-live')).toBe('assertive')
-    expect(defaultWrapper.find('div').attributes('aria-atomic')).toBe('true')
-    expect(defaultWrapper.find('div').attributes('role')).toBe('alert')
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.find('div').text()).toContain('Default slot')
-    expect(customWrapper.find('div').classes('toast')).toBe(true)
-    expect(customWrapper.find('div').classes('fade')).toBe(true)
-    expect(customWrapper.find('div').classes('bg-warning')).toBe(true)
-    expect(customWrapper.find('div').attributes('aria-live')).toBe('assertive')
-    expect(customWrapper.find('div').attributes('aria-atomic')).toBe('true')
-    expect(customWrapper.find('div').attributes('role')).toBe('alert')
-  })
-})
diff --git a/packages/coreui-vue/src/components/toast/__tests__/CToastBody.spec.ts b/packages/coreui-vue/src/components/toast/__tests__/CToastBody.spec.ts
deleted file mode 100644
index eab8e7e4..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/CToastBody.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CToastBody as Component } from '../../../index'
-
-const ComponentName = 'CToastBody'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('toast-body')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/toast/__tests__/CToastClose.spec.ts b/packages/coreui-vue/src/components/toast/__tests__/CToastClose.spec.ts
deleted file mode 100644
index b12e21a1..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/CToastClose.spec.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CButton, CToastClose as Component } from '../../../index'
-
-const ComponentName = 'CToastClose'
-
-const updateVisible = (v: boolean) => {
-  return v
-}
-
-const defaultWrapper = mount(Component, {
-  global: {
-    provide: {
-      updateVisible: updateVisible,
-    },
-  },
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    as: CButton,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-  global: {
-    provide: {
-      updateVisible: function () {
-        return true
-      },
-    },
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.classes('btn')).toBe(true)
-    expect(defaultWrapper.classes('btn-close')).toBe(true)
-  })
-  it('event on click', () => {
-    defaultWrapper.trigger('click')
-    const incrementEvent = defaultWrapper.emitted('close')
-    expect(incrementEvent).toHaveLength(1)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    //expect(customWrapper.classes('btn')).toBe(true)
-  })
-  it('event on click', () => {
-    customWrapper.trigger('click')
-    const incrementEvent = customWrapper.emitted('close')
-    expect(incrementEvent).toHaveLength(1)
-  })
-})
diff --git a/packages/coreui-vue/src/components/toast/__tests__/CToastHeader.spec.ts b/packages/coreui-vue/src/components/toast/__tests__/CToastHeader.spec.ts
deleted file mode 100644
index 6950cfae..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/CToastHeader.spec.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CToastHeader as Component } from '../../../index'
-
-const ComponentName = 'CToastHeader'
-
-const updateVisible = (v: boolean) => {
-  return v
-}
-
-const defaultWrapper = mount(Component, {
-  global: {
-    provide: {
-      updateVisible: updateVisible,
-    },
-  },
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    closeButton: true,
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('toast-header')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('toast-header')).toBe(true)
-    expect(customWrapper.find('button').classes('btn')).toBe(true)
-    expect(customWrapper.find('button').classes('btn-close')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/toast/__tests__/CToaster.spec.ts b/packages/coreui-vue/src/components/toast/__tests__/CToaster.spec.ts
deleted file mode 100644
index d6e5a617..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/CToaster.spec.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CToaster as Component } from '../../../index'
-
-const ComponentName = 'CToaster'
-
-const defaultWrapper = mount(Component, {
-  propsData: {},
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-const customWrapper = mount(Component, {
-  propsData: {
-    placement: 'top-end',
-  },
-  slots: {
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(defaultWrapper.text()).toContain('Default slot')
-    expect(defaultWrapper.classes('toaster')).toBe(true)
-    expect(defaultWrapper.classes('toast-container')).toBe(true)
-    expect(defaultWrapper.classes('p-3')).toBe(true)
-  })
-})
-
-describe(`Customize ${ComponentName} component`, () => {
-  it('renders correctly', () => {
-    expect(customWrapper.html()).toMatchSnapshot()
-  })
-  it('contain slots and classes', () => {
-    expect(customWrapper.text()).toContain('Default slot')
-    expect(customWrapper.classes('toaster')).toBe(true)
-    expect(customWrapper.classes('toast-container')).toBe(true)
-    expect(customWrapper.classes('p-3')).toBe(true)
-    expect(customWrapper.classes('position-fixed')).toBe(true)
-    expect(customWrapper.classes('top-0')).toBe(true)
-    expect(customWrapper.classes('end-0')).toBe(true)
-  })
-})
diff --git a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToast.spec.ts.snap b/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToast.spec.ts.snap
deleted file mode 100644
index a5234490..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToast.spec.ts.snap
+++ /dev/null
@@ -1,13 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CToast component renders correctly 1`] = `
-"<transition-stub enterfromclass="" enteractiveclass="show showing" entertoclass="show" leavefromclass="show" leaveactiveclass="show showing" leavetoclass="show" appear="true" persisted="false" css="true">
-  <div class="toast fade bg-warning" aria-live="assertive" aria-atomic="true" role="alert">Default slot</div>
-</transition-stub>"
-`;
-
-exports[`Loads and display CToast component renders correctly 1`] = `
-"<transition-stub enterfromclass="" enteractiveclass="show showing" entertoclass="show" leavefromclass="show" leaveactiveclass="show showing" leavetoclass="show" appear="true" persisted="false" css="true">
-  <div class="toast fade" aria-live="assertive" aria-atomic="true" role="alert">Default slot</div>
-</transition-stub>"
-`;
diff --git a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastBody.spec.ts.snap b/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastBody.spec.ts.snap
deleted file mode 100644
index 0636c970..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastBody.spec.ts.snap
+++ /dev/null
@@ -1,3 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CToastBody component renders correctly 1`] = `"<div class="toast-body">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap b/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap
deleted file mode 100644
index 6944431f..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CToastClose component renders correctly 1`] = `"<button class="btn btn-undefined" type="button">Default slot</button>"`;
-
-exports[`Loads and display CToastClose component renders correctly 1`] = `"<button type="button" class="btn btn-close" aria-label="Close"></button>"`;
diff --git a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastHeader.spec.ts.snap b/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastHeader.spec.ts.snap
deleted file mode 100644
index 6682d823..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToastHeader.spec.ts.snap
+++ /dev/null
@@ -1,9 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CToastHeader component renders correctly 1`] = `"<div class="toast-header">Default slot<button type="button" class="btn btn-close" aria-label="Close"></button></div>"`;
-
-exports[`Loads and display CToastHeader component renders correctly 1`] = `
-"<div class="toast-header">Default slot
-  <!---->
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToaster.spec.ts.snap b/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToaster.spec.ts.snap
deleted file mode 100644
index 950cc006..00000000
--- a/packages/coreui-vue/src/components/toast/__tests__/__snapshots__/CToaster.spec.ts.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Customize CToaster component renders correctly 1`] = `"<div class="toaster toast-container position-fixed top-0 end-0">Default slot</div>"`;
-
-exports[`Loads and display CToaster component renders correctly 1`] = `"<div class="toaster toast-container">Default slot</div>"`;
diff --git a/packages/coreui-vue/src/components/toast/index.ts b/packages/coreui-vue/src/components/toast/index.ts
deleted file mode 100644
index bf297589..00000000
--- a/packages/coreui-vue/src/components/toast/index.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { App } from 'vue'
-import { CToast } from './CToast'
-import { CToastBody } from './CToastBody'
-import { CToastClose } from './CToastClose'
-import { CToaster } from './CToaster'
-import { CToastHeader } from './CToastHeader'
-
-const CToastPlugin = {
-  install: (app: App): void => {
-    app.component(CToast.name as string, CToast)
-    app.component(CToastBody.name as string, CToastBody)
-    app.component(CToastClose.name as string, CToastClose)
-    app.component(CToaster.name as string, CToaster)
-    app.component(CToastHeader.name as string, CToastHeader)
-  },
-}
-
-export { CToastPlugin, CToast, CToastBody, CToastClose, CToaster, CToastHeader }
diff --git a/packages/coreui-vue/src/components/tooltip/CTooltip.ts b/packages/coreui-vue/src/components/tooltip/CTooltip.ts
deleted file mode 100644
index 6fe15d0e..00000000
--- a/packages/coreui-vue/src/components/tooltip/CTooltip.ts
+++ /dev/null
@@ -1,244 +0,0 @@
-import { defineComponent, h, PropType, ref, RendererElement, Transition, useId } from 'vue'
-import type { Placement } from '@popperjs/core'
-
-import { CConditionalTeleport } from '../conditional-teleport'
-import { usePopper } from '../../composables'
-import type { Placements, Triggers } from '../../types'
-import { executeAfterTransition } from '../../utils/transition'
-import { getRTLPlacement } from '../../utils'
-
-const CTooltip = defineComponent({
-  name: 'CTooltip',
-  inheritAttrs: false,
-  props: {
-    /**
-     * Apply a CSS fade transition to the tooltip.
-     *
-     * @since 4.9.0
-     */
-    animation: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Appends the vue tooltip to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
-     *
-     * @since 5.0.0
-     */
-    container: {
-      type: [Object, String] as PropType<HTMLElement | (() => HTMLElement) | string>,
-      default: 'body',
-    },
-    /**
-     * Content for your component. If you want to pass non-string value please use dedicated slot `<template #content>...</template>`
-     */
-    content: String,
-    /**
-     * The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`.
-     *
-     * @since 4.9.0
-     */
-    delay: {
-      type: [Number, Object] as PropType<number | { show: number; hide: number }>,
-      default: 0,
-    },
-    /**
-     * Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.
-     *
-     * @since 4.9.0
-     */
-    fallbackPlacements: {
-      type: [String, Array] as PropType<Placements | Placements[]>,
-      default: () => ['top', 'right', 'bottom', 'left'],
-      validator: (value: Placements | Placements[]) => {
-        if (typeof value === 'string') {
-          return ['top', 'right', 'bottom', 'left'].includes(value)
-        }
-        if (Array.isArray(value)) {
-          return value.every((e) => ['top', 'right', 'bottom', 'left'].includes(e))
-        }
-        return false
-      },
-    },
-    /**
-     * Offset of the tooltip relative to its target.
-     */
-    offset: {
-      type: Array,
-      default: () => [0, 6],
-    },
-    /**
-     * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.
-     */
-    placement: {
-      type: String as PropType<Placement>,
-      default: 'top',
-      validator: (value: string) => {
-        return ['top', 'right', 'bottom', 'left'].includes(value)
-      },
-    },
-    /**
-     * Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.
-     *
-     * @values 'click', 'focus', 'hover'
-     */
-    trigger: {
-      type: [String, Array] as PropType<Triggers | Triggers[]>,
-      default: () => ['hover', 'focus'],
-      validator: (value: Triggers | Triggers[]) => {
-        if (typeof value === 'string') {
-          return ['click', 'focus', 'hover'].includes(value)
-        }
-        if (Array.isArray(value)) {
-          return value.every((e) => ['click', 'focus', 'hover'].includes(e))
-        }
-        return false
-      },
-    },
-    /**
-     * Toggle the visibility of tooltip component.
-     */
-    visible: Boolean,
-  },
-  emits: [
-    /**
-     * Callback fired when the component requests to be hidden.
-     */
-    'hide',
-    /**
-     * Callback fired when the component requests to be shown.
-     */
-    'show',
-  ],
-  setup(props, { attrs, slots, emit }) {
-    const togglerRef = ref()
-    const tooltipRef = ref()
-    const visible = ref(props.visible)
-
-    const { initPopper, destroyPopper } = usePopper()
-    const uniqueId = `tooltip-${useId()}`
-
-    const delay =
-      typeof props.delay === 'number' ? { show: props.delay, hide: props.delay } : props.delay
-
-    const popperConfig = {
-      modifiers: [
-        {
-          name: 'arrow',
-          options: {
-            element: '.tooltip-arrow',
-          },
-        },
-        {
-          name: 'flip',
-          options: {
-            fallbackPlacements: props.fallbackPlacements,
-          },
-        },
-        {
-          name: 'offset',
-          options: {
-            offset: props.offset,
-          },
-        },
-      ],
-      placement: getRTLPlacement(props.placement, togglerRef.value),
-    }
-
-    const handleEnter = (el: RendererElement, done: () => void) => {
-      emit('show')
-      initPopper(togglerRef.value, tooltipRef.value, popperConfig)
-      el.classList.add('show')
-      executeAfterTransition(() => done(), el as HTMLElement)
-    }
-
-    const handleLeave = (el: RendererElement, done: () => void) => {
-      emit('hide')
-      el.classList.remove('show')
-      executeAfterTransition(() => {
-        done()
-        destroyPopper()
-      }, el as HTMLElement)
-    }
-
-    const toggleVisible = (event: Event, _visible: boolean) => {
-      togglerRef.value = event.target
-      if (_visible) {
-        setTimeout(() => {
-          visible.value = true
-        }, delay.show)
-        return
-      }
-
-      setTimeout(() => {
-        visible.value = false
-      }, delay.hide)
-    }
-
-    return () => [
-      h(
-        CConditionalTeleport,
-        {
-          container: props.container,
-          teleport: true,
-        },
-        {
-          default: () =>
-            h(
-              Transition,
-              {
-                onEnter: (el, done) => handleEnter(el, done),
-                onLeave: (el, done) => handleLeave(el, done),
-              },
-              () =>
-                visible.value &&
-                h(
-                  'div',
-                  {
-                    ...attrs,
-                    class: [
-                      'tooltip',
-                      'bs-tooltip-auto',
-                      {
-                        fade: props.animation,
-                      },
-                      attrs.class,
-                    ],
-                    id: uniqueId,
-                    ref: tooltipRef,
-                    role: 'tooltip',
-                  },
-                  [
-                    h('div', { class: 'tooltip-arrow' }),
-                    (props.content || slots.content) &&
-                      h(
-                        'div',
-                        { class: 'tooltip-inner' },
-                        {
-                          default: () => (slots.content && slots.content()) || props.content,
-                        },
-                      ),
-                  ],
-                ),
-            ),
-        },
-      ),
-      slots.toggler &&
-        slots.toggler({
-          id: visible.value ? uniqueId : null,
-          on: {
-            click: (event: Event) =>
-              props.trigger.includes('click') && toggleVisible(event, !visible.value),
-            blur: (event: Event) => props.trigger.includes('focus') && toggleVisible(event, false),
-            focus: (event: Event) => props.trigger.includes('focus') && toggleVisible(event, true),
-            mouseenter: (event: Event) =>
-              props.trigger.includes('hover') && toggleVisible(event, true),
-            mouseleave: (event: Event) =>
-              props.trigger.includes('hover') && toggleVisible(event, false),
-          },
-        }),
-    ]
-  },
-})
-
-export { CTooltip }
diff --git a/packages/coreui-vue/src/components/tooltip/index.ts b/packages/coreui-vue/src/components/tooltip/index.ts
deleted file mode 100644
index cde4a9a3..00000000
--- a/packages/coreui-vue/src/components/tooltip/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { App } from 'vue'
-import { CTooltip } from './CTooltip'
-
-const CTooltipPlugin = {
-  install: (app: App): void => {
-    app.component(CTooltip.name as string, CTooltip)
-  },
-}
-
-export { CTooltipPlugin, CTooltip }
diff --git a/packages/coreui-vue/src/components/widgets/CWidgetStatsA.ts b/packages/coreui-vue/src/components/widgets/CWidgetStatsA.ts
deleted file mode 100644
index 998217ed..00000000
--- a/packages/coreui-vue/src/components/widgets/CWidgetStatsA.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CCard, CCardBody } from '../card'
-
-const CWidgetStatsA = defineComponent({
-  name: 'CWidgetStatsA',
-  props: {
-    color: String,
-    /**
-     * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
-     */
-    title: String,
-    /**
-     * Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>`
-     */
-    value: {
-      type: [Number, String],
-      default: 0,
-    },
-  },
-  /**
-   * Location for action component, ex. `<CDropdown>`.
-   *
-   * @slot action
-   */
-  /**
-   * Location for chart component.
-   *
-   * @slot chart
-   */
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CCard,
-        {
-          class: [{ [`bg-${props.color}`]: props.color, 'text-white': props.color }],
-        },
-        () => [
-          h(
-            CCardBody,
-            {
-              class: 'pb-0 d-flex justify-content-between align-items-start',
-            },
-            () => [
-              h('div', {}, [
-                (props.value || slots.value) &&
-                  h(
-                    'div',
-                    { class: 'fs-4 fw-semibold' },
-                    {
-                      default: () => (slots.value && slots.value()) || props.value,
-                    },
-                  ),
-                (props.title || slots.title) &&
-                  h(
-                    'div',
-                    {},
-                    {
-                      default: () => (slots.title && slots.title()) || props.title,
-                    },
-                  ),
-              ]),
-              /**
-               * @slot Location for action component, ex. `<CDropdown>`.
-               */
-              slots.action && slots.action(),
-            ],
-          ),
-          /**
-           * @slot Location for chart component.
-           */
-          slots.chart && slots.chart(),
-          slots.default && slots.default(),
-        ],
-      )
-  },
-})
-
-export { CWidgetStatsA }
diff --git a/packages/coreui-vue/src/components/widgets/CWidgetStatsB.ts b/packages/coreui-vue/src/components/widgets/CWidgetStatsB.ts
deleted file mode 100644
index ded7cd3f..00000000
--- a/packages/coreui-vue/src/components/widgets/CWidgetStatsB.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { shape } from 'vue-types'
-
-import { CCard, CCardBody } from '../card'
-import { CProgress } from '../progress'
-
-import { Color } from '../../props'
-
-const CWidgetStatsB = defineComponent({
-  name: 'CWidgetStatsB',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Colors have been inverted from their default dark shade.
-     */
-    inverse: Boolean,
-    progress: shape({
-      /**
-       * Sets the color context of the progress bar to one of CoreUI’s themed colors
-       *
-       * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-       */
-      color: Color,
-      /**
-       * The percent to progress the ProgressBar (out of 100).
-       */
-      value: {
-        type: Number,
-        default: 0,
-      },
-    }),
-    /**
-     * Helper text for your component. If you want to pass non-string value please use dedicated slot `<template #text>...</template>`
-     */
-    text: String,
-    /**
-     * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
-     */
-    title: String,
-    /**
-     * Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>`
-     */
-    value: {
-      type: [Number, String],
-      default: 0,
-    },
-  },
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CCard,
-        {
-          class: [
-            {
-              'text-white': props.inverse,
-            },
-          ],
-          color: props.color,
-        },
-        () =>
-          h(
-            CCardBody,
-            {
-              class: 'card-body',
-            },
-            () => [
-              (props.value || slots.value) &&
-                h(
-                  'div',
-                  {
-                    class: 'fs-4 fw-semibold',
-                  },
-                  {
-                    default: () => (slots.value && slots.value()) || props.value,
-                  },
-                ),
-              (props.title || slots.title) &&
-                h(
-                  'div',
-                  {},
-                  {
-                    default: () => (slots.title && slots.title()) || props.title,
-                  },
-                ),
-              h(CProgress, {
-                class: 'my-2',
-                ...(props.progress && props.progress.color && { color: props.progress.color }),
-                height: 4,
-                ...(props.progress && props.progress.value && { value: props.progress.value }),
-                white: props.inverse,
-              }),
-              (props.text || slots.text) &&
-                h(
-                  'small',
-                  {
-                    class: [props.inverse ? 'text-white text-opacity-75' : 'text-body-secondary'],
-                  },
-                  {
-                    default: () => (slots.text && slots.text()) || props.text,
-                  },
-                ),
-            ],
-          ),
-      )
-  },
-})
-
-export { CWidgetStatsB }
diff --git a/packages/coreui-vue/src/components/widgets/CWidgetStatsC.ts b/packages/coreui-vue/src/components/widgets/CWidgetStatsC.ts
deleted file mode 100644
index 8c4c6a7c..00000000
--- a/packages/coreui-vue/src/components/widgets/CWidgetStatsC.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import { defineComponent, h } from 'vue'
-import { shape } from 'vue-types'
-
-import { Color } from '../../props'
-import { CCard, CCardBody } from '../card'
-import { CProgress } from '../progress/CProgress'
-
-const CWidgetStatsC = defineComponent({
-  name: 'CWidgetStatsC',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Colors have been inverted from their default dark shade.
-     */
-    inverse: Boolean,
-    progress: shape({
-      /**
-       * Sets the color context of the progress bar to one of CoreUI’s themed colors
-       *
-       * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-       */
-      color: Color,
-      /**
-       * The percent to progress the ProgressBar (out of 100).
-       */
-      value: {
-        type: Number,
-        default: 0,
-      },
-    }),
-    /**
-     * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
-     */
-    title: String,
-    /**
-     * Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>`
-     */
-    value: {
-      type: [Number, String],
-      default: 0,
-    },
-  },
-  /**
-   * Location for icon component.
-   *
-   * @slot icon
-   */
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CCard,
-        {
-          class: [
-            {
-              ['text-white']: props.inverse,
-            },
-          ],
-          color: props.color,
-        },
-        () =>
-          h(
-            CCardBody,
-            {
-              class: 'card-body',
-            },
-            () => [
-              slots.icon &&
-                h(
-                  'div',
-                  {
-                    class: [
-                      'text-end mb-4',
-                      props.inverse ? 'text-white text-opacity-75' : 'text-body-secondary',
-                    ],
-                  },
-                  slots.icon && slots.icon(),
-                ),
-              (props.value || slots.value) &&
-                h(
-                  'div',
-                  {
-                    class: 'fs-4 fw-semibold',
-                  },
-                  {
-                    default: () => (slots.value && slots.value()) || props.value,
-                  },
-                ),
-              (props.title || slots.title) &&
-                h(
-                  'div',
-                  {
-                    class: [
-                      'text-uppercase fw-semibold small',
-                      props.inverse ? 'text-white text-opacity-75' : 'text-body-secondary',
-                    ],
-                  },
-                  {
-                    default: () => (slots.title && slots.title()) || props.title,
-                  },
-                ),
-              h(CProgress, {
-                class: 'my-2',
-                ...(props.progress && props.progress.color && { color: props.progress.color }),
-                height: 4,
-                ...(props.progress && props.progress.value && { value: props.progress.value }),
-                white: props.inverse,
-              }),
-            ],
-          ),
-      )
-  },
-})
-
-export { CWidgetStatsC }
diff --git a/packages/coreui-vue/src/components/widgets/CWidgetStatsD.ts b/packages/coreui-vue/src/components/widgets/CWidgetStatsD.ts
deleted file mode 100644
index 0489d1eb..00000000
--- a/packages/coreui-vue/src/components/widgets/CWidgetStatsD.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { defineComponent, h, PropType } from 'vue'
-
-import { CCard, CCardBody, CCardHeader } from '../card/'
-import { CCol } from '../grid/'
-
-import { Color } from '../../props'
-
-type Value = {
-  title?: string
-  value?: number | string
-}
-
-const CWidgetStatsD = defineComponent({
-  name: 'CWidgetStatsD',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Values and titles for your component.
-     */
-    values: {
-      type: Array as PropType<Value[]>,
-      default: () => [],
-    },
-  },
-  /**
-   * Location for icon component, ex. `<CDropdown>`.
-   *
-   * @slot icon
-   */
-  /**
-   * Location for chart component.
-   *
-   * @slot chart
-   */
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CCard,
-        {},
-        {
-          default: () => [
-            h(
-              CCardHeader,
-              {
-                class: [
-                  'position-relative d-flex justify-content-center align-items-center',
-                  {
-                    [`bg-${props.color}`]: props.color,
-                  },
-                ],
-              },
-              () => [slots.icon && slots.icon(), slots.chart && slots.chart()],
-            ),
-            h(
-              CCardBody,
-              {
-                class: 'row text-center',
-              },
-              {
-                default: () =>
-                  props.values &&
-                  props.values.map((value: Value, index: number) => [
-                    index % 2 !== 0 && h('div', { class: 'vr' }),
-                    h(
-                      CCol,
-                      {},
-                      {
-                        default: () => [
-                          h(CCol, { class: 'fs-5 fw-semibold' }, () => value.value),
-                          h(
-                            CCol,
-                            { class: 'text-uppercase text-body-secondary small' },
-                            () => value.title,
-                          ),
-                        ],
-                      },
-                    ),
-                  ]),
-              },
-            ),
-          ],
-        },
-      )
-  },
-})
-
-export { CWidgetStatsD }
diff --git a/packages/coreui-vue/src/components/widgets/CWidgetStatsE.ts b/packages/coreui-vue/src/components/widgets/CWidgetStatsE.ts
deleted file mode 100644
index 8c68d976..00000000
--- a/packages/coreui-vue/src/components/widgets/CWidgetStatsE.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CCard, CCardBody } from '../card/'
-
-const CWidgetStatsE = defineComponent({
-  name: 'CWidgetStatsE',
-  props: {
-    /**
-     * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
-     */
-    title: String,
-    /**
-     * Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>`
-     */
-    value: {
-      type: [Number, String],
-      default: 0,
-    },
-  },
-  /**
-   * Location for chart component.
-   *
-   * @slot chart
-   */
-  setup(props, { slots }) {
-    return () =>
-      h(CCard, {}, () =>
-        h(
-          CCardBody,
-          {
-            class: 'text-center',
-          },
-          () => [
-            (props.title || slots.title) &&
-              h(
-                'div',
-                {
-                  class: 'text-body-secondary small text-uppercase font-weight-bold',
-                },
-                {
-                  default: () => (slots.title && slots.title()) || props.title,
-                },
-              ),
-            (props.value || slots.value) &&
-              h(
-                'div',
-                {
-                  class: 'h2 py-3',
-                },
-                {
-                  default: () => (slots.value && slots.value()) || props.value,
-                },
-              ),
-            slots.chart && slots.chart(),
-            slots.default && slots.default(),
-          ],
-        ),
-      )
-  },
-})
-
-export { CWidgetStatsE }
diff --git a/packages/coreui-vue/src/components/widgets/CWidgetStatsF.ts b/packages/coreui-vue/src/components/widgets/CWidgetStatsF.ts
deleted file mode 100644
index 0c2ffd8e..00000000
--- a/packages/coreui-vue/src/components/widgets/CWidgetStatsF.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { defineComponent, h } from 'vue'
-
-import { CCard, CCardBody, CCardFooter } from '../card/'
-
-import { Color } from '../../props'
-
-const CWidgetStatsF = defineComponent({
-  name: 'CWidgetStatsF',
-  props: {
-    /**
-     * Sets the color context of the component to one of CoreUI’s themed colors.
-     *
-     * @values 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'dark', 'light'
-     */
-    color: Color,
-    /**
-     * Set padding of your component.
-     */
-    padding: {
-      type: Boolean,
-      default: true,
-    },
-    /**
-     * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
-     */
-    title: String,
-    /**
-     * Helper text for your component. If you want to pass non-string value please use dedicated slot `<template #text>...</template>`
-     */
-    text: String,
-    /**
-     * Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>`
-     */
-    value: {
-      type: [Number, String],
-      default: 0,
-    },
-  },
-  /**
-   * Location for icon component.
-   *
-   * @slot icon
-   */
-  setup(props, { slots }) {
-    return () =>
-      h(
-        CCard,
-        {},
-        {
-          default: () => [
-            h(
-              CCardBody,
-              {
-                class: ['d-flex align-items-center', props.padding === false && 'p-0'],
-              },
-              () => [
-                h(
-                  'div',
-                  {
-                    class: [
-                      'me-3',
-                      'text-white',
-                      `bg-${props.color}`,
-                      props.padding ? 'p-3' : 'p-4',
-                    ],
-                  },
-                  (slots.default && slots.default()) || (slots.icon && slots.icon()),
-                ),
-                h('div', {}, [
-                  (props.value || slots.value) &&
-                    h(
-                      'div',
-                      {
-                        class: [`fs-6 fw-semibold text-${props.color}`],
-                      },
-                      {
-                        default: () => (slots.value && slots.value()) || props.value,
-                      },
-                    ),
-                  (props.title || slots.title) &&
-                    h(
-                      'div',
-                      {
-                        class: 'text-body-secondary text-uppercase fw-semibold small',
-                      },
-                      {
-                        default: () => (slots.title && slots.title()) || props.title,
-                      },
-                    ),
-                ]),
-              ],
-            ),
-            slots.footer && h(CCardFooter, {}, () => slots.footer && slots.footer()),
-          ],
-        },
-      )
-  },
-})
-
-export { CWidgetStatsF }
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsA.spec.ts b/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsA.spec.ts
deleted file mode 100644
index a3218baf..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsA.spec.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CWidgetStatsA as Component } from '../../../index'
-
-const ComponentName = 'CWidgetStatsA'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    title: 'title',
-    value: 75,
-  },
-  slots: {
-    action: 'action',
-    chart: 'chart',
-    default: 'Default slot',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsB.spec.ts b/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsB.spec.ts
deleted file mode 100644
index 8ef63d6a..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsB.spec.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CWidgetStatsB as Component } from '../../../index'
-
-const ComponentName = 'CWidgetStatsB'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    inverse: true,
-    progress: {
-      color: 'info',
-      value: 75,
-    },
-    text: 'text',
-    title: 'title',
-    value: 75,
-  },
-  slots: {},
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsC.spec.ts b/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsC.spec.ts
deleted file mode 100644
index eb2374e1..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsC.spec.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CWidgetStatsC as Component } from '../../../index'
-
-const ComponentName = 'CWidgetStatsC'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    inverse: true,
-    progress: {
-      color: 'info',
-      value: 75,
-    },
-    title: 'title',
-    value: 75,
-  },
-  slots: {
-    icon: 'icon',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsD.spec.ts b/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsD.spec.ts
deleted file mode 100644
index 93101c67..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsD.spec.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CWidgetStatsD as Component } from '../../../index'
-
-const ComponentName = 'CWidgetStatsD'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    values: [
-      { title: 'aa', value: 'bb' },
-      { title: 'cc', value: 'dd' },
-    ],
-  },
-  slots: {
-    icon: 'icon',
-    chart: 'chart',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsE.spec.ts b/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsE.spec.ts
deleted file mode 100644
index 21090b6b..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsE.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CWidgetStatsE as Component } from '../../../index'
-
-const ComponentName = 'CWidgetStatsE'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    title: 'title',
-    value: 'value',
-  },
-  slots: {
-    chart: 'chart',
-    default: 'default',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsF.spec.ts b/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsF.spec.ts
deleted file mode 100644
index e2eb8ce5..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/CWidgetStatsF.spec.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { CWidgetStatsF as Component } from '../../../index'
-
-const ComponentName = 'CWidgetStatsF'
-
-const defaultWrapper = mount(Component, {
-  propsData: {
-    color: 'warning',
-    padding: true,
-    title: 'title',
-    text: 'text',
-    value: 75,
-  },
-  slots: {
-    icon: 'icon',
-    default: 'default',
-    footer: 'footer',
-  },
-})
-
-describe(`Loads and display ${ComponentName} component`, () => {
-  it('has a name', () => {
-    expect(Component.name).toMatch(ComponentName)
-  })
-  it('renders correctly', () => {
-    expect(defaultWrapper.html()).toMatchSnapshot()
-  })
-})
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsA.spec.ts.snap b/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsA.spec.ts.snap
deleted file mode 100644
index c2d3d59c..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsA.spec.ts.snap
+++ /dev/null
@@ -1,12 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CWidgetStatsA component renders correctly 1`] = `
-"<div class="card bg-warning text-white">
-  <div class="card-body pb-0 d-flex justify-content-between align-items-start">
-    <div>
-      <div class="fs-4 fw-semibold">75</div>
-      <div>title</div>
-    </div>action
-  </div>chartDefault slot
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsB.spec.ts.snap b/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsB.spec.ts.snap
deleted file mode 100644
index 35a70bb9..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsB.spec.ts.snap
+++ /dev/null
@@ -1,15 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CWidgetStatsB component renders correctly 1`] = `
-"<div class="card bg-warning text-white">
-  <div class="card-body">
-    <div class="fs-4 fw-semibold">75</div>
-    <div>title</div>
-    <div class="progress progress-white my-2" style="height: 4px;" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
-      <div class="progress-bar bg-info" style="width: 75%;">
-        <!---->
-      </div>
-    </div><small class="text-white text-opacity-75">text</small>
-  </div>
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsC.spec.ts.snap b/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsC.spec.ts.snap
deleted file mode 100644
index acea9bdf..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsC.spec.ts.snap
+++ /dev/null
@@ -1,16 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CWidgetStatsC component renders correctly 1`] = `
-"<div class="card bg-warning text-white">
-  <div class="card-body">
-    <div class="text-end mb-4 text-white text-opacity-75">icon</div>
-    <div class="fs-4 fw-semibold">75</div>
-    <div class="text-uppercase fw-semibold small text-white text-opacity-75">title</div>
-    <div class="progress progress-white my-2" style="height: 4px;" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
-      <div class="progress-bar bg-info" style="width: 75%;">
-        <!---->
-      </div>
-    </div>
-  </div>
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsD.spec.ts.snap b/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsD.spec.ts.snap
deleted file mode 100644
index 904ea85c..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsD.spec.ts.snap
+++ /dev/null
@@ -1,19 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CWidgetStatsD component renders correctly 1`] = `
-"<div class="card">
-  <div class="card-header position-relative d-flex justify-content-center align-items-center bg-warning">iconchart</div>
-  <div class="card-body row text-center">
-    <!---->
-    <div class="col">
-      <div class="col fs-5 fw-semibold">bb</div>
-      <div class="col text-uppercase text-body-secondary small">aa</div>
-    </div>
-    <div class="vr"></div>
-    <div class="col">
-      <div class="col fs-5 fw-semibold">dd</div>
-      <div class="col text-uppercase text-body-secondary small">cc</div>
-    </div>
-  </div>
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsE.spec.ts.snap b/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsE.spec.ts.snap
deleted file mode 100644
index 18ed7668..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsE.spec.ts.snap
+++ /dev/null
@@ -1,10 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CWidgetStatsE component renders correctly 1`] = `
-"<div class="card">
-  <div class="card-body text-center">
-    <div class="text-body-secondary small text-uppercase font-weight-bold">title</div>
-    <div class="h2 py-3">value</div>chartdefault
-  </div>
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsF.spec.ts.snap b/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsF.spec.ts.snap
deleted file mode 100644
index 08c236ae..00000000
--- a/packages/coreui-vue/src/components/widgets/__tests__/__snapshots__/CWidgetStatsF.spec.ts.snap
+++ /dev/null
@@ -1,14 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Loads and display CWidgetStatsF component renders correctly 1`] = `
-"<div class="card">
-  <div class="card-body d-flex align-items-center">
-    <div class="me-3 text-white bg-warning p-3">default</div>
-    <div>
-      <div class="fs-6 fw-semibold text-warning">75</div>
-      <div class="text-body-secondary text-uppercase fw-semibold small">title</div>
-    </div>
-  </div>
-  <div class="card-footer">footer</div>
-</div>"
-`;
diff --git a/packages/coreui-vue/src/components/widgets/index.ts b/packages/coreui-vue/src/components/widgets/index.ts
deleted file mode 100644
index 38a6f825..00000000
--- a/packages/coreui-vue/src/components/widgets/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { App } from 'vue'
-import { CWidgetStatsA } from './CWidgetStatsA'
-import { CWidgetStatsB } from './CWidgetStatsB'
-import { CWidgetStatsC } from './CWidgetStatsC'
-import { CWidgetStatsD } from './CWidgetStatsD'
-import { CWidgetStatsE } from './CWidgetStatsE'
-import { CWidgetStatsF } from './CWidgetStatsF'
-
-const CWidgetsStatsPlugin = {
-  install: (app: App): void => {
-    app.component(CWidgetStatsA.name as string, CWidgetStatsA)
-    app.component(CWidgetStatsB.name as string, CWidgetStatsB)
-    app.component(CWidgetStatsC.name as string, CWidgetStatsC)
-    app.component(CWidgetStatsD.name as string, CWidgetStatsD)
-    app.component(CWidgetStatsE.name as string, CWidgetStatsE)
-    app.component(CWidgetStatsF.name as string, CWidgetStatsF)
-  },
-}
-
-export {
-  CWidgetsStatsPlugin,
-  CWidgetStatsA,
-  CWidgetStatsB,
-  CWidgetStatsC,
-  CWidgetStatsD,
-  CWidgetStatsE,
-  CWidgetStatsF,
-}
diff --git a/packages/coreui-vue/src/composables/index.ts b/packages/coreui-vue/src/composables/index.ts
deleted file mode 100644
index 4d78d30e..00000000
--- a/packages/coreui-vue/src/composables/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { useColorModes } from './useColorModes'
-import { usePopper } from './usePopper'
-import { useUniqueId } from './useUniqueId'
-
-export { useColorModes, usePopper, useUniqueId }
diff --git a/packages/coreui-vue/src/composables/useColorModes.ts b/packages/coreui-vue/src/composables/useColorModes.ts
deleted file mode 100644
index ac622e5d..00000000
--- a/packages/coreui-vue/src/composables/useColorModes.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { onBeforeMount, ref, watch } from 'vue'
-
-const getStoredTheme = (localStorageItemName: string) =>
-  typeof window !== 'undefined' && localStorage.getItem(localStorageItemName)
-
-const setStoredTheme = (localStorageItemName: string, colorMode: string) =>
-  localStorage.setItem(localStorageItemName, colorMode)
-
-const getPreferredColorScheme = (localStorageItemName: string) => {
-  if (typeof window === 'undefined') {
-    return
-  }
-
-  const storedTheme = getStoredTheme(localStorageItemName)
-
-  if (storedTheme) {
-    return storedTheme
-  }
-
-  return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
-}
-
-const setTheme = (colorMode: string) => {
-  document.documentElement.dataset.coreuiTheme =
-    colorMode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches
-      ? 'dark'
-      : colorMode
-
-  const event = new Event('ColorSchemeChange')
-  document.documentElement.dispatchEvent(event)
-}
-
-export const useColorModes = (localStorageItemName = 'coreui-vue-color-scheme') => {
-  const colorMode = ref(getPreferredColorScheme(localStorageItemName))
-
-  watch(colorMode, () => {
-    if (colorMode.value) {
-      setStoredTheme(localStorageItemName, colorMode.value)
-      setTheme(colorMode.value)
-    }
-  })
-
-  onBeforeMount(() => {
-    if (typeof getStoredTheme(localStorageItemName) === 'string' && colorMode.value) {
-      setTheme(colorMode.value)
-    }
-
-    window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
-      const storedTheme = getStoredTheme(localStorageItemName)
-      if (storedTheme !== 'light' && storedTheme !== 'dark' && colorMode.value) {
-        setTheme(colorMode.value)
-      }
-    })
-  })
-
-  return {
-    colorMode,
-    isColorModeSet: () => Boolean(getStoredTheme(localStorageItemName)),
-    setColorMode: (mode: string) => {
-      colorMode.value = mode
-    },
-  }
-}
diff --git a/packages/coreui-vue/src/composables/usePopper.ts b/packages/coreui-vue/src/composables/usePopper.ts
deleted file mode 100644
index 23bba6d5..00000000
--- a/packages/coreui-vue/src/composables/usePopper.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ref } from 'vue'
-import { createPopper } from '@popperjs/core'
-import type { Instance, Options } from '@popperjs/core'
-
-export const usePopper = () => {
-  const _popper = ref<Instance>()
-
-  const initPopper = (reference: HTMLElement, popper: HTMLElement, options: Partial<Options>) => {
-    _popper.value = createPopper(reference, popper, options)
-  }
-
-  const destroyPopper = () => {
-    if (_popper.value) {
-      _popper.value.destroy()
-    }
-
-    _popper.value = undefined
-  }
-
-  return {
-    popper: _popper.value,
-    initPopper,
-    destroyPopper,
-  }
-}
diff --git a/packages/coreui-vue/src/composables/useUniqueId.ts b/packages/coreui-vue/src/composables/useUniqueId.ts
deleted file mode 100644
index e6f724a9..00000000
--- a/packages/coreui-vue/src/composables/useUniqueId.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { ref } from 'vue'
-
-export const useUniqueId = (prefix: string = '') => {
-  const ids = ref<string[]>([])
-
-  const getUID = () => {
-    do {
-      prefix += Math.floor(Math.random() * 1_000_000)
-    } while (ids.value.includes(prefix))
-
-    ids.value.push(prefix)
-    return prefix
-  }
-
-  return {
-    getUID,
-  }
-}
diff --git a/packages/coreui-vue/src/directives/index.ts b/packages/coreui-vue/src/directives/index.ts
deleted file mode 100644
index 1ee9a52b..00000000
--- a/packages/coreui-vue/src/directives/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import vcplaceholder from './v-c-placeholder'
-import vcpopover from './v-c-popover'
-import vctooltip from './v-c-tooltip'
-
-export { vcplaceholder, vcpopover, vctooltip }
diff --git a/packages/coreui-vue/src/directives/v-c-placeholder.ts b/packages/coreui-vue/src/directives/v-c-placeholder.ts
deleted file mode 100644
index fcfe23b3..00000000
--- a/packages/coreui-vue/src/directives/v-c-placeholder.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { DirectiveBinding } from 'vue'
-
-const BREAKPOINTS = [
-  'xxl' as const,
-  'xl' as const,
-  'lg' as const,
-  'md' as const,
-  'sm' as const,
-  'xs' as const,
-]
-
-export default {
-  name: 'c-placeholder',
-  mounted(el: HTMLElement, binding: DirectiveBinding): void {
-    const value = binding.value
-    el.classList.add(value.animation ? `placeholder-${value.animation}` : 'placeholder')
-
-    BREAKPOINTS.forEach((bp) => {
-      const breakpoint = value[bp]
-
-      const infix = bp === 'xs' ? '' : `-${bp}`
-
-      if (typeof breakpoint === 'number') {
-        el.classList.add(`col${infix}-${breakpoint}`)
-      }
-
-      if (typeof breakpoint === 'boolean') {
-        el.classList.add(`col${infix}`)
-      }
-    })
-  },
-}
diff --git a/packages/coreui-vue/src/directives/v-c-popover.ts b/packages/coreui-vue/src/directives/v-c-popover.ts
deleted file mode 100644
index 5e846244..00000000
--- a/packages/coreui-vue/src/directives/v-c-popover.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import { DirectiveBinding } from 'vue'
-import { createPopper } from '@popperjs/core'
-import type { Options } from '@popperjs/core'
-
-import { useUniqueId } from '../composables'
-
-const createPopoverElement = (id: string, header: string, content: string): HTMLDivElement => {
-  const popover = document.createElement('div')
-  popover.id = id
-  popover.classList.add('popover', 'bs-popover-auto', 'fade')
-  popover.setAttribute('role', 'popover')
-  popover.innerHTML = `<div class="popover-arrow" data-popper-arrow></div>
-     <div class="popover-header">${header}</div>
-     <div class="popover-body" id="">${content}</div>`
-  return popover
-}
-
-const addPopoverElement = (
-  el: HTMLElement,
-  popover: HTMLDivElement,
-  popperOptions: Partial<Options>,
-  uID: string,
-) => {
-  el.setAttribute('aria-describedby', uID)
-  document.body.appendChild(popover)
-  createPopper(el, popover, popperOptions)
-  setTimeout(() => {
-    popover.classList.add('show')
-  }, 1)
-}
-
-const removePopoverElement = (el: HTMLElement, popover: HTMLDivElement) => {
-  el.removeAttribute('aria-describedby')
-  popover.classList.remove('show')
-  setTimeout(() => {
-    popover.remove()
-  }, 300)
-}
-
-const togglePopoverElement = (
-  el: HTMLElement,
-  popover: HTMLDivElement,
-  popperOptions: Partial<Options>,
-  uID: string,
-) => {
-  const popperElement = document.getElementById(popover.id)
-  if (popperElement && popperElement.classList.contains('show')) {
-    removePopoverElement(el, popover)
-    return
-  }
-  addPopoverElement(el, popover, popperOptions, uID)
-}
-
-export default {
-  name: 'c-popover',
-  uid: '',
-  mounted(el: HTMLElement, binding: DirectiveBinding): void {
-    const { getUID } = useUniqueId('popover')
-    const value = binding.value
-    const content = typeof value === 'string' ? value : value.content ?? ''
-    const header = value.header ?? ''
-    const trigger = value.trigger ?? 'click'
-
-    // Popper Config
-    const offset = value.offset ?? [0, 8]
-    const placement = value.placement ?? 'top'
-
-    const popperOptions = {
-      placement: placement,
-      modifiers: [
-        {
-          name: 'offset',
-          options: {
-            offset: offset,
-          },
-        },
-      ],
-    }
-
-    const uID = getUID()
-    binding.arg = uID
-    const popover = createPopoverElement(uID, header, content)
-
-    trigger.includes('click') &&
-      el.addEventListener('click', () => {
-        togglePopoverElement(el, popover, popperOptions, uID)
-      })
-
-    if (trigger.includes('focus')) {
-      el.addEventListener('focus', () => {
-        addPopoverElement(el, popover, popperOptions, uID)
-      })
-      el.addEventListener('blur', () => {
-        removePopoverElement(el, popover)
-      })
-    }
-
-    if (trigger.includes('hover')) {
-      el.addEventListener('mouseenter', () => {
-        addPopoverElement(el, popover, popperOptions, uID)
-      })
-      el.addEventListener('mouseleave', () => {
-        removePopoverElement(el, popover)
-      })
-    }
-  },
-  unmounted(_el: HTMLElement, binding: DirectiveBinding): void {
-    const popover = binding.arg && document.getElementById(binding.arg)
-    popover && popover.remove()
-  },
-}
diff --git a/packages/coreui-vue/src/directives/v-c-tooltip.ts b/packages/coreui-vue/src/directives/v-c-tooltip.ts
deleted file mode 100644
index bf888042..00000000
--- a/packages/coreui-vue/src/directives/v-c-tooltip.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import { DirectiveBinding } from 'vue'
-import { createPopper } from '@popperjs/core'
-import type { Options } from '@popperjs/core'
-
-import { useUniqueId } from '../composables'
-
-const createTooltipElement = (id: string, content: string): HTMLDivElement => {
-  const tooltip = document.createElement('div')
-  tooltip.id = id
-  tooltip.classList.add('tooltip', 'bs-tooltip-auto', 'fade')
-  tooltip.setAttribute('role', 'tooltip')
-  tooltip.innerHTML = `<div class="tooltip-arrow" data-popper-arrow></div>
-     <div class="tooltip-inner" id="">${content}</div>`
-  return tooltip
-}
-
-const addTooltipElement = (
-  el: HTMLElement,
-  tooltip: HTMLDivElement,
-  popperOptions: Partial<Options>,
-  uID: string,
-) => {
-  el.setAttribute('aria-describedby', uID)
-  document.body.appendChild(tooltip)
-  createPopper(el, tooltip, popperOptions)
-  setTimeout(() => {
-    tooltip.classList.add('show')
-  }, 1)
-}
-
-const removeTooltipElement = (el: HTMLElement, tooltip: HTMLDivElement) => {
-  el.removeAttribute('aria-describedby')
-  tooltip.classList.remove('show')
-  setTimeout(() => {
-    tooltip.remove()
-  }, 300)
-}
-
-const toggleTooltipElement = (
-  el: HTMLElement,
-  tooltip: HTMLDivElement,
-  popperOptions: Partial<Options>,
-  uID: string,
-) => {
-  const popperElement = document.getElementById(tooltip.id)
-  if (popperElement && popperElement.classList.contains('show')) {
-    removeTooltipElement(el, tooltip)
-    return
-  }
-  addTooltipElement(el, tooltip, popperOptions, uID)
-}
-
-export default {
-  name: 'c-tooltip',
-  mounted(el: HTMLElement, binding: DirectiveBinding): void {
-    const { getUID } = useUniqueId('tooltip')
-    const value = binding.value
-    const content = typeof value === 'string' ? value : value.content ?? ''
-    const trigger = value.trigger ?? 'hover'
-
-    // Popper Config
-    const offset = value.offset ?? [0, 6]
-    const placement = value.placement ?? 'top'
-
-    const popperOptions = {
-      placement: placement,
-      modifiers: [
-        {
-          name: 'offset',
-          options: {
-            offset: offset,
-          },
-        },
-      ],
-    }
-
-    const uID = getUID()
-    binding.arg = uID
-    const tooltip = createTooltipElement(uID, content)
-
-    trigger.includes('click') &&
-      el.addEventListener('click', () => {
-        toggleTooltipElement(el, tooltip, popperOptions, uID)
-      })
-
-    if (trigger.includes('focus')) {
-      el.addEventListener('focus', () => {
-        addTooltipElement(el, tooltip, popperOptions, uID)
-      })
-      el.addEventListener('blur', () => {
-        removeTooltipElement(el, tooltip)
-      })
-    }
-
-    if (trigger.includes('hover')) {
-      el.addEventListener('mouseenter', () => {
-        addTooltipElement(el, tooltip, popperOptions, uID)
-      })
-      el.addEventListener('mouseleave', () => {
-        removeTooltipElement(el, tooltip)
-      })
-    }
-  },
-  beforeUnmount(_el: HTMLElement, binding: DirectiveBinding): void {
-    const tooltip = binding.arg && document.getElementById(binding.arg)
-    tooltip && tooltip.remove()
-  },
-}
diff --git a/packages/coreui-vue/src/directives/v-c-visible.ts b/packages/coreui-vue/src/directives/v-c-visible.ts
deleted file mode 100644
index 50c27869..00000000
--- a/packages/coreui-vue/src/directives/v-c-visible.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { ObjectDirective } from 'vue'
-
-interface VShowElement extends HTMLElement {
-  // _vod = vue original display
-  _vod: string
-}
-
-export const vVisible: ObjectDirective<VShowElement> = {
-  beforeMount(el, { value }, { transition }) {
-    el._vod = el.style.display === 'none' ? '' : el.style.display
-    if (transition && value) {
-      transition.beforeEnter(el)
-    }
-  },
-  mounted(el, { value }, { transition }) {
-    if (transition && value) {
-      transition.enter(el)
-    }
-  },
-  updated(el, { value, oldValue }, { transition }) {
-    if (!value === !oldValue) return
-    if (transition) {
-      if (value) {
-        transition.beforeEnter(el)
-        transition.enter(el)
-      } else {
-        transition.leave(el, () => {
-          // setDisplay(el, false)
-        })
-      }
-    }
-  },
-}
diff --git a/packages/coreui-vue/src/index.ts b/packages/coreui-vue/src/index.ts
deleted file mode 100644
index 6b6bbeef..00000000
--- a/packages/coreui-vue/src/index.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-import { App } from 'vue'
-import * as Components from './components'
-import * as Directives from './directives'
-
-const CoreuiVue = {
-  install: (app: App): void => {
-    for (const key in Components) {
-      app.component(key, (Components as { [key: string]: any })[key])
-    }
-
-    for (const key in Directives) {
-      app.directive(
-        (Directives as { [key: string]: any })[key]['name'],
-        (Directives as { [key: string]: any })[key],
-      )
-    }
-  },
-}
-
-// Export library
-export default CoreuiVue
-
-// Export components & directives
-export * from './components'
-export * from './composables'
-export * from './directives'
diff --git a/packages/coreui-vue/src/props.ts b/packages/coreui-vue/src/props.ts
deleted file mode 100644
index f0fda387..00000000
--- a/packages/coreui-vue/src/props.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-export const Shape = {
-  type: String,
-  validator: (value: string): boolean => {
-    // The value must match one of these strings
-    return [
-      'rounded',
-      'rounded-top',
-      'rounded-end',
-      'rounded-bottom',
-      'rounded-start',
-      'rounded-circle',
-      'rounded-pill',
-      'rounded-0',
-      'rounded-1',
-      'rounded-2',
-      'rounded-3',
-    ].includes(value)
-  },
-}
-
-export const Align = {
-  type: String,
-  validator: (value: string): boolean => {
-    // The value must match one of these strings
-    return ['', 'left', 'center', 'right'].includes(value)
-  },
-}
-
-export const Color = {
-  type: String,
-  validator: (value: string): boolean => {
-    // The value must match one of these strings
-    return [
-      'primary',
-      'secondary',
-      'success',
-      'danger',
-      'warning',
-      'info',
-      'dark',
-      'light',
-      'link',
-      'transparent',
-    ].includes(value)
-  },
-}
-
-export const TextColor = {
-  type: String,
-  validator: (value: string): boolean => {
-    return [
-      'primary',
-      'secondary',
-      'success',
-      'danger',
-      'warning',
-      'info',
-      'dark',
-      'light',
-      'primary-emphasis',
-      'secondary-emphasis',
-      'success-emphasis',
-      'danger-emphasis',
-      'warning-emphasis',
-      'info-emphasis',
-      'light-emphasis',
-      'body',
-      'body-emphasis',
-      'body-secondary',
-      'body-tertiary',
-      'black',
-      'black-50',
-      'white',
-      'white-50',
-    ].includes(value)
-  },
-}
-
-export const Breakpoint = {
-  validator: (value: boolean | number): boolean => {
-    return typeof value == 'boolean' || typeof value == 'number' ? true : false
-  },
-}
diff --git a/packages/coreui-vue/src/shims-vue.d.ts b/packages/coreui-vue/src/shims-vue.d.ts
deleted file mode 100644
index ac1ded79..00000000
--- a/packages/coreui-vue/src/shims-vue.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-declare module '*.vue' {
-  import { DefineComponent } from 'vue'
-  const component: DefineComponent<{}, {}, any>
-  export default component
-}
diff --git a/packages/coreui-vue/src/types.ts b/packages/coreui-vue/src/types.ts
deleted file mode 100644
index b229df7c..00000000
--- a/packages/coreui-vue/src/types.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-export type Breakpoints = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'
-
-export type Colors =
-  | 'primary'
-  | 'secondary'
-  | 'success'
-  | 'danger'
-  | 'warning'
-  | 'info'
-  | 'dark'
-  | 'light'
-  | string
-
-export type Placements =
-  | 'auto'
-  | 'auto-start'
-  | 'auto-end'
-  | 'top-end'
-  | 'top'
-  | 'top-start'
-  | 'bottom-end'
-  | 'bottom'
-  | 'bottom-start'
-  | 'right-start'
-  | 'right'
-  | 'right-end'
-  | 'left-start'
-  | 'left'
-  | 'left-end'
-  | string
-
-export type Shapes =
-  | 'rounded'
-  | 'rounded-top'
-  | 'rounded-end'
-  | 'rounded-bottom'
-  | 'rounded-start'
-  | 'rounded-circle'
-  | 'rounded-pill'
-  | 'rounded-0'
-  | 'rounded-1'
-  | 'rounded-2'
-  | 'rounded-3'
-  | string
-
-export type Triggers = 'hover' | 'focus' | 'click'
diff --git a/packages/coreui-vue/src/utils/ComponentProps.ts b/packages/coreui-vue/src/utils/ComponentProps.ts
deleted file mode 100644
index 5bd3991c..00000000
--- a/packages/coreui-vue/src/utils/ComponentProps.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { DefineComponent, ExtractPropTypes, ExtractPublicPropTypes } from 'vue'
-
-export type ComponentProps<T> =
-  T extends DefineComponent<ExtractPropTypes<infer Props>, any, any>
-    ? ExtractPublicPropTypes<Props>
-    : never
diff --git a/packages/coreui-vue/src/utils/getNextActiveElement.ts b/packages/coreui-vue/src/utils/getNextActiveElement.ts
deleted file mode 100644
index a80293ca..00000000
--- a/packages/coreui-vue/src/utils/getNextActiveElement.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-const getNextActiveElement = (
-  list: HTMLElement[],
-  activeElement: HTMLElement,
-  shouldGetNext: boolean,
-  isCycleAllowed: boolean,
-) => {
-  const listLength = list.length
-  let index = list.indexOf(activeElement)
-
-  if (index === -1) {
-    return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]
-  }
-
-  index += shouldGetNext ? 1 : -1
-
-  if (isCycleAllowed) {
-    index = (index + listLength) % listLength
-  }
-
-  return list[Math.max(0, Math.min(index, listLength - 1))]
-}
-
-export default getNextActiveElement
diff --git a/packages/coreui-vue/src/utils/getRTLPlacement.ts b/packages/coreui-vue/src/utils/getRTLPlacement.ts
deleted file mode 100644
index 87c38517..00000000
--- a/packages/coreui-vue/src/utils/getRTLPlacement.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Placement } from '@popperjs/core'
-import isRTL from './isRTL'
-
-const getRTLPlacement = (placement: string, element: HTMLDivElement | null): Placement => {
-  switch (placement) {
-    case 'right': {
-      return isRTL(element) ? 'left' : 'right'
-    }
-    case 'left': {
-      return isRTL(element) ? 'right' : 'left'
-    }
-    default: {
-      return placement as Placement
-    }
-  }
-}
-
-export default getRTLPlacement
diff --git a/packages/coreui-vue/src/utils/getUID.ts b/packages/coreui-vue/src/utils/getUID.ts
deleted file mode 100644
index 7aeb1b76..00000000
--- a/packages/coreui-vue/src/utils/getUID.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-const getUID = (prefix: string) => {
-  do {
-    prefix += Math.floor(Math.random() * 1_000_000)
-  } while (document.getElementById(prefix))
-
-  return prefix
-}
-
-export default getUID
diff --git a/packages/coreui-vue/src/utils/index.ts b/packages/coreui-vue/src/utils/index.ts
deleted file mode 100644
index b478e8c2..00000000
--- a/packages/coreui-vue/src/utils/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import getNextActiveElement from './getNextActiveElement'
-import getRTLPlacement from './getRTLPlacement'
-import getUID from './getUID'
-import isInViewport from './isInViewport'
-import isRTL from './isRTL'
-
-export { getNextActiveElement, getRTLPlacement, getUID, isInViewport, isRTL }
diff --git a/packages/coreui-vue/src/utils/isInViewport.ts b/packages/coreui-vue/src/utils/isInViewport.ts
deleted file mode 100644
index 7aae5391..00000000
--- a/packages/coreui-vue/src/utils/isInViewport.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-const isInViewport = (element: HTMLElement) => {
-  const rect = element.getBoundingClientRect()
-  return (
-    Math.floor(rect.top) >= 0 &&
-    Math.floor(rect.left) >= 0 &&
-    Math.floor(rect.bottom) <= (window.innerHeight || document.documentElement.clientHeight) &&
-    Math.floor(rect.right) <= (window.innerWidth || document.documentElement.clientWidth)
-  )
-}
-
-export default isInViewport
diff --git a/packages/coreui-vue/src/utils/isRTL.ts b/packages/coreui-vue/src/utils/isRTL.ts
deleted file mode 100644
index 17180d80..00000000
--- a/packages/coreui-vue/src/utils/isRTL.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-const isRTL = (element?: HTMLElement | HTMLDivElement | null) => {
-  if (typeof document !== 'undefined' && document.documentElement.dir === 'rtl') {
-    return true
-  }
-
-  if (element) {
-    return element.closest('[dir="rtl"]') !== null
-  }
-
-  return false
-}
-
-export default isRTL
diff --git a/packages/coreui-vue/src/utils/transition.ts b/packages/coreui-vue/src/utils/transition.ts
deleted file mode 100644
index 874fbf8c..00000000
--- a/packages/coreui-vue/src/utils/transition.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-const execute = (callback: () => void) => {
-  if (typeof callback === 'function') {
-    callback()
-  }
-}
-
-export const executeAfterTransition = (
-  callback: () => void,
-  transitionElement: HTMLElement,
-  waitForTransition = true,
-) => {
-  if (!waitForTransition) {
-    execute(callback)
-    return
-  }
-
-  const durationPadding = 5
-  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding
-
-  let called = false
-
-  const handler = ({ target }: { target: any }) => {
-    if (target !== transitionElement) {
-      return
-    }
-
-    called = true
-    transitionElement.removeEventListener('transitionend', handler)
-    execute(callback)
-  }
-
-  transitionElement.addEventListener('transitionend', handler)
-  setTimeout(() => {
-    if (!called) {
-      triggerTransitionEnd(transitionElement)
-    }
-  }, emulatedDuration)
-}
-
-export const getTransitionDurationFromElement = (element: HTMLElement) => {
-  if (!element) {
-    return 0
-  }
-
-  // Get transition-duration of the element
-  let { transitionDuration, transitionDelay } = window.getComputedStyle(element)
-
-  const floatTransitionDuration = Number.parseFloat(transitionDuration)
-  const floatTransitionDelay = Number.parseFloat(transitionDelay)
-
-  // Return 0 if element or transition duration is not found
-  if (!floatTransitionDuration && !floatTransitionDelay) {
-    return 0
-  }
-
-  // If multiple durations are defined, take the first
-  transitionDuration = transitionDuration.split(',')[0]
-  transitionDelay = transitionDelay.split(',')[0]
-
-  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * 1000
-}
-
-export const triggerTransitionEnd = (element: HTMLElement) => {
-  element.dispatchEvent(new Event('transitionend'))
-}
diff --git a/packages/coreui-vue/tsconfig.json b/packages/coreui-vue/tsconfig.json
deleted file mode 100644
index 37245843..00000000
--- a/packages/coreui-vue/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "extends": "../../tsconfig",
-  "compilerOptions": {
-    "declarationDir": "."
-  },
-  "include": ["src/**/*"]
-}
\ No newline at end of file
diff --git a/packages/docs/.prettierrc b/packages/docs/.prettierrc
deleted file mode 100644
index 53e4559d..00000000
--- a/packages/docs/.prettierrc
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "semi": false,
-  "trailingComma": "es5",
-  "singleQuote": true,
-  "printWidth": 100,
-  "tabWidth": 2
-  
-}
diff --git a/packages/docs/.vuepress/client.ts b/packages/docs/.vuepress/client.ts
deleted file mode 100644
index 0404f0fd..00000000
--- a/packages/docs/.vuepress/client.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { defineClientConfig } from '@vuepress/client'
-
-import { CIcon, CIconSvg } from '@coreui/icons-vue'
-import CChartPlugin from '@coreui/vue-chartjs'
-import CoreuiVue from '@coreui/vue/src/'
-import '@coreui/coreui/scss/coreui.scss'
-import '@coreui/chartjs/scss/coreui-chartjs.scss'
-
-import {
-  cibCoreuiC,
-  cibDiscourse,
-  cibFacebook,
-  cibGithub,
-  cibTwitter,
-  cibOpenCollective,
-  cilArrowBottom,
-  cilArrowRight,
-  cilArrowTop,
-  cilBasket,
-  cilBurn,
-  cilCheckCircle,
-  cilCloudDownload,
-  cilContrast,
-  cilHandshake,
-  cilInfo,
-  cilLayers,
-  cilMenu,
-  cilMoon,
-  cilOptions,
-  cilPeople,
-  cilPuzzle,
-  cilSettings,
-  cilSpeedometer,
-  cilSun,
-  cilUserFollow,
-  cilWarning,
-} from '@coreui/icons'
-
-export const icons = {
-  cibCoreuiC,
-  cibDiscourse,
-  cibFacebook,
-  cibGithub,
-  cibTwitter,
-  cibOpenCollective,
-  cilArrowBottom,
-  cilArrowRight,
-  cilArrowTop,
-  cilBasket,
-  cilBurn,
-  cilCheckCircle,
-  cilCloudDownload,
-  cilContrast,
-  cilHandshake,
-  cilInfo,
-  cilLayers,
-  cilMenu,
-  cilMoon,
-  cilOptions,
-  cilPeople,
-  cilPuzzle,
-  cilSettings,
-  cilSpeedometer,
-  cilSun,
-  cilUserFollow,
-  cilWarning,
-}
-
-export default defineClientConfig({
-  enhance({ app, router }) {
-    app.use(CoreuiVue)
-    app.provide('icons', icons)
-    app.component('CIcon', CIcon)
-    app.component('CIconSvg', CIconSvg)
-    app.use(CChartPlugin),
-    router.addRoute({ path: '', redirect: '/getting-started/introduction.html' })
-  },
-})
diff --git a/packages/docs/.vuepress/config.ts b/packages/docs/.vuepress/config.ts
deleted file mode 100644
index ea00ecf0..00000000
--- a/packages/docs/.vuepress/config.ts
+++ /dev/null
@@ -1,389 +0,0 @@
-import { defineUserConfig } from 'vuepress'
-import { viteBundler } from '@vuepress/bundler-vite'
-import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links'
-import { markdownContainerPlugin } from '@vuepress/plugin-markdown-container'
-import { prismjsPlugin } from '@vuepress/plugin-prismjs'
-import { registerComponentsPlugin } from '@vuepress/plugin-register-components'
-import { tocPlugin } from '@vuepress/plugin-toc'
-import { getDirname, path } from '@vuepress/utils'
-import anchor from 'markdown-it-anchor'
-import include_plugin from 'markdown-it-include'
-import { defaultTheme } from './src/node'
-
-const __dirname = getDirname(import.meta.url)
-
-export default defineUserConfig({
-  base: `/vue/docs/`,
-  lang: 'en-US',
-  title: 'Vue UI Components · CoreUI',
-  description: 'UI Components Library for Vue.js (Vue 3)',
-  head: [['link', { rel: 'icon', href: `/vue/docs/favicons/favicon-96x96.png` }]],
-  bundler: viteBundler(),
-  markdown: {
-    anchor: {
-      permalink: anchor.permalink.linkInsideHeader({
-        class: 'anchor-link',
-        placement: 'after'
-      }),
-    },
-  },
-  extendsMarkdown: (md) => {
-    md.use(include_plugin),
-      (md.renderer.rules.table_open = function (tokens, idx) {
-        return '<table class="table table-striped table-api">'
-      })
-  },
-  plugins: [
-    activeHeaderLinksPlugin({
-      headerLinkSelector: 'a.sidebar-item',
-      headerAnchorSelector: '.header-anchor',
-      // should greater than page transition duration
-      delay: 300,
-    }),
-    // backToTopPlugin(),
-    markdownContainerPlugin({
-      type: 'demo',
-      before: (): string => `<div class="docs-example rounded-top p-4">\n`,
-      after: (): string => '</div>\n',
-    }),
-    markdownContainerPlugin({
-      type: 'demo-bg-secondary',
-      before: (): string =>
-        `<div class="docs-example rounded-top p-0 bg-body-secondary overflow-hidden">\n`,
-      after: (): string => '</div>\n',
-    }),
-    markdownContainerPlugin({
-      type: 'demo-dark',
-      before: (): string => `<div class="docs-example rounded-top p-4 bg-dark">\n`,
-      after: (): string => '</div>\n',
-    }),
-    markdownContainerPlugin({
-      type: 'demo-rounded',
-      before: (): string => `<div class="docs-example rounded p-4">\n`,
-      after: (): string => '</div>\n',
-    }),
-    prismjsPlugin(),
-    registerComponentsPlugin({
-      components: {
-        Callout: path.resolve(__dirname, './src/client/components/Callout.vue'),
-        ScssDocs: path.resolve(__dirname, './src/client/components/ScssDocs.vue'),
-      },
-    }),
-    tocPlugin({}),
-    {
-      name: 'extendsPage',
-      extendsPage: (page) => {
-        const frontmatter = page.frontmatter
-
-        frontmatter.head = [
-          ['link', { rel: 'canonical', href: `https://coreui.io/vue/docs${page.path}` }],
-        ]
-      },
-    },
-  ],
-  theme: defaultTheme({
-    sidebar: [
-      {
-        text: 'Getting started',
-        icon: '<rect width="32" height="32" x="144" y="464" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><rect width="32" height="32" x="240" y="464" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><rect width="32" height="32" x="336" y="464" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><path fill="var(--ci-primary-color, currentColor)" d="M312,76.82v34.265a142.419,142.419,0,0,1,86.207,130.708C398.207,320.206,334.413,384,256,384S113.793,320.206,113.793,241.793A142.419,142.419,0,0,1,200,111.085V76.82c-68.671,23.373-118.207,88.5-118.207,164.973C81.793,337.851,159.942,416,256,416s174.207-78.149,174.207-174.207C430.207,165.316,380.671,100.193,312,76.82Z" class="ci-primary"></path><rect width="32" height="229.793" x="240" y="16" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect>',
-        link: `/getting-started/`,
-        children: [
-          {
-            text: 'Introduction',
-            link: `/getting-started/introduction.html`,
-          },
-          {
-            text: 'Accessibility',
-            link: `/getting-started/accessibility.html`,
-          },
-        ],
-      },
-      {
-        text: 'Customize',
-        icon: '<path fill="var(--ci-primary-color, currentColor)" d="M425.514,82.055C380.778,39.458,320.673,16,256.271,16,196.248,16,136.415,36.073,92.115,71.071,43.032,109.85,16,164.161,16,224c0,60.1,15.531,98.87,48.876,122.019,28,19.438,68.412,27.731,135.124,27.731h29.75A26.28,26.28,0,0,1,256,400v47.984a32,32,0,0,0,32,32h.032l90.755-.088a32.094,32.094,0,0,0,19.686-6.8c9.725-7.622,34.727-29.4,56.8-66.9C482.3,360.262,496,307.037,496,248,496,184.268,470.968,125.334,425.514,82.055Zm2.173,307.915c-19.3,32.792-40.663,51.447-48.932,57.926L288,447.984V400a58.316,58.316,0,0,0-58.25-58.25H200c-59.69,0-94.644-6.585-116.876-22.019C58.833,302.869,48,273.344,48,224,48,113.833,153.9,48,256.271,48,372.755,48,464,135.851,464,248,464,301.253,451.782,349.019,427.687,389.97Z" class="ci-primary"/><path fill="var(--ci-primary-color, currentColor)" d="M128,144a56,56,0,1,0,56,56A56.064,56.064,0,0,0,128,144Zm0,80a24,24,0,1,1,24-24A24.027,24.027,0,0,1,128,224Z" class="ci-primary"/><path fill="var(--ci-primary-color, currentColor)" d="M240,72a56,56,0,1,0,56,56A56.064,56.064,0,0,0,240,72Zm0,80a24,24,0,1,1,24-24A24.027,24.027,0,0,1,240,152Z" class="ci-primary"/><path fill="var(--ci-primary-color, currentColor)" d="M360,128a56,56,0,1,0,56,56A56.064,56.064,0,0,0,360,128Zm0,80a24,24,0,1,1,24-24A24.027,24.027,0,0,1,360,208Z" class="ci-primary"/><path fill="var(--ci-primary-color, currentColor)" d="M376,264a56,56,0,1,0,56,56A56.064,56.064,0,0,0,376,264Zm0,80a24,24,0,1,1,24-24A24.027,24.027,0,0,1,376,344Z" class="ci-primary"/>',
-        link: '/customize/',
-        children: [
-          {
-            text: 'Sass',
-            link: '/customize/sass.html',
-          },
-          {
-            text: 'Options',
-            link: '/customize/options.html',
-          },
-          {
-            text: 'CSS Variables',
-            link: '/customize/css-variables.html',
-          },
-        ],
-      },
-      {
-        text: 'Layout',
-        icon: `<path fill="var(--ci-primary-color, currentColor)" d="M16,64V448H496V64ZM464,240H192V96H464ZM192,272H312V416H192ZM48,96H160V416H48ZM344,416V272H464V416Z"></path>`,
-        link: `/layout/`,
-        children: [
-          {
-            text: 'Breakpoints',
-            link: `/layout/breakpoints.html`,
-          },
-          {
-            text: 'Columns',
-            link: `/layout/columns.html`,
-          },
-          {
-            text: 'Containers',
-            link: `/layout/containers.html`,
-          },
-          {
-            text: 'Grid',
-            link: `/layout/grid.html`,
-          },
-          {
-            text: 'Gutters',
-            link: `/layout/gutters.html`,
-          },
-        ],
-      },
-      {
-        text: 'Forms',
-        icon: `<rect width="288" height="32" x="112" y="152" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><rect width="288" height="32" x="112" y="240" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><rect width="152" height="32" x="112" y="328" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><path fill="var(--ci-primary-color, currentColor)" d="M480,48H32V464H480ZM448,432H64V80H448Z" class="ci-primary"></path>`,
-        link: `/forms/`,
-        children: [
-          {
-            text: 'Checkbox',
-            link: `/forms/checkbox.html`,
-          },
-          {
-            text: 'Input',
-            link: `/forms/input.html`,
-          },
-          {
-            text: 'Input group',
-            link: `/forms/input-group.html`,
-          },
-          {
-            text: 'Radio',
-            link: `/forms/radio.html`,
-          },
-          {
-            text: 'Range',
-            link: `/forms/range.html`,
-          },
-          {
-            text: 'Select',
-            link: `/forms/select.html`,
-          },
-          {
-            text: 'Switch',
-            link: `/forms/switch.html`,
-          },
-          {
-            text: 'Textarea',
-            link: `/forms/textarea.html`,
-          },
-          {
-            text: 'Floating labels',
-            link: `/forms/floating-labels.html`,
-          },
-          {
-            text: 'Layout',
-            link: `/forms/layout.html`,
-          },
-          {
-            text: 'Validation',
-            link: `/forms/validation.html`,
-          },
-        ],
-      },
-      {
-        text: 'Components',
-        icon: '<path fill="var(--ci-primary-color, currentColor)" d="M410.989,16H101.011L16,237.029V496H496V237.029Zm-288,32H240V240H49.143ZM184,272H328v40H184ZM464,464H48V272H152v72H360V272H464ZM272,240V48H389.012l73.845,192Z" class="ci-primary"></path>',
-        link: `/components/`,
-        children: [
-          {
-            text: 'Accordion',
-            link: `/components/accordion.html`,
-          },
-          {
-            text: 'Alert',
-            link: `/components/alert.html`,
-          },
-          {
-            text: 'Avatar',
-            link: `/components/avatar.html`,
-          },
-          {
-            text: 'Badge',
-            link: `/components/badge.html`,
-          },
-          {
-            text: 'Breadcrumb',
-            link: `/components/breadcrumb.html`,
-          },
-          {
-            text: 'Buttons',
-            link: `/components/button.html`,
-          },
-          {
-            text: 'Button Group',
-            link: `/components/button-group.html`,
-          },
-          {
-            text: 'Callout',
-            link: `/components/callout.html`,
-          },
-          {
-            text: 'Card',
-            link: `/components/card.html`,
-          },
-          {
-            text: 'Carousel',
-            link: `/components/carousel.html`,
-          },
-          {
-            text: 'Chart',
-            link: `/components/chart.html`,
-          },
-          {
-            text: 'Close Button',
-            link: `/components/close-button.html`,
-          },
-          {
-            text: 'Collapse',
-            link: `/components/collapse.html`,
-          },
-          {
-            text: 'Dropdown',
-            link: `/components/dropdown.html`,
-          },
-          {
-            text: 'Footer',
-            link: `/components/footer.html`,
-          },
-          {
-            text: 'Header',
-            link: `/components/header.html`,
-          },
-          {
-            text: 'Icon',
-            link: `/components/icon.html`,
-          },
-          {
-            text: 'Image',
-            link: `/components/image.html`,
-          },
-          {
-            text: 'List Group',
-            link: `/components/list-group.html`,
-          },
-          {
-            text: 'Modal',
-            link: `/components/modal.html`,
-          },
-          {
-            text: 'Navs & Tabs',
-            link: `/components/navs-tabs.html`,
-          },
-          {
-            text: 'Navbar',
-            link: `/components/navbar.html`,
-          },
-          {
-            text: 'Offcanvas',
-            link: `/components/offcanvas.html`,
-          },
-          {
-            text: 'Pagination',
-            link: `/components/pagination.html`,
-          },
-          {
-            text: 'Placeholder',
-            link: `/components/placeholder.html`,
-          },
-          {
-            text: 'Popover',
-            link: `/components/popover.html`,
-          },
-          {
-            text: 'Progress',
-            link: `/components/progress.html`,
-          },
-          {
-            text: 'Sidebar',
-            link: `/components/sidebar.html`,
-          },
-          {
-            text: 'Spinner',
-            link: `/components/spinner.html`,
-          },
-          {
-            text: 'Table',
-            link: `/components/table.html`,
-          },
-          {
-            text: 'Tabs',
-            link: `/components/tabs.html`,
-          },
-          {
-            text: 'Toast',
-            link: `/components/toast.html`,
-          },
-          {
-            text: 'Tooltip',
-            link: `/components/tooltip.html`,
-          },
-          {
-            text: 'Widgets',
-            link: `/components/widgets.html`,
-          },
-        ],
-      },
-      {
-        text: 'Templates',
-        link: '/templates/',
-        icon: '<path fill="var(--ci-primary-color, currentColor)" d="M472,232H424V120a24.028,24.028,0,0,0-24-24H40a24.028,24.028,0,0,0-24,24V366a24.028,24.028,0,0,0,24,24H212v50H152v32H304V440H244V390h92v58a24.027,24.027,0,0,0,24,24H472a24.027,24.027,0,0,0,24-24V256A24.027,24.027,0,0,0,472,232ZM336,256V358H48V128H392V232H360A24.027,24.027,0,0,0,336,256ZM464,440H368V264h96Z" class="ci-primary"/>',
-        children: [
-          {
-            text: 'Admin & Dashboard',
-            link: '/templates/admin-dashboard.html',
-            badge: {
-              color: 'success',
-              text: 'New',
-            },
-          },
-          {
-            text: 'Download',
-            link: '/templates/download.html',
-          },
-          {
-            text: 'Installation',
-            link: '/templates/installation.html',
-          },
-          {
-            text: 'Customize',
-            link: '/templates/customize.html',
-          },
-          {
-            text: 'Contents',
-            link: '/templates/contents.html',
-          },
-        ],
-      },
-      {
-        text: 'Migration',
-        link: '/migration/',
-        icon: '<path fill="var(--ci-primary-color, currentColor)" d="M464,256.25C464,370.8,370.8,464,256.25,464S48.5,370.8,48.5,256.25,141.7,48.5,256.25,48.5a208,208,0,0,1,149.963,64H328.5v32h128V16.5h-32V85.478A239.717,239.717,0,1,0,496,256.25Z" class="ci-primary"></path><polygon fill="var(--ci-primary-color, currentColor)" points="272.5 112.451 240.5 112.549 241.017 282.756 353.301 334.53 366.699 305.47 272.954 262.244 272.5 112.451" class="ci-primary"></polygon>',
-        children: [
-          {
-            text: 'v4',
-            link: '/migration/v4.html',
-          },
-          {
-            text: 'v5',
-            link: '/migration/v5.html',
-          },
-        ],
-      },
-    ],
-  }),
-})
diff --git a/packages/docs/.vuepress/public/brand/coreui-react.svg b/packages/docs/.vuepress/public/brand/coreui-react.svg
deleted file mode 100755
index 9d44bb80..00000000
--- a/packages/docs/.vuepress/public/brand/coreui-react.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 615 134">
-  <defs>
-    <style>
-      .cls-1 {
-        fill: #00a1ff;
-      }
-
-      .cls-2 {
-        fill: #3c4b64;
-      }
-    </style>
-  </defs>
-  <title>coreui react</title>
-  <g id="Warstwa_1" data-name="Warstwa 1">
-    <g>
-      <path class="cls-1" d="M361.773,90.1513,353.0054,69.415a.25.25,0,0,0-.2558-.1914h-9.9844a.2263.2263,0,0,0-.2559.2558v20.543a.5659.5659,0,0,1-.64.6406h-1.2163a.5654.5654,0,0,1-.64-.6406v-43.52a.5656.5656,0,0,1,.64-.64h12.5444a9.9785,9.9785,0,0,1,7.7437,3.2315,12.2042,12.2042,0,0,1,2.9443,8.5449,12.4389,12.4389,0,0,1-2.24,7.584,9.3707,9.3707,0,0,1-6.08,3.7441c-.1709.0859-.2139.1914-.1279.3193l8.7041,20.6084.0639.2559c0,.3418-.1919.5117-.5757.5117h-1.1523A.7029.7029,0,0,1,361.773,90.1513Zm-19.2637-41.793V66.8544a.2263.2263,0,0,0,.2559.2569h10.3037a7.6687,7.6687,0,0,0,6.0166-2.5928,9.878,9.878,0,0,0,2.3037-6.8154,10.2858,10.2858,0,0,0-2.272-6.9756,7.601,7.601,0,0,0-6.0483-2.625H342.7652A.2263.2263,0,0,0,342.5093,48.3583Z"/>
-      <path class="cls-1" d="M401.0816,48.1025H381.05a.2263.2263,0,0,0-.2559.2558V66.8544a.2263.2263,0,0,0,.2559.2569h13.8237a.5663.5663,0,0,1,.6406.64v.96a.566.566,0,0,1-.6406.64H381.05a.2263.2263,0,0,0-.2559.2559V88.1669a.2259.2259,0,0,0,.2559.2559h20.0317a.567.567,0,0,1,.6406.6406v.959a.5663.5663,0,0,1-.6406.6406H378.938a.5656.5656,0,0,1-.64-.6406v-43.52a.5657.5657,0,0,1,.64-.64h22.1436a.5664.5664,0,0,1,.6406.64v.96A.566.566,0,0,1,401.0816,48.1025Z"/>
-      <path class="cls-1" d="M438.8023,90.1513l-2.4316-8.832a.2962.2962,0,0,0-.32-.1924H419.2828a.2946.2946,0,0,0-.32.1924l-2.3682,8.7676a.6576.6576,0,0,1-.7036.5761h-1.2163a.5883.5883,0,0,1-.4795-.1914.5822.5822,0,0,1-.0962-.5127L426.13,46.3749a.6436.6436,0,0,1,.7041-.5117h1.6a.6442.6442,0,0,1,.7041.5117l12.16,43.584.0644.1924c0,.3418-.2138.5117-.64.5117h-1.2163A.6428.6428,0,0,1,438.8023,90.1513ZM419.6988,78.9189a.3026.3026,0,0,0,.2236.0957h15.4883a.3039.3039,0,0,0,.2236-.0957c.0645-.0645.0742-.1172.0323-.16L427.7945,49.831c-.043-.085-.086-.1279-.1279-.1279s-.086.0429-.128.1279l-7.872,28.9277C419.6236,78.8017,419.6343,78.8544,419.6988,78.9189Z"/>
-      <path class="cls-1" d="M456.357,87.9111a11.6374,11.6374,0,0,1-3.3277-8.7041V57.19a11.4135,11.4135,0,0,1,3.36-8.5752,12.0908,12.0908,0,0,1,8.8-3.2647,12.2528,12.2528,0,0,1,8.8643,3.2324,11.3906,11.3906,0,0,1,3.36,8.6075v.6406a.5663.5663,0,0,1-.6406.6406l-1.28.0635q-.6408,0-.64-.5762v-.832a9.2874,9.2874,0,0,0-2.6558-6.9121,10.67,10.67,0,0,0-14.0161,0,9.2838,9.2838,0,0,0-2.6562,6.9121V79.3994a9.2824,9.2824,0,0,0,2.6562,6.9121,10.6734,10.6734,0,0,0,14.0161,0,9.286,9.286,0,0,0,2.6558-6.9121v-.7686q0-.5757.64-.5752l1.28.0635a.5663.5663,0,0,1,.6406.64V79.27a11.4976,11.4976,0,0,1-3.36,8.6407,13.6262,13.6262,0,0,1-17.6963,0Z"/>
-      <path class="cls-1" d="M514.1929,46.5029v.96a.5655.5655,0,0,1-.64.64h-10.752a.2262.2262,0,0,0-.2558.2558V90.0224a.5663.5663,0,0,1-.6407.6406H500.689a.5654.5654,0,0,1-.64-.6406V48.3583a.2267.2267,0,0,0-.2559-.2558H489.6172a.5653.5653,0,0,1-.64-.64v-.96a.5657.5657,0,0,1,.64-.64h23.9361A.5659.5659,0,0,1,514.1929,46.5029Z"/>
-      <path class="cls-1" d="M521.8218,89.5107a2.8346,2.8346,0,0,1-.8-2.0479,2.9233,2.9233,0,0,1,.8-2.1123,2.7577,2.7577,0,0,1,2.08-.832,2.8467,2.8467,0,0,1,2.9439,2.9443,2.7544,2.7544,0,0,1-.8321,2.08,2.9213,2.9213,0,0,1-2.1118.8A2.754,2.754,0,0,1,521.8218,89.5107Z"/>
-      <path class="cls-1" d="M542.1607,88.0068a11.3094,11.3094,0,0,1-3.2-8.416V74.1513a.5663.5663,0,0,1,.64-.6406h1.2159a.5667.5667,0,0,1,.64.6406v5.5039a9.1437,9.1437,0,0,0,2.5283,6.72,8.9735,8.9735,0,0,0,6.6875,2.56,8.7894,8.7894,0,0,0,9.28-9.2793V46.5029a.5655.5655,0,0,1,.64-.64h1.2163a.5661.5661,0,0,1,.64.64V79.5908a11.2516,11.2516,0,0,1-3.2324,8.416,13.0622,13.0622,0,0,1-17.0557,0Z"/>
-      <path class="cls-1" d="M580.1055,88.1025a10.4824,10.4824,0,0,1-3.36-8.127V78.1826a.5655.5655,0,0,1,.64-.64h1.0884a.566.566,0,0,1,.64.64v1.6005a8.5438,8.5438,0,0,0,2.752,6.6553,10.5357,10.5357,0,0,0,7.36,2.4961,9.8761,9.8761,0,0,0,6.9761-2.3672,8.2153,8.2153,0,0,0,2.56-6.3359,8.3974,8.3974,0,0,0-1.12-4.416,11.3828,11.3828,0,0,0-3.3282-3.3926,71.6257,71.6257,0,0,0-6.1762-3.7119,71.3024,71.3024,0,0,1-6.24-3.84,12.174,12.174,0,0,1-3.4238-3.6806,10.2567,10.2567,0,0,1-1.28-5.3438,9.8592,9.8592,0,0,1,3.0718-7.7441,12.0122,12.0122,0,0,1,8.32-2.752q5.6953,0,8.96,3.1045a10.8233,10.8233,0,0,1,3.2641,8.2236v1.6006a.5658.5658,0,0,1-.64.64h-1.1519a.5653.5653,0,0,1-.64-.64V56.8076a8.8646,8.8646,0,0,0-2.624-6.6885,9.9938,9.9938,0,0,0-7.232-2.5283,9.3654,9.3654,0,0,0-6.5278,2.1445,7.8216,7.8216,0,0,0-2.3682,6.1113,7.8007,7.8007,0,0,0,1.0245,4.16,10.3761,10.3761,0,0,0,3.0078,3.04,62.8289,62.8289,0,0,0,5.9521,3.4883,71.0575,71.0575,0,0,1,6.72,4.2559,13.4537,13.4537,0,0,1,3.648,3.9365,10.0487,10.0487,0,0,1,1.28,5.1836,10.7141,10.7141,0,0,1-3.2637,8.1914q-3.2637,3.0732-8.832,3.0722Q583.4649,91.1747,580.1055,88.1025Z"/>
-    </g>
-    <g>
-      <g>
-        <path class="cls-2" d="M99.59,36.0577l-39-22.5167a12,12,0,0,0-12,0l-39,22.5166a12.0337,12.0337,0,0,0-6,10.3924V91.4833a12.0331,12.0331,0,0,0,6,10.3923l39,22.5167a12,12,0,0,0,12,0l39-22.5167a12.0333,12.0333,0,0,0,6-10.3923V46.45A12.0336,12.0336,0,0,0,99.59,36.0577Zm-2,55.4256a4,4,0,0,1-2,3.4641l-39,22.5167a4.0006,4.0006,0,0,1-4,0l-39-22.5167a4,4,0,0,1-2-3.4641V46.45a4,4,0,0,1,2-3.4642l39-22.5166a4,4,0,0,1,4,0l39,22.5166a4,4,0,0,1,2,3.4642Z"/>
-        <path class="cls-2" d="M77.612,82.0046H74.746a4.001,4.001,0,0,0-1.9247.4934L55.5406,91.9833,35.59,80.4648V57.4872L55.54,45.9687l17.2893,9.4549a3.9993,3.9993,0,0,0,1.9192.4906h2.8632a2,2,0,0,0,2-2V51.2024a2,2,0,0,0-1.04-1.7547L59.3833,38.9521a8.0389,8.0389,0,0,0-7.8427.09L31.59,50.56a8.0245,8.0245,0,0,0-4,6.9287v22.976a8,8,0,0,0,4,6.9283l19.95,11.5186a8.0427,8.0427,0,0,0,7.8432.0879l19.19-10.5312a2,2,0,0,0,1.0378-1.7533v-2.71A2,2,0,0,0,77.612,82.0046Z"/>
-      </g>
-      <g>
-        <path class="cls-2" d="M172.3351,45.3618a15.0166,15.0166,0,0,0-15,14.9995V77.6387a15,15,0,0,0,30,0V60.3613A15.0166,15.0166,0,0,0,172.3351,45.3618Zm7,32.2769a7,7,0,0,1-14,0V60.3613a7,7,0,0,1,14,0Z"/>
-        <path class="cls-2" d="M135.6692,53.4211a7.01,7.01,0,0,1,7.8681,6.0752.9892.9892,0,0,0,.9842.865h6.03a1.0109,1.0109,0,0,0,.9988-1.0971,15.0183,15.0183,0,0,0-15.7162-13.8837A15.2881,15.2881,0,0,0,121.59,60.7968V77.2037A15.288,15.288,0,0,0,135.8346,92.62a15.0184,15.0184,0,0,0,15.7162-13.8842,1.0109,1.0109,0,0,0-.9988-1.0971h-6.03a.9892.9892,0,0,0-.9842.865,7.0106,7.0106,0,0,1-7.868,6.0757,7.1642,7.1642,0,0,1-6.0789-7.1849V60.6057A7.1638,7.1638,0,0,1,135.6692,53.4211Z"/>
-        <path class="cls-2" d="M218.5125,72.9277a12.1584,12.1584,0,0,0,7.1843-11.0771V58.1494A12.1494,12.1494,0,0,0,213.5474,46H196.59a1,1,0,0,0-1,1V91a1,1,0,0,0,1,1h6a1,1,0,0,0,1-1V74h6.6215l7.9154,17.4138a1,1,0,0,0,.91.5862h6.5912a1,1,0,0,0,.91-1.4138Zm-.8157-11.0771A4.1538,4.1538,0,0,1,213.5479,66h-9.8511V54h9.8511a4.1538,4.1538,0,0,1,4.1489,4.1494Z"/>
-        <path class="cls-2" d="M260.59,46h-26a1,1,0,0,0-1,1V91a1,1,0,0,0,1,1h26a1,1,0,0,0,1-1V85a1,1,0,0,0-1-1h-19V72h13a1,1,0,0,0,1-1V65a1,1,0,0,0-1-1h-13V54h19a1,1,0,0,0,1-1V47A1,1,0,0,0,260.59,46Z"/>
-        <path class="cls-2" d="M298.59,46h-6a1,1,0,0,0-1,1V69.6475a7.0066,7.0066,0,1,1-14,0V47a1,1,0,0,0-1-1h-6a1,1,0,0,0-1,1V69.6475a15.0031,15.0031,0,1,0,30,0V47A1,1,0,0,0,298.59,46Z"/>
-        <rect class="cls-2" x="307.5904" y="46" width="8" height="38" rx="1"/>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/packages/docs/.vuepress/public/favicon.ico b/packages/docs/.vuepress/public/favicon.ico
deleted file mode 100644
index bf08304b..00000000
Binary files a/packages/docs/.vuepress/public/favicon.ico and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/android-icon-144x144.png b/packages/docs/.vuepress/public/favicons/android-icon-144x144.png
deleted file mode 100644
index 4a91ec87..00000000
Binary files a/packages/docs/.vuepress/public/favicons/android-icon-144x144.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/android-icon-192x192.png b/packages/docs/.vuepress/public/favicons/android-icon-192x192.png
deleted file mode 100644
index b14fee80..00000000
Binary files a/packages/docs/.vuepress/public/favicons/android-icon-192x192.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/android-icon-36x36.png b/packages/docs/.vuepress/public/favicons/android-icon-36x36.png
deleted file mode 100644
index e958525d..00000000
Binary files a/packages/docs/.vuepress/public/favicons/android-icon-36x36.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/android-icon-48x48.png b/packages/docs/.vuepress/public/favicons/android-icon-48x48.png
deleted file mode 100644
index cc96c868..00000000
Binary files a/packages/docs/.vuepress/public/favicons/android-icon-48x48.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/android-icon-72x72.png b/packages/docs/.vuepress/public/favicons/android-icon-72x72.png
deleted file mode 100644
index d8083777..00000000
Binary files a/packages/docs/.vuepress/public/favicons/android-icon-72x72.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/android-icon-96x96.png b/packages/docs/.vuepress/public/favicons/android-icon-96x96.png
deleted file mode 100644
index f3831425..00000000
Binary files a/packages/docs/.vuepress/public/favicons/android-icon-96x96.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-114x114.png b/packages/docs/.vuepress/public/favicons/apple-icon-114x114.png
deleted file mode 100644
index 60cc9ba5..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-114x114.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-120x120.png b/packages/docs/.vuepress/public/favicons/apple-icon-120x120.png
deleted file mode 100644
index 334a49af..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-120x120.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-144x144.png b/packages/docs/.vuepress/public/favicons/apple-icon-144x144.png
deleted file mode 100644
index 4a91ec87..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-144x144.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-152x152.png b/packages/docs/.vuepress/public/favicons/apple-icon-152x152.png
deleted file mode 100644
index d56d74ef..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-152x152.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-180x180.png b/packages/docs/.vuepress/public/favicons/apple-icon-180x180.png
deleted file mode 100644
index 449c1188..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-180x180.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-57x57.png b/packages/docs/.vuepress/public/favicons/apple-icon-57x57.png
deleted file mode 100644
index e3f2f14a..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-57x57.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-60x60.png b/packages/docs/.vuepress/public/favicons/apple-icon-60x60.png
deleted file mode 100644
index 6a341e2c..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-60x60.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-72x72.png b/packages/docs/.vuepress/public/favicons/apple-icon-72x72.png
deleted file mode 100644
index d8083777..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-72x72.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-76x76.png b/packages/docs/.vuepress/public/favicons/apple-icon-76x76.png
deleted file mode 100644
index d16fe084..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-76x76.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon-precomposed.png b/packages/docs/.vuepress/public/favicons/apple-icon-precomposed.png
deleted file mode 100644
index ba91b901..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon-precomposed.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/apple-icon.png b/packages/docs/.vuepress/public/favicons/apple-icon.png
deleted file mode 100644
index ba91b901..00000000
Binary files a/packages/docs/.vuepress/public/favicons/apple-icon.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/browserconfig.xml b/packages/docs/.vuepress/public/favicons/browserconfig.xml
deleted file mode 100644
index c5541482..00000000
--- a/packages/docs/.vuepress/public/favicons/browserconfig.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/public/favicons/favicon-16x16.png b/packages/docs/.vuepress/public/favicons/favicon-16x16.png
deleted file mode 100644
index 95b7c793..00000000
Binary files a/packages/docs/.vuepress/public/favicons/favicon-16x16.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/favicon-32x32.png b/packages/docs/.vuepress/public/favicons/favicon-32x32.png
deleted file mode 100644
index 0ae4bb17..00000000
Binary files a/packages/docs/.vuepress/public/favicons/favicon-32x32.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/favicon-96x96.png b/packages/docs/.vuepress/public/favicons/favicon-96x96.png
deleted file mode 100644
index f3831425..00000000
Binary files a/packages/docs/.vuepress/public/favicons/favicon-96x96.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/manifest.json b/packages/docs/.vuepress/public/favicons/manifest.json
deleted file mode 100644
index 35f191b0..00000000
--- a/packages/docs/.vuepress/public/favicons/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "CoreUI for Vue.js",
- "icons": [
-  {
-   "src": "\/android-icon-36x36.png",
-   "sizes": "36x36",
-   "type": "image\/png",
-   "density": "0.75"
-  },
-  {
-   "src": "\/android-icon-48x48.png",
-   "sizes": "48x48",
-   "type": "image\/png",
-   "density": "1.0"
-  },
-  {
-   "src": "\/android-icon-72x72.png",
-   "sizes": "72x72",
-   "type": "image\/png",
-   "density": "1.5"
-  },
-  {
-   "src": "\/android-icon-96x96.png",
-   "sizes": "96x96",
-   "type": "image\/png",
-   "density": "2.0"
-  },
-  {
-   "src": "\/android-icon-144x144.png",
-   "sizes": "144x144",
-   "type": "image\/png",
-   "density": "3.0"
-  },
-  {
-   "src": "\/android-icon-192x192.png",
-   "sizes": "192x192",
-   "type": "image\/png",
-   "density": "4.0"
-  }
- ]
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/public/favicons/ms-icon-144x144.png b/packages/docs/.vuepress/public/favicons/ms-icon-144x144.png
deleted file mode 100644
index 4a91ec87..00000000
Binary files a/packages/docs/.vuepress/public/favicons/ms-icon-144x144.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/ms-icon-150x150.png b/packages/docs/.vuepress/public/favicons/ms-icon-150x150.png
deleted file mode 100644
index 62a71f99..00000000
Binary files a/packages/docs/.vuepress/public/favicons/ms-icon-150x150.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/ms-icon-310x310.png b/packages/docs/.vuepress/public/favicons/ms-icon-310x310.png
deleted file mode 100644
index 6135f12f..00000000
Binary files a/packages/docs/.vuepress/public/favicons/ms-icon-310x310.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/ms-icon-70x70.png b/packages/docs/.vuepress/public/favicons/ms-icon-70x70.png
deleted file mode 100644
index bee38523..00000000
Binary files a/packages/docs/.vuepress/public/favicons/ms-icon-70x70.png and /dev/null differ
diff --git a/packages/docs/.vuepress/public/favicons/safari-pinned-tab.svg b/packages/docs/.vuepress/public/favicons/safari-pinned-tab.svg
deleted file mode 100644
index aa6e85cb..00000000
--- a/packages/docs/.vuepress/public/favicons/safari-pinned-tab.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" fill="none"><path fill="#000" fill-rule="evenodd" d="M39.878 20c-10.955 0-19.06 9.59-18.698 19.988.349 9.99-.104 22.93-3.361 33.48C14.55 84.052 9.026 90.756 0 91.615v9.719c9.026.86 14.55 7.563 17.819 18.147 3.257 10.551 3.71 23.491 3.361 33.48-.362 10.399 7.743 19.988 18.698 19.988h112.258c10.955 0 19.06-9.589 18.697-19.988-.348-9.989.104-22.929 3.362-33.48 3.268-10.584 8.779-17.287 17.805-18.147v-9.719c-9.026-.86-14.537-7.563-17.805-18.147-3.258-10.55-3.71-23.49-3.362-33.48C171.196 29.589 163.091 20 152.136 20H39.878zm88.665 94.15c0 14.32-10.68 23.002-28.404 23.002H68.713a2 2 0 01-2-2V57.797a2 2 0 012-2h31.253c14.779 0 24.478 8.006 24.478 20.296 0 8.626-6.524 16.35-14.837 17.703v.451c11.315 1.24 18.936 9.078 18.936 19.903zM96.848 66.114H79.644v24.3h14.491c11.2 0 17.377-4.51 17.377-12.573 0-7.555-5.311-11.727-14.664-11.727zm-17.204 33.941v26.78h17.84c11.661 0 17.838-4.68 17.838-13.475s-6.35-13.305-18.59-13.305H79.645z" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/public/images/angular.jpg b/packages/docs/.vuepress/public/images/angular.jpg
deleted file mode 100755
index 50448112..00000000
Binary files a/packages/docs/.vuepress/public/images/angular.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/1.jpg b/packages/docs/.vuepress/public/images/avatars/1.jpg
deleted file mode 100644
index 8b5f8091..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/1.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/2.jpg b/packages/docs/.vuepress/public/images/avatars/2.jpg
deleted file mode 100644
index 161eeef5..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/2.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/3.jpg b/packages/docs/.vuepress/public/images/avatars/3.jpg
deleted file mode 100644
index 53ecc542..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/3.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/4.jpg b/packages/docs/.vuepress/public/images/avatars/4.jpg
deleted file mode 100644
index a6ee3c72..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/4.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/5.jpg b/packages/docs/.vuepress/public/images/avatars/5.jpg
deleted file mode 100644
index c38baeed..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/5.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/6.jpg b/packages/docs/.vuepress/public/images/avatars/6.jpg
deleted file mode 100644
index 57bbf968..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/6.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/7.jpg b/packages/docs/.vuepress/public/images/avatars/7.jpg
deleted file mode 100644
index dfc20b7a..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/7.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/8.jpg b/packages/docs/.vuepress/public/images/avatars/8.jpg
deleted file mode 100644
index 4e8b48d4..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/8.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/avatars/9.jpg b/packages/docs/.vuepress/public/images/avatars/9.jpg
deleted file mode 100644
index f690e78c..00000000
Binary files a/packages/docs/.vuepress/public/images/avatars/9.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/brand/coreui-signet.svg b/packages/docs/.vuepress/public/images/brand/coreui-signet.svg
deleted file mode 100644
index 9a4b2c5f..00000000
--- a/packages/docs/.vuepress/public/images/brand/coreui-signet.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="102px" height="116px" viewBox="0 0 102 116" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <title>Untitled 3</title>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="coreui-signet" fill="#3C4B64" fill-rule="nonzero">
-            <path d="M96,25.091 L57,2.5743 C53.2871871,0.430706461 48.7128129,0.430706461 45,2.5743 L6,25.091 C2.292246,27.239646 0.00690676667,31.1979678 0,35.4833 L0,80.5167 C0.00688629146,84.8020377 2.29223099,88.760369 6,90.909 L45,113.4256 C48.7127742,115.569338 53.2872258,115.569338 57,113.4256 L96,90.909 C99.707769,88.760369 101.993114,84.8020377 102,80.5167 L102,35.4833 C101.993093,31.1979678 99.707754,27.239646 96,25.091 Z M94,80.5167 C94,81.9457261 93.2375729,83.266187 92,83.9807 L53,106.4974 C51.7623957,107.211931 50.2376043,107.211931 49,106.4974 L10,83.9807 C8.76242713,83.266187 8,81.9457261 8,80.5167 L8,35.4833 C8,34.0542382 8.76239619,32.7337309 10,32.0192 L49,9.5025 C50.2376043,8.78796882 51.7623957,8.78796882 53,9.5025 L92,32.0192 C93.2376038,32.7337309 94,34.0542382 94,35.4833 L94,80.5167 Z" id="Shape"></path>
-            <path d="M74.0216,71.0379 L71.1556,71.0379 C70.4827717,71.0379163 69.8208181,71.2076524 69.231,71.5314 L51.95,81.0167 L32,69.4981 L32,46.5206 L51.95,35.002 L69.2394,44.457 C69.8278903,44.7788245 70.4878603,44.9474965 71.1586,44.9475 L74.0218,44.9475 C75.1263695,44.9475 76.0218,44.0520695 76.0218,42.9475 L76.0218,40.2357 C76.0218,39.5046907 75.6230914,38.8318844 74.9818,38.481 L55.793,27.9854 C53.3404536,26.651551 50.3714915,26.6856213 47.9502,28.0754 L28,39.5929 C25.5282949,41.025705 24.0048155,43.6646378 24,46.5216 L24,69.4976 C24,72.3557593 25.5247614,74.9968204 28,76.4259 L47.95,87.9444 C50.3719491,89.3331078 53.3408366,89.3663802 55.7933,88.0323 L74.9833,77.5012 C75.623333,77.1499602 76.021125,76.4778764 76.0211,75.7478 L76.0211,73.0378 C76.0210448,71.9334648 75.1259352,71.0381761 74.0216,71.0379 L74.0216,71.0379 Z" id="Path"></path>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/public/images/react.jpg b/packages/docs/.vuepress/public/images/react.jpg
deleted file mode 100755
index a1fe5a74..00000000
Binary files a/packages/docs/.vuepress/public/images/react.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/vue.jpg b/packages/docs/.vuepress/public/images/vue.jpg
deleted file mode 100755
index d7b39647..00000000
Binary files a/packages/docs/.vuepress/public/images/vue.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/public/images/vue400.jpg b/packages/docs/.vuepress/public/images/vue400.jpg
deleted file mode 100644
index 7f309ec2..00000000
Binary files a/packages/docs/.vuepress/public/images/vue400.jpg and /dev/null differ
diff --git a/packages/docs/.vuepress/src/assets/brand/coreui-vue.svg b/packages/docs/.vuepress/src/assets/brand/coreui-vue.svg
deleted file mode 100755
index 2b481a7d..00000000
--- a/packages/docs/.vuepress/src/assets/brand/coreui-vue.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 556 134">
-  <g fill="#1bbd93">
-    <path d="m347.982 90.087-11.84-43.52-.065-.193q0-.51.641-.511h1.28a.66.66 0 0 1 .704.576l10.623 39.68c.042.086.086.128.13.128.04 0 .083-.042.126-.128l10.625-39.68a.657.657 0 0 1 .703-.576h1.217a.54.54 0 0 1 .576.704l-11.904 43.52a.658.658 0 0 1-.704.576h-1.408a.658.658 0 0 1-.704-.576ZM382.279 89.575a10.902 10.902 0 0 1-4.352-4.544 14.459 14.459 0 0 1-1.536-6.784V46.503a.566.566 0 0 1 .64-.64h1.217a.566.566 0 0 1 .64.64v32a10.549 10.549 0 0 0 2.72 7.553 10.36 10.36 0 0 0 14.336 0 10.55 10.55 0 0 0 2.72-7.553v-32a.566.566 0 0 1 .64-.64h1.216a.567.567 0 0 1 .64.64v31.744a13.01 13.01 0 0 1-3.392 9.376 11.897 11.897 0 0 1-9.023 3.553 12.848 12.848 0 0 1-6.466-1.6ZM439.584 48.103h-20.032a.226.226 0 0 0-.256.256v18.496a.226.226 0 0 0 .256.256h13.824a.567.567 0 0 1 .64.64v.96a.567.567 0 0 1-.64.64h-13.824a.226.226 0 0 0-.256.257v18.56a.226.226 0 0 0 .256.256h20.032a.567.567 0 0 1 .64.64v.96a.566.566 0 0 1-.64.64h-22.143a.565.565 0 0 1-.64-.64v-43.52a.566.566 0 0 1 .64-.64h22.143a.566.566 0 0 1 .64.64v.96a.566.566 0 0 1-.64.64ZM454.592 89.512a2.838 2.838 0 0 1-.8-2.05 2.92 2.92 0 0 1 .8-2.11 2.752 2.752 0 0 1 2.08-.833 2.846 2.846 0 0 1 2.943 2.944 2.756 2.756 0 0 1-.832 2.08 2.92 2.92 0 0 1-2.112.8 2.752 2.752 0 0 1-2.079-.831ZM474.931 88.008a11.309 11.309 0 0 1-3.2-8.416v-5.44a.566.566 0 0 1 .64-.64h1.216a.566.566 0 0 1 .64.64v5.504a9.142 9.142 0 0 0 2.529 6.72 8.973 8.973 0 0 0 6.687 2.56 8.792 8.792 0 0 0 9.28-9.28V46.503a.566.566 0 0 1 .64-.64h1.216a.566.566 0 0 1 .64.64v33.089a11.254 11.254 0 0 1-3.231 8.416 13.062 13.062 0 0 1-17.056 0ZM512.875 88.103a10.485 10.485 0 0 1-3.36-8.127v-1.793a.567.567 0 0 1 .64-.64h1.089a.567.567 0 0 1 .64.64v1.6a8.546 8.546 0 0 0 2.752 6.657 10.536 10.536 0 0 0 7.36 2.496 9.874 9.874 0 0 0 6.976-2.368 8.219 8.219 0 0 0 2.56-6.336 8.395 8.395 0 0 0-1.12-4.416 11.375 11.375 0 0 0-3.328-3.393 71.687 71.687 0 0 0-6.175-3.712 71.015 71.015 0 0 1-6.24-3.84 12.182 12.182 0 0 1-3.424-3.68 10.266 10.266 0 0 1-1.28-5.343 9.86 9.86 0 0 1 3.072-7.745 12.013 12.013 0 0 1 8.32-2.752q5.696 0 8.96 3.104a10.825 10.825 0 0 1 3.264 8.225v1.6a.566.566 0 0 1-.64.64h-1.152a.565.565 0 0 1-.64-.64v-1.472a8.864 8.864 0 0 0-2.624-6.689 9.994 9.994 0 0 0-7.233-2.527 9.37 9.37 0 0 0-6.528 2.143 7.825 7.825 0 0 0-2.367 6.113 7.809 7.809 0 0 0 1.023 4.16 10.398 10.398 0 0 0 3.008 3.039 63.025 63.025 0 0 0 5.952 3.488 70.796 70.796 0 0 1 6.72 4.256 13.461 13.461 0 0 1 3.649 3.936 10.044 10.044 0 0 1 1.28 5.184 10.719 10.719 0 0 1-3.265 8.192q-3.264 3.072-8.832 3.072-5.698 0-9.057-3.072Z"/>
-  </g>
-  <g fill="var(--cui-body-color, currentColor)">
-    <path d="m99.367 36.058-39-22.517a12 12 0 0 0-12 0l-39 22.517a12.034 12.034 0 0 0-6 10.392v45.033a12.033 12.033 0 0 0 6 10.393l39 22.516a12 12 0 0 0 12 0l39-22.516a12.033 12.033 0 0 0 6-10.393V46.45a12.034 12.034 0 0 0-6-10.392Zm-2 55.425a4 4 0 0 1-2 3.464l-39 22.517a4 4 0 0 1-4 0l-39-22.517a4 4 0 0 1-2-3.464V46.45a4 4 0 0 1 2-3.464l39-22.517a4 4 0 0 1 4 0l39 22.517a4 4 0 0 1 2 3.464Z"/>
-    <path d="M77.389 82.005h-2.866a4 4 0 0 0-1.925.493l-17.28 9.485-19.951-11.518V57.487l19.95-11.518 17.289 9.455a4 4 0 0 0 1.92.49h2.862a2 2 0 0 0 2-2v-2.712a2 2 0 0 0-1.04-1.754L59.16 38.952a8.039 8.039 0 0 0-7.843.09L31.367 50.56a8.024 8.024 0 0 0-4 6.929v22.976a8 8 0 0 0 4 6.928l19.95 11.519a8.043 8.043 0 0 0 7.843.087l19.19-10.53a2 2 0 0 0 1.038-1.754v-2.71a2 2 0 0 0-2-2ZM172.112 45.362a15.017 15.017 0 0 0-15 15v17.277a15 15 0 0 0 30 0V60.36a15.017 15.017 0 0 0-15-15Zm7 32.277a7 7 0 0 1-14 0V60.36a7 7 0 0 1 14 0ZM135.446 53.421a7.01 7.01 0 0 1 7.868 6.075.99.99 0 0 0 .984.865h6.03a1.01 1.01 0 0 0 .999-1.097 15.018 15.018 0 0 0-15.716-13.883 15.288 15.288 0 0 0-14.244 15.416v16.407a15.288 15.288 0 0 0 14.244 15.416 15.018 15.018 0 0 0 15.716-13.884 1.01 1.01 0 0 0-.998-1.097h-6.03a.99.99 0 0 0-.985.865 7.01 7.01 0 0 1-7.868 6.075 7.164 7.164 0 0 1-6.078-7.184v-16.79a7.164 7.164 0 0 1 6.078-7.184ZM218.29 72.928a12.158 12.158 0 0 0 7.183-11.077v-3.702A12.15 12.15 0 0 0 213.324 46h-16.957a1 1 0 0 0-1 1v44a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V74h6.622l7.915 17.414a1 1 0 0 0 .91.586h6.591a1 1 0 0 0 .91-1.414Zm-.817-11.077A4.154 4.154 0 0 1 213.324 66h-9.85V54h9.85a4.154 4.154 0 0 1 4.15 4.15ZM260.367 46h-26a1 1 0 0 0-1 1v44a1 1 0 0 0 1 1h26a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1h-19V72h13a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1h-13V54h19a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1ZM298.367 46h-6a1 1 0 0 0-1 1v22.647a7.007 7.007 0 1 1-14 0V47a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v22.647a15.003 15.003 0 1 0 30 0V47a1 1 0 0 0-1-1Z"/>
-    <rect width="8" height="38" x="307.367" y="46" rx="1"/>
-  </g>
-</svg>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/components/Ads.vue b/packages/docs/.vuepress/src/client/components/Ads.vue
deleted file mode 100644
index 0cbcdb65..00000000
--- a/packages/docs/.vuepress/src/client/components/Ads.vue
+++ /dev/null
@@ -1,34 +0,0 @@
-<script>
-import {h} from 'vue';
-export default {
-  props: {},
-  watch: {
-    '$route'(to, from) {
-      if (
-        to.path !== from.path
-        // Only reload if the ad has been loaded
-        // otherwise it's possible that the script is appended but
-        // the ads are not loaded yet. This would result in duplicated ads.
-        && this.$el.querySelector('#carbonads')
-      ) {
-        this.$el.innerHTML = '';
-        this.load();
-      }
-    },
-  },
-  mounted() {
-    this.load();
-  },
-  methods: {
-    load() {
-      const s = document.createElement('script');
-      s.id = '_carbonads_js';
-      s.src = `//cdn.carbonads.com/carbon.js?serve=CEAICKJY&placement=coreuiio`;
-      this.$el.appendChild(s);
-    },
-  },
-  render() {
-    return h('div');
-  },
-};
-</script>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/components/Banner.vue b/packages/docs/.vuepress/src/client/components/Banner.vue
deleted file mode 100644
index ba150ac6..00000000
--- a/packages/docs/.vuepress/src/client/components/Banner.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<script setup lang="ts">
-import { usePageFrontmatter } from '@vuepress/client'
-import type { DefaultThemePageFrontmatter } from '../../shared'
-
-const frontmatter = usePageFrontmatter<DefaultThemePageFrontmatter>()
-const pro_component = frontmatter.value.pro_component
-</script>
-
-<template>
-  <div
-    v-if="pro_component"
-    class="bg-danger bg-opacity-10 border-start border-start-5 border-start-danger p-4 pb-3 mb-5"
-  >
-    <h3 class="mb-4">CoreUI PRO Component</h3>
-    <p>
-      To use this component you must have a CoreUI PRO license. Buy the
-      <a href="https://coreui.io/pricing/?framework=vue&docs=coreui-banner-pro">CoreUI PRO</a>
-      and get access to all PRO components, features, templates, and dedicated support.
-    </p>
-  </div>
-  <div
-    v-else
-    class="bg-info bg-opacity-10 border-start border-start-5 border-start-info p-4 pb-3 mb-5"
-  >
-    <h3 class="mb-4">Support CoreUI Development</h3>
-    <p>
-      CoreUI is an MIT-licensed open source project and is completely free to use. However, the
-      amount of effort needed to maintain and develop new features for the project is not
-      sustainable without proper financial backing.
-    </p>
-    <p>You can support our Open Source software development in the following ways:</p>
-    <ul>
-      <li>
-        Buy the
-        <a href="https://coreui.io/pricing/?framework=vue&docs=coreui-banner-pro">CoreUI PRO</a>,
-        and get access to PRO components, and dedicated support.
-      </li>
-      <li>
-        <a href="https://opencollective.com/coreui" target="_blank">Became a sponsor</a>, and get
-        your logo on BACKERS.md/README.md files or each site of this documentation
-      </li>
-      <li>
-        Give us a star ⭐️ on
-        <a href="https://github.com/coreui/coreui-vue" target="_blank">Github</a>.
-      </li>
-    </ul>
-  </div>
-</template>
diff --git a/packages/docs/.vuepress/src/client/components/Callout.vue b/packages/docs/.vuepress/src/client/components/Callout.vue
deleted file mode 100644
index da3b93d8..00000000
--- a/packages/docs/.vuepress/src/client/components/Callout.vue
+++ /dev/null
@@ -1,20 +0,0 @@
-<script setup lang="ts">
-const props = defineProps({
-  color: String,
-  title: String,
-})
-
-const className = [
-  'docs-callout',
-  {
-    [`docs-callout-${props.color}`]: props.color,
-  },
-]
-</script>
-
-<template>
-  <div :class="className">
-    <h5 v-if="props.title">{{ props.title }}</h5>
-    <slot></slot>
-  </div>
-</template>
diff --git a/packages/docs/.vuepress/src/client/components/Footer.vue b/packages/docs/.vuepress/src/client/components/Footer.vue
deleted file mode 100644
index d38e5749..00000000
--- a/packages/docs/.vuepress/src/client/components/Footer.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-<template>
-  <CFooter class="docs-footer p-3 p-md-5 mt-5 text-center text-sm-start">
-    <CContainer>
-      <ul class="docs-footer-links ps-0 mb-3">
-        <li class="d-inline-block">
-          <a href="https://github.com/coreui">GitHub</a>
-        </li>
-        <li class="d-inline-block ms-3">
-          <a href="https://twitter.com/core_ui">Twitter</a>
-        </li>
-        <li class="d-inline-block ms-3 ps-3 border-start border-2">
-          <a href="https://coreui.io/">CoreUI (Vanilla)</a>
-        </li>
-        <li class="d-inline-block ms-3">
-          <a href="https://coreui.io/angular/">CoreUI for Angular</a>
-        </li>
-        <li class="d-inline-block ms-3">
-          <a href="https://coreui.io/react/">CoreUI for React.js</a>
-        </li>
-      </ul>
-      <p class="mb-0">CoreUI for Vue is Open Source UI Components Library for Vue.js.</p>
-      <p class="mb-0">
-        CoreUI code licensed
-        <a
-          href="https://github.com/coreui/coreui/blob/main/LICENSE"
-          target="_blank"
-          rel="license noopener"
-        >MIT</a>, docs 
-        <a
-          href="https://creativecommons.org/licenses/by/3.0/"
-          target="_blank"
-          rel="license noopener"
-        >CC BY 3.0</a>.
-        <strong>CoreUI PRO requires a <a href="https://coreui.io/pricing/?framework=vue&docs=footer">commercial license</a>.</strong>
-      </p>
-    </CContainer>
-  </CFooter>
-</template>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/components/Header.vue b/packages/docs/.vuepress/src/client/components/Header.vue
deleted file mode 100644
index 17ee1090..00000000
--- a/packages/docs/.vuepress/src/client/components/Header.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-<script setup lang="ts">
-import { useColorModes } from '@coreui/vue/src'
-
-const props = defineProps({
-  theme: String,
-})
-
-const { colorMode, setColorMode } = useColorModes('coreui-vue-docs-theme')
-</script>
-<template>
-  <CHeader class="mb-5 elevation-0 border-bottom" position="sticky">
-    <CHeaderToggler class="ms-md-3" @click="$emit('toggle-sidebar')">
-      <CIcon icon="cil-menu" size="lg" />
-    </CHeaderToggler>
-    <div class="docs-search" id="docsearch"></div>
-    <CHeaderNav class="ms-auto">
-      <CNavItem href="https://github.com/coreui">
-        <CIcon icon="cib-github" size="xl" />
-      </CNavItem>
-      <CNavItem href="https://twitter.com/core_ui">
-        <CIcon icon="cib-twitter" size="xl" />
-      </CNavItem>
-      <CNavItem href="https://opencollective.com/coreui">
-        <CIcon icon="cib-open-collective" size="xl" />
-      </CNavItem>
-      <li class="nav-item py-2 py-lg-1">
-        <div class="vr d-none d-lg-flex h-100 mx-lg-2 text-body text-opacity-75"></div>
-        <hr class="d-lg-none my-2 text-white-50" />
-      </li>
-      <CDropdown variant="nav-item" placement="bottom-end">
-        <CDropdownToggle :caret="false">
-          <CIcon v-if="colorMode === 'dark'" icon="cil-moon" size="xl" />
-          <CIcon v-else-if="colorMode === 'light'" icon="cil-sun" size="xl" />
-          <CIcon v-else icon="cil-contrast" size="xl" />
-        </CDropdownToggle>
-        <CDropdownMenu>
-          <CDropdownItem
-            :active="colorMode === 'light'"
-            class="d-flex align-items-center"
-            as="button"
-            type="button"
-            @click="setColorMode('light')"
-          >
-            <CIcon class="me-2" icon="cil-sun" size="lg" /> Light
-          </CDropdownItem>
-          <CDropdownItem
-            :active="colorMode === 'dark'"
-            class="d-flex align-items-center"
-            as="button"
-            type="button"
-            @click="setColorMode('dark')"
-          >
-            <CIcon class="me-2" icon="cil-moon" size="lg" /> Dark
-          </CDropdownItem>
-          <CDropdownItem
-            :active="colorMode === 'auto'"
-            class="d-flex align-items-center"
-            as="button"
-            type="button"
-            @click="setColorMode('auto')"
-          >
-            <CIcon class="me-2" icon="cil-contrast" size="lg" /> Auto
-          </CDropdownItem>
-        </CDropdownMenu>
-      </CDropdown>
-      <li class="nav-item py-2 py-lg-1">
-        <div class="vr d-none d-lg-flex h-100 mx-lg-2 text-body text-opacity-75"></div>
-        <hr class="d-lg-none my-2 text-white-50" />
-      </li>
-    </CHeaderNav>
-    <CButton
-      class="d-lg-inline-block my-2 my-md-0 ms-md-3"
-      color="primary"
-      as="a"
-      href="https://coreui.io/vue/docs/getting-started/introduction.html"
-      variant="outline"
-    >
-      <CIcon icon="cil-cloud-download" /> Download
-    </CButton>
-    <CButton
-      class="d-lg-inline-block my-2 my-md-0 ms-md-3"
-      color="primary"
-      href="https://coreui.io/about/services/?docs=coreui-header-button"
-      variant="outline"
-    >
-      <CIcon class="me-2" icon="cil-handshake" /> Hire Us
-    </CButton>
-    <CButton
-      class="d-lg-inline-block my-2 my-md-0 ms-md-3"
-      color="primary"
-      as="a"
-      href="https://coreui.io/pricing/?framework=vue&docs=coreui-header-button"
-    >
-      Get CoreUI PRO
-    </CButton>
-  </CHeader>
-</template>
diff --git a/packages/docs/.vuepress/src/client/components/OtherFrameworks.vue b/packages/docs/.vuepress/src/client/components/OtherFrameworks.vue
deleted file mode 100644
index b58ceed6..00000000
--- a/packages/docs/.vuepress/src/client/components/OtherFrameworks.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-<script setup lang="ts">
-import { usePageFrontmatter } from '@vuepress/client'
-import jsonData from '../components/other_frameworks.json'
-import type { DefaultThemePageFrontmatter } from '../../shared'
-
-const props = defineProps({
-  pro_component: Boolean,
-})
-const frontmatter = usePageFrontmatter<DefaultThemePageFrontmatter>()
-  const frameworks = frontmatter.value.other_frameworks
-  ? frontmatter.value.other_frameworks.split(', ')
-  : false
-const otherFrameworks = JSON.parse(JSON.stringify(jsonData))
-
-const humanize = (text: string) => {
-  const string = text
-    .split('-')
-    .reduce(
-      (accumulator, currentValue) =>
-        accumulator + ' ' + currentValue[0].toUpperCase() + currentValue.slice(1),
-    )
-  return string[0].toUpperCase() + string.slice(1)
-}
-</script>
-
-<template>
-  <template v-if="frameworks">
-    <h2>Other frameworks</h2>
-    <p>
-      CoreUI components are available as native Angular, Bootstrap (Vanilla JS), and React
-      components. To learn more please visit the following pages.
-    </p>
-    <ul>
-      <template v-for="framework in frameworks">
-        <template v-for="(el, index) in Object.keys(otherFrameworks[framework])">
-          <li v-if="el !== 'vue'" :key="index">
-            <a :href="otherFrameworks[framework][el]"
-              >{{ el[0].toUpperCase() + el.slice(1) }} {{ humanize(framework) }}</a
-            >
-          </li>
-        </template>
-      </template>
-    </ul>
-  </template>
-</template>
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/components/ScssDocs.vue b/packages/docs/.vuepress/src/client/components/ScssDocs.vue
deleted file mode 100644
index 61a93fee..00000000
--- a/packages/docs/.vuepress/src/client/components/ScssDocs.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-<script setup lang="ts">
-import Prism from 'prismjs'
-import 'prismjs/components/prism-scss'
-
-const props = defineProps({
-  capture: String,
-  file: String,
-})
-
-if (typeof window !== 'undefined') {
-  window.Prism = window.Prism || {}
-  window.Prism.manual = true
-}
-
-const files = import.meta.glob(`../../../../../../node_modules/@coreui/coreui/scss/**/*.scss`, {
-  query: '?raw',
-  import: 'default',
-  eager: true,
-})
-
-const file = files[`../../../../../../node_modules/@coreui/coreui/scss/${props.file}`]
-
-const captureStart = `// scss-docs-start ${props.capture}`
-const captureEnd = `// scss-docs-end ${props.capture}`
-const re = new RegExp(`${captureStart}((?:.|\n)*)${captureEnd}`)
-const captured = re.exec(file)
-const section = captured && captured[1].trim()
-const code = section
-  ? Prism.highlight(
-      section
-        .replaceAll('--#{$prefix}', '--cui-')
-        .replaceAll('\n  -', '\n-')
-        .replaceAll('\n  @', '\n@'),
-      Prism.languages.scss,
-      'scss',
-    )
-  : null
-</script>
-
-<template>
-  <div class="highlight">
-    <pre class="prism-code language-scss" v-html="code" />
-  </div>
-</template>
diff --git a/packages/docs/.vuepress/src/client/components/Sidebar.vue b/packages/docs/.vuepress/src/client/components/Sidebar.vue
deleted file mode 100755
index 49581af1..00000000
--- a/packages/docs/.vuepress/src/client/components/Sidebar.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-<script setup lang="ts">
-import { SidebarNav } from './SidebarNav'
-</script>
-
-<template>
-  <CSidebar position="fixed" size="lg" class="docs-sidebar border-end px-xl-4 elevation-0">
-    <CSidebarBrand class="justify-content-start ps-3">
-      <svg
-        xmlns="http://www.w3.org/2000/svg"
-        viewBox="0 0 556 134"
-        height="50"
-        class="d-block mt-4 mb-5"
-      >
-        <g fill="#1bbd93">
-          <path d="m347.982 90.087-11.84-43.52-.065-.193q0-.51.641-.511h1.28a.66.66 0 0 1 .704.576l10.623 39.68c.042.086.086.128.13.128.04 0 .083-.042.126-.128l10.625-39.68a.657.657 0 0 1 .703-.576h1.217a.54.54 0 0 1 .576.704l-11.904 43.52a.658.658 0 0 1-.704.576h-1.408a.658.658 0 0 1-.704-.576ZM382.279 89.575a10.902 10.902 0 0 1-4.352-4.544 14.459 14.459 0 0 1-1.536-6.784V46.503a.566.566 0 0 1 .64-.64h1.217a.566.566 0 0 1 .64.64v32a10.549 10.549 0 0 0 2.72 7.553 10.36 10.36 0 0 0 14.336 0 10.55 10.55 0 0 0 2.72-7.553v-32a.566.566 0 0 1 .64-.64h1.216a.567.567 0 0 1 .64.64v31.744a13.01 13.01 0 0 1-3.392 9.376 11.897 11.897 0 0 1-9.023 3.553 12.848 12.848 0 0 1-6.466-1.6ZM439.584 48.103h-20.032a.226.226 0 0 0-.256.256v18.496a.226.226 0 0 0 .256.256h13.824a.567.567 0 0 1 .64.64v.96a.567.567 0 0 1-.64.64h-13.824a.226.226 0 0 0-.256.257v18.56a.226.226 0 0 0 .256.256h20.032a.567.567 0 0 1 .64.64v.96a.566.566 0 0 1-.64.64h-22.143a.565.565 0 0 1-.64-.64v-43.52a.566.566 0 0 1 .64-.64h22.143a.566.566 0 0 1 .64.64v.96a.566.566 0 0 1-.64.64ZM454.592 89.512a2.838 2.838 0 0 1-.8-2.05 2.92 2.92 0 0 1 .8-2.11 2.752 2.752 0 0 1 2.08-.833 2.846 2.846 0 0 1 2.943 2.944 2.756 2.756 0 0 1-.832 2.08 2.92 2.92 0 0 1-2.112.8 2.752 2.752 0 0 1-2.079-.831ZM474.931 88.008a11.309 11.309 0 0 1-3.2-8.416v-5.44a.566.566 0 0 1 .64-.64h1.216a.566.566 0 0 1 .64.64v5.504a9.142 9.142 0 0 0 2.529 6.72 8.973 8.973 0 0 0 6.687 2.56 8.792 8.792 0 0 0 9.28-9.28V46.503a.566.566 0 0 1 .64-.64h1.216a.566.566 0 0 1 .64.64v33.089a11.254 11.254 0 0 1-3.231 8.416 13.062 13.062 0 0 1-17.056 0ZM512.875 88.103a10.485 10.485 0 0 1-3.36-8.127v-1.793a.567.567 0 0 1 .64-.64h1.089a.567.567 0 0 1 .64.64v1.6a8.546 8.546 0 0 0 2.752 6.657 10.536 10.536 0 0 0 7.36 2.496 9.874 9.874 0 0 0 6.976-2.368 8.219 8.219 0 0 0 2.56-6.336 8.395 8.395 0 0 0-1.12-4.416 11.375 11.375 0 0 0-3.328-3.393 71.687 71.687 0 0 0-6.175-3.712 71.015 71.015 0 0 1-6.24-3.84 12.182 12.182 0 0 1-3.424-3.68 10.266 10.266 0 0 1-1.28-5.343 9.86 9.86 0 0 1 3.072-7.745 12.013 12.013 0 0 1 8.32-2.752q5.696 0 8.96 3.104a10.825 10.825 0 0 1 3.264 8.225v1.6a.566.566 0 0 1-.64.64h-1.152a.565.565 0 0 1-.64-.64v-1.472a8.864 8.864 0 0 0-2.624-6.689 9.994 9.994 0 0 0-7.233-2.527 9.37 9.37 0 0 0-6.528 2.143 7.825 7.825 0 0 0-2.367 6.113 7.809 7.809 0 0 0 1.023 4.16 10.398 10.398 0 0 0 3.008 3.039 63.025 63.025 0 0 0 5.952 3.488 70.796 70.796 0 0 1 6.72 4.256 13.461 13.461 0 0 1 3.649 3.936 10.044 10.044 0 0 1 1.28 5.184 10.719 10.719 0 0 1-3.265 8.192q-3.264 3.072-8.832 3.072-5.698 0-9.057-3.072Z"/>
-        </g>
-        <g fill="var(--cui-body-color, currentColor)">
-          <path d="m99.367 36.058-39-22.517a12 12 0 0 0-12 0l-39 22.517a12.034 12.034 0 0 0-6 10.392v45.033a12.033 12.033 0 0 0 6 10.393l39 22.516a12 12 0 0 0 12 0l39-22.516a12.033 12.033 0 0 0 6-10.393V46.45a12.034 12.034 0 0 0-6-10.392Zm-2 55.425a4 4 0 0 1-2 3.464l-39 22.517a4 4 0 0 1-4 0l-39-22.517a4 4 0 0 1-2-3.464V46.45a4 4 0 0 1 2-3.464l39-22.517a4 4 0 0 1 4 0l39 22.517a4 4 0 0 1 2 3.464Z"/>
-          <path d="M77.389 82.005h-2.866a4 4 0 0 0-1.925.493l-17.28 9.485-19.951-11.518V57.487l19.95-11.518 17.289 9.455a4 4 0 0 0 1.92.49h2.862a2 2 0 0 0 2-2v-2.712a2 2 0 0 0-1.04-1.754L59.16 38.952a8.039 8.039 0 0 0-7.843.09L31.367 50.56a8.024 8.024 0 0 0-4 6.929v22.976a8 8 0 0 0 4 6.928l19.95 11.519a8.043 8.043 0 0 0 7.843.087l19.19-10.53a2 2 0 0 0 1.038-1.754v-2.71a2 2 0 0 0-2-2ZM172.112 45.362a15.017 15.017 0 0 0-15 15v17.277a15 15 0 0 0 30 0V60.36a15.017 15.017 0 0 0-15-15Zm7 32.277a7 7 0 0 1-14 0V60.36a7 7 0 0 1 14 0ZM135.446 53.421a7.01 7.01 0 0 1 7.868 6.075.99.99 0 0 0 .984.865h6.03a1.01 1.01 0 0 0 .999-1.097 15.018 15.018 0 0 0-15.716-13.883 15.288 15.288 0 0 0-14.244 15.416v16.407a15.288 15.288 0 0 0 14.244 15.416 15.018 15.018 0 0 0 15.716-13.884 1.01 1.01 0 0 0-.998-1.097h-6.03a.99.99 0 0 0-.985.865 7.01 7.01 0 0 1-7.868 6.075 7.164 7.164 0 0 1-6.078-7.184v-16.79a7.164 7.164 0 0 1 6.078-7.184ZM218.29 72.928a12.158 12.158 0 0 0 7.183-11.077v-3.702A12.15 12.15 0 0 0 213.324 46h-16.957a1 1 0 0 0-1 1v44a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V74h6.622l7.915 17.414a1 1 0 0 0 .91.586h6.591a1 1 0 0 0 .91-1.414Zm-.817-11.077A4.154 4.154 0 0 1 213.324 66h-9.85V54h9.85a4.154 4.154 0 0 1 4.15 4.15ZM260.367 46h-26a1 1 0 0 0-1 1v44a1 1 0 0 0 1 1h26a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1h-19V72h13a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1h-13V54h19a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1ZM298.367 46h-6a1 1 0 0 0-1 1v22.647a7.007 7.007 0 1 1-14 0V47a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v22.647a15.003 15.003 0 1 0 30 0V47a1 1 0 0 0-1-1Z"/>
-          <rect width="8" height="38" x="307.367" y="46" rx="1"/>
-        </g>
-      </svg>
-    </CSidebarBrand>
-    <div class="text-body-secondary mx-3 mb-2 small fw-semibold">Framework:</div>
-    <CDropdown class="mx-3 mb-4">
-      <CDropdownToggle color="primary" variant="outline"> Vue.js </CDropdownToggle>
-      <CDropdownMenu class="w-100">
-        <CDropdownItem href="https://coreui.io/angular/docs/4.0/" target="_blank">
-          Angular
-        </CDropdownItem>
-        <CDropdownItem href="https://coreui.io/docs/" target="_blank">
-          JavaScript / Vanilla JS
-        </CDropdownItem>
-        <CDropdownItem href="https://coreui.io/react/docs/" target="_blank">
-          React.js
-        </CDropdownItem>
-      </CDropdownMenu>
-    </CDropdown>
-    <SidebarNav />
-  </CSidebar>
-</template>
diff --git a/packages/docs/.vuepress/src/client/components/SidebarNav.ts b/packages/docs/.vuepress/src/client/components/SidebarNav.ts
deleted file mode 100755
index ba1b4a81..00000000
--- a/packages/docs/.vuepress/src/client/components/SidebarNav.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import { defineComponent, h, computed, onMounted, ref } from 'vue'
-import { useRoute } from 'vuepress/client'
-import { RouterLink} from 'vue-router'
-import { useSidebarItems } from '../composables'
-import { withBase } from '@vuepress/client'
-import { CBadge, CNavGroup, CNavItem, CSidebarNav } from '@coreui/vue/src/'
-import { CIcon } from '@coreui/icons-vue'
-
-import type { VNode } from 'vue'
-import type { RouteLocationNormalizedLoaded } from 'vue-router'
-import type { ResolvedSidebarItem } from '../../shared'
-
-const normalizePath = (path: string): string =>
-  decodeURI(path)
-    .replace(/#.*$/, '')
-    .replace(/(index)?\.(md|html)$/, '')
-
-const isActiveLink = (route: RouteLocationNormalizedLoaded, link?: string): boolean => {
-  if (link === undefined) {
-    return false
-  }
-
-  if (route.hash === link) {
-    return true
-  }
-
-  const currentPath = normalizePath(route.path)
-  const targetPath = normalizePath(link)
-
-  return currentPath === targetPath
-}
-
-const isActiveItem = (route: RouteLocationNormalizedLoaded, item: ResolvedSidebarItem): boolean => {
-  if (isActiveLink(route, item.link)) {
-    return true
-  }
-
-  if (item.children) {
-    return item.children.some((child) => isActiveItem(route, child))
-  }
-
-  return false
-}
-
-const SidebarNav = defineComponent({
-  name: 'SidebarNav',
-  setup() {
-    const sidebarItems = useSidebarItems()
-    const route = useRoute()
-    const firstRender = ref(true)
-
-    onMounted(() => {
-      firstRender.value = false
-    })
-
-    const renderItem = (item: any): VNode => {
-      if (item.children && !item.link.includes('.html')) {
-        const visible = computed(() => item.children.some((child) => isActiveItem(route, child)))
-
-        return h(
-          CNavGroup,
-          {
-            ...(firstRender.value && { visible: visible.value }),
-            compact: true,
-          },
-          {
-            togglerContent: () => [
-              h(CIcon, {
-                customClassName: 'nav-icon text-primary',
-                icon: ['512 512', item.icon],
-                height: 64,
-                width: 64,
-              }),
-              item.text,
-            ],
-            default: () => item.children.map((child) => renderItem(child)),
-          },
-        )
-      }
-
-      return h(
-        RouterLink,
-        {
-          to: item.link,
-          custom: true,
-        },
-        {
-          default: (props) =>
-            h(
-              CNavItem,
-              {
-                active: props.isActive,
-                disabled: item.disabled,
-                href: withBase(item.link),
-              },
-              {
-                default: () => [
-                  item.text,
-                  item.badge &&
-                    h(
-                      CBadge,
-                      {
-                        class: 'ms-auto',
-                        color: item.badge.color,
-                      },
-                      {
-                        default: () => item.badge.text,
-                      },
-                    ),
-                ],
-              },
-            ),
-        },
-      )
-    }
-
-    return () => h(
-      CSidebarNav,
-      {},
-      {
-        default: () => sidebarItems.value.map((item: any) => renderItem(item)),
-      }
-    )
-    },
-})
-
-export { SidebarNav }
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/components/Toc.vue b/packages/docs/.vuepress/src/client/components/Toc.vue
deleted file mode 100644
index 074ca917..00000000
--- a/packages/docs/.vuepress/src/client/components/Toc.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-<script setup lang="ts">
-import { ref } from 'vue'
-const visible = ref(false)
-const toggleVisible = () => {
-  visible.value = !visible.value
-}
-</script>
-
-<template>
-  <div class="docs-toc mt-4 mb-5 my-md-0 ps-xl-5 mb-lg-5 text-body-secondary">
-    <button
-      class="btn btn-link p-md-0 mb-2 mb-md-0 text-decoration-none docs-toc-toggle d-md-none"
-      type="button"
-      :aria-expanded="visible ? true : false"
-      aria-controls="tocContents"
-      @click="toggleVisible()"
-    >
-      On this page
-      <svg
-        xmlns="http://www.w3.org/2000/svg"
-        class="icon d-md-none ms-2"
-        aria-hidden="true"
-        viewBox="0 0 512 512"
-      >
-        <polygon
-          fill="var(--ci-primary-color, currentColor)"
-          points="256 382.627 60.687 187.313 83.313 164.687 256 337.372 428.687 164.687 451.313 187.313 256 382.627"
-          class="ci-primary"
-        />
-      </svg>
-    </button>
-    <strong class="d-none d-md-block h6 mb-2 pb-2 border-bottom">On this page</strong>
-    <CCollapse class="docs-toc-collapse" id="tocContents" :visible="visible">
-      <Toc />
-    </CCollapse>
-  </div>
-</template>
diff --git a/packages/docs/.vuepress/src/client/components/other_frameworks.json b/packages/docs/.vuepress/src/client/components/other_frameworks.json
deleted file mode 100644
index b9297930..00000000
--- a/packages/docs/.vuepress/src/client/components/other_frameworks.json
+++ /dev/null
@@ -1,241 +0,0 @@
-{
-  "accordion": {
-    "angular": "https://coreui.io/angular/docs/components/accordion/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/accordion/",
-    "react": "https://coreui.io/react/docs/components/accordion/",
-    "vue": "https://coreui.io/vue/docs/components/accordion.html"
-  },
-  "alert": {
-    "angular": "https://coreui.io/angular/docs/components/alert/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/alerts/",
-    "react": "https://coreui.io/react/docs/components/alert/",
-    "vue": "https://coreui.io/vue/docs/components/alert.html"
-  },
-  "avatar": {
-    "angular": "https://coreui.io/angular/docs/components/avatar/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/avatar/",
-    "react": "https://coreui.io/react/docs/components/avatar/",
-    "vue": "https://coreui.io/vue/docs/components/avatar.html"
-  },
-  "badge": {
-    "angular": "https://coreui.io/angular/docs/components/badge/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/badge/",
-    "react": "https://coreui.io/react/docs/components/badge/",
-    "vue": "https://coreui.io/vue/docs/components/badge.html"
-  },
-  "breadcrumb": {
-    "angular": "https://coreui.io/angular/docs/components/breadcrumb/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/breadcrumb/",
-    "react": "https://coreui.io/react/docs/components/breadcrumb/",
-    "vue": "https://coreui.io/vue/docs/components/breadcrumb.html"
-  },
-  "button": {
-    "angular": "https://coreui.io/angular/docs/components/button/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/buttons/",
-    "react": "https://coreui.io/react/docs/components/button/",
-    "vue": "https://coreui.io/vue/docs/components/button.html"
-  },
-  "button-group": {
-    "angular": "https://coreui.io/angular/docs/components/button-group/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/button-group/",
-    "react": "https://coreui.io/react/docs/components/button-group/",
-    "vue": "https://coreui.io/vue/docs/components/button-group.html"
-  },
-  "callout": {
-    "angular": "https://coreui.io/angular/docs/components/callout/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/callout/",
-    "react": "https://coreui.io/react/docs/components/callout/",
-    "vue": "https://coreui.io/vue/docs/components/callout.html"
-  },
-  "card": {
-    "angular": "https://coreui.io/angular/docs/components/card/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/card/",
-    "react": "https://coreui.io/react/docs/components/card/",
-    "vue": "https://coreui.io/vue/docs/components/card.html"
-  },
-  "carousel": {
-    "angular": "https://coreui.io/angular/docs/components/carousel/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/carousel/",
-    "react": "https://coreui.io/react/docs/components/carousel/",
-    "vue": "https://coreui.io/vue/docs/components/carousel.html"
-  },
-  "checkbox": {
-    "angular": "https://coreui.io/angular/docs/forms/checks-radios/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/checks-radios/",
-    "react": "https://coreui.io/react/docs/forms/checkbox/",
-    "vue": "https://coreui.io/vue/docs/forms/checkbox.html"
-  },
-  "close-button": {
-    "angular": "https://coreui.io/angular/docs/components/close-button/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/close-button/",
-    "react": "https://coreui.io/react/docs/components/close-button/",
-    "vue": "https://coreui.io/vue/docs/components/close-button.html"
-  },
-  "collapse": {
-    "angular": "https://coreui.io/angular/docs/components/collapse/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/collapse/",
-    "react": "https://coreui.io/react/docs/components/collapse/",
-    "vue": "https://coreui.io/vue/docs/components/collapse.html"
-  },
-  "dropdown": {
-    "angular": "https://coreui.io/angular/docs/components/dropdown/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/dropdowns/",
-    "react": "https://coreui.io/react/docs/components/dropdown/",
-    "vue": "https://coreui.io/vue/docs/components/dropdown.html"
-  },
-  "footer": {
-    "angular": "https://coreui.io/angular/docs/components/footer/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/footer/",
-    "react": "https://coreui.io/react/docs/components/footer/",
-    "vue": "https://coreui.io/vue/docs/components/footer.html"
-  },
-  "header": {
-    "angular": "https://coreui.io/angular/docs/components/header/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/header/",
-    "react": "https://coreui.io/react/docs/components/header/",
-    "vue": "https://coreui.io/vue/docs/components/header.html"
-  },
-  "icon": {
-    "angular": "https://coreui.io/angular/docs/components/icon/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/icon/",
-    "react": "https://coreui.io/react/docs/components/icon/",
-    "vue": "https://coreui.io/vue/docs/components/icon.html"
-  },
-  "image": {
-    "angular": "https://coreui.io/angular/docs/components/image/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/content/images/",
-    "react": "https://coreui.io/react/docs/components/image/",
-    "vue": "https://coreui.io/vue/docs/components/image.html"
-  },
-  "input": {
-    "angular": "https://coreui.io/angular/docs/forms/input/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/form-control/",
-    "react": "https://coreui.io/react/docs/forms/input/",
-    "vue": "https://coreui.io/vue/docs/forms/input.html"
-  },
-  "input-group": {
-    "angular": "https://coreui.io/angular/docs/forms/input-group/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/input-group/",
-    "react": "https://coreui.io/react/docs/forms/input-group/",
-    "vue": "https://coreui.io/vue/docs/forms/input-group.html"
-  },
-  "floating-labels": {
-    "angular": "https://coreui.io/angular/docs/forms/floating-labels/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/floating-labels/",
-    "react": "https://coreui.io/react/docs/forms/floating-labels/",
-    "vue": "https://coreui.io/vue/docs/forms/floating-labels.html"
-  },
-  "list-group": {
-    "angular": "https://coreui.io/angular/docs/components/list-group/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/list-group/",
-    "react": "https://coreui.io/react/docs/components/list-group/",
-    "vue": "https://coreui.io/vue/docs/components/list-group.html"
-  },
-  "modal": {
-    "angular": "https://coreui.io/angular/docs/components/modal/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/modal/",
-    "react": "https://coreui.io/react/docs/components/modal/",
-    "vue": "https://coreui.io/vue/docs/components/modal.html"
-  },
-  "navbar": {
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/navbar/",
-    "react": "https://coreui.io/react/docs/components/navbar/",
-    "vue": "https://coreui.io/vue/docs/components/navbar.html"
-  },
-  "navs-tabs": {
-    "angular": "https://coreui.io/angular/docs/components/nav/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/navs-tabs/",
-    "react": "https://coreui.io/react/docs/components/navs-tabs/",
-    "vue": "https://coreui.io/vue/docs/components/navs-tabs.html"
-  },
-  "offcanvas": {
-    "angular": "https://coreui.io/angular/docs/components/offcanvas/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/offcanvas/",
-    "react": "https://coreui.io/react/docs/components/offcanvas/",
-    "vue": "https://coreui.io/vue/docs/components/offcanvas.html"
-  },
-  "pagination": {
-    "angular": "https://coreui.io/angular/docs/components/pagination/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/pagination/",
-    "react": "https://coreui.io/react/docs/components/pagination/",
-    "vue": "https://coreui.io/vue/docs/components/pagination.html"
-  },
-  "placeholder": {
-    "angular": "https://coreui.io/angular/docs/components/placeholder/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/placeholders/",
-    "react": "https://coreui.io/react/docs/components/placeholder/",
-    "vue": "https://coreui.io/vue/docs/components/placeholder.html"
-  },
-  "popover": {
-    "angular": "https://coreui.io/angular/docs/components/popover/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/popovers/",
-    "react": "https://coreui.io/react/docs/components/popover/",
-    "vue": "https://coreui.io/vue/docs/components/popover.html"
-  },
-  "progress": {
-    "angular": "https://coreui.io/angular/docs/components/progress/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/progress/",
-    "react": "https://coreui.io/react/docs/components/progress/",
-    "vue": "https://coreui.io/vue/docs/components/progress.html"
-  },
-  "radio": {
-    "angular": "https://coreui.io/angular/docs/forms/checks-radios/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/checks-radios/",
-    "react": "https://coreui.io/react/docs/forms/radio/",
-    "vue": "https://coreui.io/vue/docs/forms/radio.html"
-  },
-  "range": {
-    "angular": "https://coreui.io/angular/docs/forms/range/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/range/",
-    "react": "https://coreui.io/react/docs/forms/range/",
-    "vue": "https://coreui.io/vue/docs/forms/range.html"
-  },
-  "select": {
-    "angular": "https://coreui.io/angular/docs/forms/select/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/select/",
-    "react": "https://coreui.io/react/docs/forms/select/",
-    "vue": "https://coreui.io/vue/docs/forms/select.html"
-  },
-  "sidebar": {
-    "angular": "https://coreui.io/angular/docs/components/sidebar/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/sidebar/",
-    "react": "https://coreui.io/react/docs/components/sidebar/",
-    "vue": "https://coreui.io/vue/docs/components/sidebar.html"
-  },
-  "spinner": {
-    "angular": "https://coreui.io/angular/docs/components/spinner/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/spinners/",
-    "react": "https://coreui.io/react/docs/components/spinner/",
-    "vue": "https://coreui.io/vue/docs/components/spinner.html"
-  },
-  "switch": {
-    "angular": "https://coreui.io/angular/docs/forms/checks-radios/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/checks-radios/",
-    "react": "https://coreui.io/react/docs/forms/switch/",
-    "vue": "https://coreui.io/vue/docs/forms/switch.html"
-  },
-  "table": {
-    "angular": "https://coreui.io/angular/docs/components/table/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/content/tables/",
-    "react": "https://coreui.io/react/docs/components/table/",
-    "vue": "https://coreui.io/vue/docs/components/table.html"
-  },
-  "textarea": {
-    "angular": "https://coreui.io/angular/docs/forms/form-control/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/forms/form-control/",
-    "react": "https://coreui.io/react/docs/forms/textarea/",
-    "vue": "https://coreui.io/vue/docs/forms/textarea.html"
-  },
-  "toast": {
-    "angular": "https://coreui.io/angular/docs/components/toast/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/toasts/",
-    "react": "https://coreui.io/react/docs/components/toast/",
-    "vue": "https://coreui.io/vue/docs/components/toast.html"
-  },
-  "tooltip": {
-    "angular": "https://coreui.io/angular/docs/components/tooltip/",
-    "bootstrap": "https://coreui.io/bootstrap/docs/components/tooltips/",
-    "react": "https://coreui.io/react/docs/components/tooltip/",
-    "vue": "https://coreui.io/vue/docs/components/tooltip.html"
-  }
-}
diff --git a/packages/docs/.vuepress/src/client/composables/index.ts b/packages/docs/.vuepress/src/client/composables/index.ts
deleted file mode 100644
index 26ca889b..00000000
--- a/packages/docs/.vuepress/src/client/composables/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './useScrollPromise'
-export * from './useSidebarItems'
-export * from './useThemeData'
diff --git a/packages/docs/.vuepress/src/client/composables/useNavLink.ts b/packages/docs/.vuepress/src/client/composables/useNavLink.ts
deleted file mode 100755
index 0dc5fc38..00000000
--- a/packages/docs/.vuepress/src/client/composables/useNavLink.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import type { NavLink } from '../../shared/index.js'
-import { useResolveRouteWithRedirect } from './useResolveRouteWithRedirect.js'
-
-declare module 'vue-router' {
-  interface RouteMeta {
-    title?: string
-  }
-}
-
-/**
- * Resolve NavLink props from string
- *
- * @example
- * - Input: '/README.md'
- * - Output: { text: 'Home', link: '/' }
- */
-export const useNavLink = (item: string): NavLink => {
-  // the route path of vue-router is url-encoded, and we expect users are using
-  // non-url-encoded string in theme config, so we need to url-encode it first to
-  // resolve the route correctly
-  const resolved = useResolveRouteWithRedirect(encodeURI(item))
-  return {
-    text: resolved.meta.title || item,
-    link: resolved.name === '404' ? item : resolved.fullPath,
-  }
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/composables/useResolveRouteWithRedirect.ts b/packages/docs/.vuepress/src/client/composables/useResolveRouteWithRedirect.ts
deleted file mode 100755
index 5a1958a4..00000000
--- a/packages/docs/.vuepress/src/client/composables/useResolveRouteWithRedirect.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { isFunction, isString } from '@vuepress/shared'
-import { useRouter } from 'vue-router'
-import type { Router } from 'vue-router'
-
-/**
- * Resolve a route with redirection
- */
-export const useResolveRouteWithRedirect = (
-  ...args: Parameters<Router['resolve']>
-): ReturnType<Router['resolve']> => {
-  const router = useRouter()
-  const route = router.resolve(...args)
-  const lastMatched = route.matched[route.matched.length - 1]
-  if (!lastMatched?.redirect) {
-    return route
-  }
-  const { redirect } = lastMatched
-  const resolvedRedirect = isFunction(redirect) ? redirect(route) : redirect
-  const resolvedRedirectObj = isString(resolvedRedirect)
-    ? { path: resolvedRedirect }
-    : resolvedRedirect
-  return useResolveRouteWithRedirect({
-    hash: route.hash,
-    query: route.query,
-    params: route.params,
-    ...resolvedRedirectObj,
-  })
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/composables/useScrollPromise.ts b/packages/docs/.vuepress/src/client/composables/useScrollPromise.ts
deleted file mode 100755
index 02e726ca..00000000
--- a/packages/docs/.vuepress/src/client/composables/useScrollPromise.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export interface ScrollPromise {
-  wait(): Promise<void> | null
-  pending: () => void
-  resolve: () => void
-}
-
-let promise: Promise<void> | null = null
-let promiseResolve: (() => void) | null = null
-
-const scrollPromise: ScrollPromise = {
-  wait: () => promise,
-  pending: () => {
-    promise = new Promise((resolve) => (promiseResolve = resolve))
-  },
-  resolve: () => {
-    promiseResolve?.()
-    promise = null
-    promiseResolve = null
-  },
-}
-
-export const useScrollPromise = (): ScrollPromise => scrollPromise
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/composables/useSidebarItems.ts b/packages/docs/.vuepress/src/client/composables/useSidebarItems.ts
deleted file mode 100755
index cc9aa7b6..00000000
--- a/packages/docs/.vuepress/src/client/composables/useSidebarItems.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-import { usePageData, usePageFrontmatter } from '@vuepress/client'
-import type { PageHeader } from '@vuepress/client'
-import {
-  isPlainObject,
-  isString,
-  resolveLocalePath,
-} from '@vuepress/shared'
-import { computed, inject, provide } from 'vue'
-import type { ComputedRef, InjectionKey } from 'vue'
-import { useRoute } from 'vue-router'
-import type {
-  DefaultThemeData,
-  DefaultThemeNormalPageFrontmatter,
-  ResolvedSidebarItem,
-  SidebarConfigArray,
-  SidebarConfigObject,
-  SidebarItem,
-} from '../../shared/index.js'
-import { useNavLink } from './useNavLink.js'
-import { useThemeLocaleData } from './useThemeData.js'
-
-export type SidebarItemsRef = ComputedRef<ResolvedSidebarItem[]>
-
-export const sidebarItemsSymbol: InjectionKey<SidebarItemsRef> =
-  Symbol('sidebarItems')
-
-/**
- * Inject sidebar items global computed
- */
-export const useSidebarItems = (): SidebarItemsRef => {
-  const sidebarItems = inject(sidebarItemsSymbol)
-  if (!sidebarItems) {
-    throw new Error('useSidebarItems() is called without provider.')
-  }
-  return sidebarItems
-}
-
-/**
- * Create sidebar items ref and provide as global computed in setup
- */
-export const setupSidebarItems = (): void => {
-  const themeLocale = useThemeLocaleData()
-  const frontmatter = usePageFrontmatter<DefaultThemeNormalPageFrontmatter>()
-  const sidebarItems = computed(() =>
-    resolveSidebarItems(frontmatter.value, themeLocale.value)
-  )
-  provide(sidebarItemsSymbol, sidebarItems)
-}
-
-/**
- * Resolve sidebar items global computed
- *
- * It should only be resolved and provided once
- */
-export const resolveSidebarItems = (
-  frontmatter: DefaultThemeNormalPageFrontmatter,
-  themeLocale: DefaultThemeData
-): ResolvedSidebarItem[] => {
-  // get sidebar config from frontmatter > theme data
-  const sidebarConfig = frontmatter.sidebar ?? themeLocale.sidebar ?? 'auto'
-  const sidebarDepth = frontmatter.sidebarDepth ?? themeLocale.sidebarDepth ?? 2
-
-  // resolve sidebar items according to the config
-  if (frontmatter.home || sidebarConfig === false) {
-    return []
-  }
-
-  if (sidebarConfig === 'auto') {
-    return resolveAutoSidebarItems(sidebarDepth)
-  }
-
-  if (Array.isArray(sidebarConfig)) {
-    return resolveArraySidebarItems(sidebarConfig, sidebarDepth)
-  }
-
-  if (isPlainObject(sidebarConfig)) {
-    return resolveMultiSidebarItems(sidebarConfig, sidebarDepth)
-  }
-
-  return []
-}
-
-/**
- * Util to transform page header to sidebar item
- */
-export const headerToSidebarItem = (
-  header: PageHeader,
-  sidebarDepth: number
-): ResolvedSidebarItem => ({
-  text: header.title,
-  link: header.link,
-  children: headersToSidebarItemChildren(header.children, sidebarDepth),
-})
-
-export const headersToSidebarItemChildren = (
-  headers: PageHeader[],
-  sidebarDepth: number
-): ResolvedSidebarItem[] =>
-  sidebarDepth > 0
-    ? headers.map((header) => headerToSidebarItem(header, sidebarDepth - 1))
-    : []
-
-/**
- * Resolve sidebar items if the config is `auto`
- */
-export const resolveAutoSidebarItems = (
-  sidebarDepth: number
-): ResolvedSidebarItem[] => {
-  const page = usePageData()
-
-  return [
-    {
-      text: page.value.title,
-      children: headersToSidebarItemChildren(page.value.headers, sidebarDepth),
-    },
-  ]
-}
-
-/**
- * Resolve sidebar items if the config is an array
- */
-export const resolveArraySidebarItems = (
-  sidebarConfig: SidebarConfigArray,
-  sidebarDepth: number
-): ResolvedSidebarItem[] => {
-  const route = useRoute()
-  const page = usePageData()
-
-  const handleChildItem = (
-    item: ResolvedSidebarItem | SidebarItem | string
-  ): ResolvedSidebarItem => {
-    let childItem: ResolvedSidebarItem
-    if (isString(item)) {
-      childItem = useNavLink(item)
-    } else {
-      childItem = item as ResolvedSidebarItem
-    }
-
-    if (childItem.children) {
-      return {
-        ...childItem,
-        children: childItem.children.map((item) => handleChildItem(item)),
-      }
-    }
-
-    // TODO: check if we need this
-    // if the sidebar item is current page and children is not set
-    // use headers of current page as children
-    // if (childItem.link === route.path) {
-    //   // skip h1 header
-    //   const headers =
-    //     page.value.headers[0]?.level === 1
-    //       ? page.value.headers[0].children
-    //       : page.value.headers
-    //   return {
-    //     ...childItem,
-    //     children: headersToSidebarItemChildren(headers, sidebarDepth),
-    //   }
-    // }
-
-    return childItem
-  }
-
-  return sidebarConfig.map((item) => handleChildItem(item))
-}
-
-/**
- * Resolve sidebar items if the config is a key -> value (path-prefix -> array) object
- */
-export const resolveMultiSidebarItems = (
-  sidebarConfig: SidebarConfigObject,
-  sidebarDepth: number
-): ResolvedSidebarItem[] => {
-  const route = useRoute()
-  const sidebarPath = resolveLocalePath(sidebarConfig, route.path)
-  const matchedSidebarConfig = sidebarConfig[sidebarPath] ?? []
-
-  return resolveArraySidebarItems(matchedSidebarConfig, sidebarDepth)
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/composables/useThemeData.ts b/packages/docs/.vuepress/src/client/composables/useThemeData.ts
deleted file mode 100755
index 78ab77f7..00000000
--- a/packages/docs/.vuepress/src/client/composables/useThemeData.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import {
-  useThemeData as _useThemeData,
-  useThemeLocaleData as _useThemeLocaleData,
-} from '@vuepress/plugin-theme-data/client'
-import type {
-  ThemeDataRef,
-  ThemeLocaleDataRef,
-} from '@vuepress/plugin-theme-data/client'
-import type { DefaultThemeData } from '../../shared/index.js'
-
-export const useThemeData = (): ThemeDataRef<DefaultThemeData> =>
-  _useThemeData<DefaultThemeData>()
-export const useThemeLocaleData = (): ThemeLocaleDataRef<DefaultThemeData> =>
-  _useThemeLocaleData<DefaultThemeData>()
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/config.ts b/packages/docs/.vuepress/src/client/config.ts
deleted file mode 100644
index ca174efb..00000000
--- a/packages/docs/.vuepress/src/client/config.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { defineClientConfig } from '@vuepress/client'
-import { h } from 'vue'
-import {
-  setupSidebarItems,
-  useScrollPromise,
-} from './composables/index.js'
-import Layout from './layouts/Layout.vue'
-import NotFound from './layouts/404.vue'
-
-import './styles/index.scss'
-
-export default defineClientConfig({
-  enhance({ app, router }) {
-
-    // compat with @vuepress/plugin-external-link-icon
-    app.component('AutoLinkExternalIcon', () => {
-      const ExternalLinkIcon = app.component('ExternalLinkIcon')
-      if (ExternalLinkIcon) {
-        return h(ExternalLinkIcon)
-      }
-      return null
-    })
-
-    // handle scrollBehavior with transition
-    const scrollBehavior = router.options.scrollBehavior!
-    router.options.scrollBehavior = async (...args) => {
-      await useScrollPromise().wait()
-      return scrollBehavior(...args)
-    }
-  },
-
-  setup() {
-    setupSidebarItems()
-  },
-
-  layouts: {
-    Layout,
-    NotFound,
-  },
-})
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/index.ts b/packages/docs/.vuepress/src/client/index.ts
deleted file mode 100755
index 520d8125..00000000
--- a/packages/docs/.vuepress/src/client/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from '../shared/index.js'
-export * from './composables/index.js'
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/layouts/404.vue b/packages/docs/.vuepress/src/client/layouts/404.vue
deleted file mode 100755
index b8315905..00000000
--- a/packages/docs/.vuepress/src/client/layouts/404.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-<script setup lang="ts">
-import { defineComponent } from 'vue'
-import { useRouteLocale } from '@vuepress/client'
-import { useThemeLocaleData } from '../composables'
-
-const routeLocale = useRouteLocale()
-const themeLocale = useThemeLocaleData()
-
-const messages = themeLocale.value.notFound ?? ['Not Found']
-const getMsg = (): string => messages[Math.floor(Math.random() * messages.length)]
-const homeLink = themeLocale.value.home ?? routeLocale.value
-const homeText = themeLocale.value.backToHome ?? 'Back to home'
-</script>
-
-<template>
-  <div class="theme-container">
-    <div class="theme-default-content">
-      <h1>404</h1>
-
-      <blockquote>{{ getMsg() }}</blockquote>
-
-      <RouterLink :to="homeLink">{{ homeText }}</RouterLink>
-    </div>
-  </div>
-</template>
diff --git a/packages/docs/.vuepress/src/client/layouts/Layout.vue b/packages/docs/.vuepress/src/client/layouts/Layout.vue
deleted file mode 100755
index 75d6da70..00000000
--- a/packages/docs/.vuepress/src/client/layouts/Layout.vue
+++ /dev/null
@@ -1,82 +0,0 @@
-<script setup lang="ts">
-import { onMounted, ref } from 'vue'
-import { usePageFrontmatter } from '@vuepress/client'
-import docsearch from '@docsearch/js'
-import type { DefaultThemePageFrontmatter } from '../../shared'
-import Ads from '../components/Ads.vue'
-import Banner from '../components/Banner.vue'
-import Footer from '../components/Footer.vue'
-import Header from '../components/Header.vue'
-import OtherFrameworks from '../components/OtherFrameworks.vue'
-import Sidebar from '../components/Sidebar.vue'
-import Toc from '../components/Toc.vue'
-import { useScrollPromise } from '../composables'
-
-const frontmatter = usePageFrontmatter<DefaultThemePageFrontmatter>()
-
-// sidebar
-const isSidebarOpen = ref(true)
-
-const toggleSidebar = (to?: boolean): void => {
-  isSidebarOpen.value = typeof to === 'boolean' ? to : !isSidebarOpen.value
-}
-
-// handle scrollBehavior with transition
-const scrollPromise = useScrollPromise()
-const onBeforeEnter = scrollPromise.resolve
-const onBeforeLeave = scrollPromise.pending
-
-const name = frontmatter.value.name
-const title = frontmatter.value.title
-const description = frontmatter.value.description
-
-onMounted(() => {
-  const searchElement = document.getElementById('docsearch') as HTMLElement
-  docsearch({
-    appId: 'RG8RW9GEH3',
-    apiKey: '4926b633296d71c6d727f7766170f82b',
-    indexName: 'coreuivue',
-    container: searchElement,
-    // @ts-ignore
-    debug: false,
-  })
-})
-</script>
-
-<template>
-  <div>
-    <Sidebar :visible="isSidebarOpen" @visible-change="(event) => (isSidebarOpen = event)" />
-    <div class="wrapper flex-grow-1">
-      <Header @toggle-sidebar="toggleSidebar(!isSidebarOpen)" />
-      <Transition
-        name="fade-slide-y"
-        mode="out-in"
-        @before-enter="onBeforeEnter"
-        @before-leave="onBeforeLeave"
-      >
-        <CContainer class="my-md-4 flex-grow-1" lg>
-          <main class="docs-main order-1">
-            <div class="docs-intro ps-lg-4">
-              <Banner />
-              <div v-if="name && name !== title" class="d-flex flex-column">
-                <h1 class="order-2 h5 mb-4 text-body-secondary" id="content">
-                  {{ title }}
-                </h1>
-                <h2 class="docs-title order-1 h1">{{ name }}</h2>
-              </div>
-              <h1 v-else class="docs-title" id="content">
-                {{ title }}
-              </h1>
-              <p class="docs-lead">{{ description }}</p>
-              <Ads />
-              <OtherFrameworks />
-            </div>
-            <Toc />
-            <div className="docs-content ps-lg-4"><Content /></div>
-          </main>
-        </CContainer>
-      </Transition>
-      <Footer />
-    </div>
-  </div>
-</template>
diff --git a/packages/docs/.vuepress/src/client/layouts/Redirect.vue b/packages/docs/.vuepress/src/client/layouts/Redirect.vue
deleted file mode 100644
index 2f3cb7c6..00000000
--- a/packages/docs/.vuepress/src/client/layouts/Redirect.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template></template>
-
-<script>
-export default {
-  mounted() {
-    this.$router.push('/getting-started/introduction.html')
-  },
-}
-</script>
diff --git a/packages/docs/.vuepress/src/client/shim.d.ts b/packages/docs/.vuepress/src/client/shim.d.ts
deleted file mode 100755
index f97ca4f4..00000000
--- a/packages/docs/.vuepress/src/client/shim.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-declare module '*.vue' {
-  import type { ComponentOptions } from 'vue'
-  const comp: ComponentOptions
-  export default comp
-}
-
-declare module '*.module.scss?module' {
-  const cssVars: Record<string, string>
-  export default cssVars
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/styles/_ads.scss b/packages/docs/.vuepress/src/client/styles/_ads.scss
deleted file mode 100644
index 575db8b0..00000000
--- a/packages/docs/.vuepress/src/client/styles/_ads.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-// stylelint-disable declaration-no-important, selector-max-id
-
-//
-// Carbon ads
-//
-
-#carbonads {
-  position: static;
-  display: block;
-  max-width: 400px;
-  padding: 15px 15px 15px 160px;
-  margin: 2rem 0;
-  overflow: hidden;
-  @include font-size(.8125rem);
-  line-height: 1.4;
-  text-align: left;
-  background-color: var(--cui-tertiary-bg);
-
-  a {
-    color: var(--cui-body-color);
-    text-decoration: none;
-  }
-
-  @include media-breakpoint-up(sm) {
-    @include border-radius(.5rem);
-  }
-}
-
-.carbon-img {
-  float: left;
-  margin-left: -145px;
-}
-
-.carbon-poweredby {
-  display: block;
-  margin-top: .75rem;
-  color: var(--cui-body-color) !important;
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_anchor.scss b/packages/docs/.vuepress/src/client/styles/_anchor.scss
deleted file mode 100644
index 3f9ade89..00000000
--- a/packages/docs/.vuepress/src/client/styles/_anchor.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-.anchor-link {
-  font-weight: 400;
-  color: rgba($link-color, .5);
-  padding-left: 0.375em;
-  text-decoration: none;
-  opacity: 0;
-  @include transition(color .15s ease-in-out);
-
-  &:focus,
-  &:hover {
-    color: $link-color;
-    text-decoration: none;
-  }
-}
-
-h2, h3, h4, h5, h6 {
-  &:hover {
-    .anchor-link {
-      opacity: 1;
-    }
-  }
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/styles/_callouts.scss b/packages/docs/.vuepress/src/client/styles/_callouts.scss
deleted file mode 100644
index a0dc566c..00000000
--- a/packages/docs/.vuepress/src/client/styles/_callouts.scss
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Callouts
-//
-
-.docs-callout {
-  --#{$prefix}link-color-rgb: var(--cd-callout-link);
-  --#{$prefix}code-color: var(--cd-callout-code-color);
-
-  padding: 1.25rem;
-  margin-top: 1.25rem;
-  margin-bottom: 1.25rem;
-  background-color: var(--cd-callout-bg, var(--cui-gray-100));
-  border-left: .25rem solid var(--cd-callout-border, var(--cui-gray-300));
-
-  h4 {
-    margin-bottom: .25rem;
-  }
-
-  > :last-child {
-    margin-bottom: 0;
-  }
-
-  + .docs-callout {
-    margin-top: -.25rem;
-  }
-
-  .highlight {
-    background-color: rgba($black, .05);
-  }
-}
-
-// Variations
-@each $variant in $cd-callout-variants {
-  .docs-callout-#{$variant} {
-    --cd-callout-color: var(--cui-#{$variant}-text-emphasis);
-    --cd-callout-bg: rgba(var(--cui-#{$variant}-rgb), .1);
-    --cd-callout-border: var(--cui-#{$variant});
-  }
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_component-examples.scss b/packages/docs/.vuepress/src/client/styles/_component-examples.scss
deleted file mode 100644
index 2e725c8f..00000000
--- a/packages/docs/.vuepress/src/client/styles/_component-examples.scss
+++ /dev/null
@@ -1,471 +0,0 @@
-//
-// Docs examples
-//
-
-.docs-code-tabs {
-  padding: 0 ($cd-gutter-x * .5);
-  margin: 0 ($cd-gutter-x * -.5);
-
-  @include media-breakpoint-up(md) {
-    padding: 0;
-    margin: 0;
-  }
-}
-
-.docs-code-tab-content {
-  .tab-pane div[class^="language-"] {
-    border-top: 0 !important;
-    @include border-top-radius(0 !important);
-  }
-}
-
-.docs-example-snippet {
-  border: solid var(--cui-border-color);
-  border-width: 1px 0;
-
-  @include media-breakpoint-up(md) {
-    border-width: 1px;
-  }
-}
-
-.docs-example {
-  --cd-example-padding: 1rem;
-
-  position: relative;
-  padding: var(--cd-example-padding);
-  margin: 0 ($cd-gutter-x * -.5);
-  border: solid var(--cui-border-color);
-  border-width: 1px 0;
-  @include clearfix();
-
-  @include media-breakpoint-up(md) {
-    --cd-example-padding: 1.5rem;
-
-    margin-right: 0;
-    margin-left: 0;
-    border-width: 1px;
-    @include border-top-radius(var(--cui-border-radius));
-  }
-
-  + .docs-code-snippet {
-    @include border-top-radius(0);
-    border: solid var(--cui-border-color);
-    border-width: 0 1px 1px;
-  }
-
-  + p {
-    margin-top: 2rem;
-  }
-
-  > .form-control {
-    + .form-control {
-      margin-top: .5rem;
-    }
-  }
-
-  > .nav + .nav,
-  > .alert + .alert,
-  > .navbar + .navbar,
-  > .progress + .progress {
-    margin-top: $spacer;
-  }
-
-  > .dropdown-menu {
-    position: static;
-    display: block;
-  }
-
-  > :last-child,
-  > nav:last-child .breadcrumb {
-    margin-bottom: 0;
-  }
-
-  > hr:last-child {
-    margin-bottom: $spacer;
-  }
-
-  // Images
-  > svg + svg,
-  > img + img {
-    margin-left: .5rem;
-  }
-
-  // Avatars
-  > .avatar + .avatar {
-    margin-left: .25rem;
-  }
-
-  // Badges
-  > .badge + .badge {
-    margin-left: .25rem;
-  }
-
-  // Buttons
-  > .btn,
-  > .btn-group {
-    margin: .25rem .125rem;
-  }
-  > .btn-toolbar + .btn-toolbar {
-    margin-top: .5rem;
-  }
-
-  // List groups
-  > .list-group {
-    max-width: 400px;
-  }
-
-  > [class*="list-group-horizontal"] {
-    max-width: 100%;
-  }
-
-  // Navbars
-  .fixed-top,
-  .sticky-top {
-    position: static;
-    margin: calc(var(--cd-example-padding) * -1) calc(var(--cd-example-padding) * -1) var(--cd-example-padding); // stylelint-disable-line function-disallowed-list
-  }
-
-  .fixed-bottom,
-  .sticky-bottom {
-    position: static;
-    margin: var(--cd-example-padding) calc(var(--cd-example-padding) * -1) calc(var(--cd-example-padding) * -1); // stylelint-disable-line function-disallowed-list
-
-  }
-
-  // Pagination
-  .pagination {
-    margin-bottom: 0;
-  }
-
-    // Sidebar
-    .sidebar-narrow,
-    .sidebar-narrow-unfoldable {
-      position: static;
-    }
-  
-    .sidebar-narrow-unfoldable {
-      min-height: 550px;
-    }
-
-  // Spinners
-  > .spinner-grow + .spinner-border,
-  > .spinner-border + .spinner-grow,
-  > .spinner-border + .spinner-border,
-  > .spinner-grow + .spinner-grow {
-    margin-left: .25rem;
-  }
-}
-
-//
-// Grid examples
-//
-
-.docs-example-row [class^="col"],
-.docs-example-cols [class^="col"] > *,
-.docs-example-cssgrid [class*="grid"] > * {
-  padding-top: .75rem;
-  padding-bottom: .75rem;
-  background-color: rgba(var(--cd-violet-rgb), .15);
-  border: 1px solid rgba(var(--cd-violet-rgb), .3);
-}
-
-.docs-example-row .row + .row,
-.docs-example-cssgrid .grid + .grid {
-  margin-top: 1rem;
-}
-
-.docs-example-row-flex-cols .row {
-  min-height: 10rem;
-  background-color: rgba(var(--cd-violet-rgb), .15);
-}
-
-.docs-example-flex div:not(.vr) {
-  background-color: rgba(var(--cd-violet-rgb), .15);
-  border: 1px solid rgba(var(--cd-violet-rgb), .3);
-}
-
-// Grid mixins
-.example-container {
-  width: 800px;
-  @include make-container();
-}
-
-.example-row {
-  @include make-row();
-}
-
-.example-content-main {
-  @include make-col-ready();
-
-  @include media-breakpoint-up(sm) {
-    @include make-col(6);
-  }
-
-  @include media-breakpoint-up(lg) {
-    @include make-col(8);
-  }
-}
-
-.example-content-secondary {
-  @include make-col-ready();
-
-  @include media-breakpoint-up(sm) {
-    @include make-col(6);
-  }
-
-  @include media-breakpoint-up(lg) {
-    @include make-col(4);
-  }
-}
-
-// Ratio helpers
-.docs-example-ratios {
-  .ratio {
-    display: inline-block;
-    width: 10rem;
-    color: var(--cui-secondary-color);
-    background-color: var(--cui-tertiary-bg);
-    border: var(--cui-border-width) solid var(--cui-border-color);
-
-    > div {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-    }
-  }
-}
-.docs-example-ratios-breakpoint {
-  .ratio-4x3 {
-    width: 16rem;
-
-    @include media-breakpoint-up(md) {
-      --cui-aspect-ratio: 50%; // 2x1
-    }
-  }
-}
-
-.docs-example-offcanvas {
-  .offcanvas {
-    position: static;
-    display: block;
-    height: 200px;
-    visibility: visible;
-    transform: translate(0);
-  }
-}
-
-// Tooltips
-.tooltip-demo {
-  a {
-    white-space: nowrap;
-  }
-
-  .btn {
-    margin: .25rem .125rem;
-  }
-}
-
-// scss-docs-start custom-tooltip
-.custom-tooltip {
-  --cui-tooltip-bg: var(--cui-primary);
-}
-// scss-docs-end custom-tooltip
-
-// scss-docs-start custom-popovers
-.custom-popover {
-  --cui-popover-max-width: 200px;
-  --cui-popover-border-color: var(--cui-primary);
-  --cui-popover-header-bg: var(--cui-primary);
-  --cui-popover-header-color: var(--cui-white);
-  --cui-popover-body-padding-x: 1rem;
-  --cui-popover-body-padding-y: .5rem;
-}
-// scss-docs-end custom-popovers
-
-// Scrollspy demo on fixed height div
-.scrollspy-example {
-  height: 200px;
-  margin-top: .5rem;
-  overflow: auto;
-}
-
-.scrollspy-example-2 {
-  height: 350px;
-  overflow: auto;
-}
-
-.simple-list-example-scrollspy {
-  .active {
-    background-color: rgba(var(--cd-violet-rgb), .15);
-  }
-}
-
-.docs-example-border-utils {
-  [class^="border"] {
-    display: inline-block;
-    width: 5rem;
-    height: 5rem;
-    margin: .25rem;
-    background-color: var(--cui-tertiary-bg);
-  }
-}
-
-.docs-example-rounded-utils {
-  [class*="rounded"] {
-    margin: .25rem;
-  }
-}
-
-.docs-example-position-utils {
-  position: relative;
-  padding: 2rem;
-
-  .position-relative {
-    height: 200px;
-    background-color: var(--cui-tertiary-bg);
-  }
-
-  .position-absolute {
-    width: 2rem;
-    height: 2rem;
-    background-color: var(--cui-body-color);
-    @include border-radius();
-  }
-}
-
-.docs-example-position-examples {
-  &::after {
-    content: none;
-  }
-}
-
-// Placeholders
-.docs-example-placeholder-cards {
-  &::after {
-    display: none;
-  }
-
-  .card {
-    width: 18rem;
-  }
-}
-
-// Toasts
-.docs-example-toasts {
-  min-height: 240px;
-}
-
-.docs-example-zindex-levels {
-  min-height: 15rem;
-
-  > div {
-    color: var(--cui-body-bg);
-    background-color: var(--cd-violet);
-    border: 1px solid var(--cd-purple);
-
-    > span {
-      position: absolute;
-      right: 5px;
-      bottom: 0;
-    }
-  }
-
-  > :nth-child(2) {
-    top: 3rem;
-    left: 3rem;
-  }
-  > :nth-child(3) {
-    top: 4.5rem;
-    left: 4.5rem;
-  }
-  > :nth-child(4) {
-    top: 6rem;
-    left: 6rem;
-  }
-  > :nth-child(5) {
-    top: 7.5rem;
-    left: 7.5rem;
-  }
-}
-
-//
-// Code snippets
-//
-
-div[class^="language-"],
-.highlight {
-  position: relative;
-  padding: .75rem ($cd-gutter-x * .5);
-  margin: 0 ($cd-gutter-x * -.5) 1rem ($cd-gutter-x * -.5) ;
-  border: 1px solid var(--cui-border-color);
-  background-color: var(--cd-pre-bg);
-
-  @include media-breakpoint-up(md) {
-    padding: .75rem 1.25rem;
-    margin-right: 0;
-    margin-left: 0;
-    @include border-radius(var(--cui-border-radius));
-  }
-
-  pre {
-    padding: .25rem 0 .875rem;
-    margin-top: .8125rem;
-    margin-bottom: 0;
-    overflow: overlay;
-    white-space: pre;
-    background-color: transparent;
-    border: 0;
-  }
-
-  pre code {
-    @include font-size(inherit);
-    color: var(--cui-body-color); // Effectively the base text color
-    word-wrap: normal;
-  }
-}
-
-.docs-code-snippet {
-  margin: 0 ($cd-gutter-x * -.5) $spacer;
-
-  div[class^="language-"],
-  .highlight {
-    margin-bottom: 0;
-  }
-
-  .docs-example ~ div[class^="language-"],
-  .docs-example ~ .highlight {
-    border: 0;
-    @include border-top-radius(0);
-  }
-
-  .docs-example {
-    margin: 0;
-    border: 0;
-  }
-
-  @include media-breakpoint-up(md) {
-    margin-right: 0;
-    margin-left: 0;
-    @include border-radius($border-radius);
-  }
-}
-
-.highlight-toolbar {
-  background-color: var(--cd-pre-bg);
-}
-
-.docs-scss-docs {
-  .highlight-toolbar {
-    @include border-top-radius(calc(var(--cui-border-radius) + 1px));
-  }
-}
-
-.docs-example {
-  border-bottom-width: 0;
-}
-
-.docs-example + div[class^="language-"],
-.docs-example + .highlight {
-  border-top-width: 0;
-  @include border-top-radius(0);
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_footer.scss b/packages/docs/.vuepress/src/client/styles/_footer.scss
deleted file mode 100644
index 7544a17b..00000000
--- a/packages/docs/.vuepress/src/client/styles/_footer.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Footer
-//
-
-.footer {
-  --cui-footer-bg: var(--cui-tertiary-bg);
-  @include font-size(.875rem);
-
-  a {
-    color: var(--#{$prefix}tertiary-color);
-    text-decoration: none;
-
-    &:hover,
-    &:focus {
-      color: var(--cui-link-hover-color);
-      text-decoration: underline;
-    }
-  }
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_layout.scss b/packages/docs/.vuepress/src/client/styles/_layout.scss
deleted file mode 100644
index 2ee63995..00000000
--- a/packages/docs/.vuepress/src/client/styles/_layout.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-.wrapper {
-  width: 100%;
-  @include ltr-rtl("padding-left", var(--cui-sidebar-occupy-start, 0));
-  will-change: auto;
-  @include transition(padding .15s);
-
-  > .container-lg {
-    --cui-gutter-x: 3rem;
-  }
-}
-
-.docs-sidebar {
-  grid-area: sidebar;
-}
-
-.docs-main {
-  grid-area: main;
-
-  @include media-breakpoint-down(lg) {
-    max-width: 760px;
-    margin-inline: auto;
-  }
-
-  @include media-breakpoint-up(md) {
-    display: grid;
-    grid-template-areas:
-      "intro"
-      "toc"
-      "content";
-    grid-template-rows: auto auto 1fr;
-    gap: $grid-gutter-width;
-  }
-
-  @include media-breakpoint-up(lg) {
-    grid-template-areas:
-      "intro   toc"
-      "content toc";
-    grid-template-rows: auto 1fr;
-    grid-template-columns: 4fr 1fr;
-  }
-}
-
-.docs-intro {
-  grid-area: intro;
-}
-
-.docs-toc {
-  grid-area: toc;
-}
-
-.docs-content {
-  grid-area: content;
-  min-width: 1px; // Fix width when bd-content contains a `<pre>` https://github.com/twbs/bootstrap/issues/25410
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_prism.scss b/packages/docs/.vuepress/src/client/styles/_prism.scss
deleted file mode 100644
index 6145e4b6..00000000
--- a/packages/docs/.vuepress/src/client/styles/_prism.scss
+++ /dev/null
@@ -1,172 +0,0 @@
-/* PrismJS 1.24.1
-https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript */
-/**
- * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
- * Based on https://github.com/chriskempson/tomorrow-theme
- * @author Rose Pritchard
- */
-
-:root,
-[data-coreui-theme="light"] {
-  // --base00: #fff;
-  // --base01: #f5f5f5;
-  --base02: #c8c8fa;
-  --base03: #565c64;
-  --base04: #666;
-  --base05: #333;
-  --base06: #fff;
-  --base07: #{$teal-700}; // #9a6700
-  --base08: #{mix($red-500, $red-600, 50%)}; // #bc4c00
-  --base09: #{$cyan-700}; // #087990
-  --base0A: #{$purple-500}; // #795da3
-  --base0B: #{$blue-700}; // #183691
-  --base0C: #{$blue-700}; // #183691
-  --base0D: #{$purple-500}; // #795da3
-  --base0E: #{$pink-600}; // #a71d5d
-  --base0F: #333;
- }
-
-@include color-mode(dark, true) {
-  // --base00: #282c34;
-  // --base01: #353b45;
-  --base02: #3e4451;
-  --base03: #868e96;
-  --base04: #868e96;
-  --base05: #abb2bf;
-  --base06: #b6bdca;
-  --base07: #{$orange-300}; // #d19a66
-  --base08: #{$cyan-300};
-  --base09: #{$orange-300}; // #d19a66
-  --base0A: #{$yellow-200}; // #e5c07b
-  --base0B: #{$teal-300}; // #98c379
-  --base0C: #{$teal-300}; // #56b6c2
-  --base0D: #{$blue-300}; // #61afef
-  --base0E: #{$indigo-200}; // #c678dd
-  --base0F: #{$red-300}; // #be5046
-
-  .language-diff .gd {
-    color: $red-400;
-  }
-  .language-diff .gi {
-    color: $green-400;
-  }
-}
-
-code[class*='language-'],
-pre[class*='language-'] {
-  background: none;
-  font-family: var(--cui-font-monospace);
-  font-size: .875em;
-  text-align: left;
-  white-space: pre;
-
-  -moz-tab-size: 4;
-  -o-tab-size: 4;
-  tab-size: 4;
-
-  -webkit-hyphens: none;
-  -moz-hyphens: none;
-  -ms-hyphens: none;
-  hyphens: none;
-}
-
-pre[class*='language-']:not(.language-sass):not(.language-scss):not(.language-text):not(.language-css) {
-  overflow: scroll;
-  max-height: 500px;
-}
-
-.token.comment,
-.token.block-comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
-  color: var(--base03);
-}
-
-.token.tag {
-  color: var(--base08);
-}
-
-.token.attr-name,
-.token.namespace,
-.token.deleted {
-  color: var(--base0A);
-}
-
-.token.punctuation {
-  color: var(--base05);
-}
-
-.token.function-name {
-  color: var(--base0A); 
-}
-
-.token.boolean,
-.token.number,
-.token.function {
-  color: var(--base09);
-}
-
-.token.class-name,
-.token.maybe-class-name {
-  color: var(--base08);
-}
-
-.token.property,
-.token.constant,
-.token.symbol {
-  color: var(--base0A);
-}
-
-.token.selector,
-.token.important,
-.token.atrule,
-.token.keyword,
-.token.builtin {
-  color: var(--base0E);
-}
-
-.token.string,
-.token.char,
-.token.attr-value,
-.token.regex,
-.token.variable {
-  color: var(--base0C);
-}
-
-.token.operator,
-.token.entity,
-.token.url {
-  color: var(--base05);
-}
-
-.token.important,
-.token.bold {
-  font-weight: bold;
-}
-.token.italic {
-  font-style: italic;
-}
-
-.token.entity {
-  cursor: help;
-}
-
-.token.inserted {
-  color: green;
-}
-
-.language-bash,
-.language-sh {
-  .token-line::before {
-    color: var(--base03);
-    content: "$ ";
-    user-select: none;
-  }
-}
-
-.language-powershell::before {
-  color: var(--base0C);
-  content: "PM> ";
-  user-select: none;
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/styles/_scrolling.scss b/packages/docs/.vuepress/src/client/styles/_scrolling.scss
deleted file mode 100644
index 20179600..00000000
--- a/packages/docs/.vuepress/src/client/styles/_scrolling.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-// When navigating with the keyboard, prevent focus from landing behind the sticky header
-
-main {
-  a,
-  button,
-  h2,
-  h3,
-  h4,
-  [tabindex="0"] {
-    scroll-margin-top: 80px;
-    scroll-margin-bottom: 100px;
-  }
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_search.scss b/packages/docs/.vuepress/src/client/styles/_search.scss
deleted file mode 100644
index c487e640..00000000
--- a/packages/docs/.vuepress/src/client/styles/_search.scss
+++ /dev/null
@@ -1,152 +0,0 @@
-// stylelint-disable selector-class-pattern
-
-:root {
-  --docsearch-primary-color: var(--cui-primary);
-  --docsearch-logo-color: var(--cui-primary);
-}
-
-@include color-mode(dark, true) {
-  // From here, the values are copied from https://cdn.jsdelivr.net/npm/@docsearch/css@3
-  // in html[data-theme="dark"] selector
-  // and are slightly modified for formatting purpose
-  --docsearch-text-color: #f5f6f7;
-  --docsearch-container-background: rgba(9, 10, 17, .8);
-  --docsearch-modal-background: #15172a;
-  --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;
-  --docsearch-searchbox-background: #090a11;
-  --docsearch-searchbox-focus-background: #000;
-  --docsearch-hit-color: #bec3c9;
-  --docsearch-hit-shadow: none;
-  --docsearch-hit-background: #090a11;
-  --docsearch-key-gradient: linear-gradient(-26.5deg, #565872, #31355b);
-  --docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);
-  --docsearch-footer-background: #1e2136;
-  --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2);
-  --docsearch-muted-color: #7f8497;
-}
-
-.DocSearch-Container {
-  --docsearch-muted-color: var(--cui-secondary-color);
-  --docsearch-hit-shadow: none;
-
-  z-index: 2000; // Make sure to be over all components showcased in the documentation
-  cursor: auto; // Needed because of [role="button"] in Algolia search modal. Remove once https://github.com/algolia/docsearch/issues/1370 is tackled.
-
-  @include media-breakpoint-up(lg) {
-    padding-top: 4rem;
-  }
-}
-
-.DocSearch-Button {
-  --docsearch-searchbox-background: #{rgba($black, .1)};
-  // --docsearch-searchbox-color: #{$white};
-  --docsearch-searchbox-focus-background: #{rgba($black, .25)};
-  // --docsearch-searchbox-shadow: #{0 0 0 .25rem rgba($bd-accent, .4)};
-  // --docsearch-text-color: #{$white};
-  // --docsearch-muted-color: #{rgba($white, .65)};
-
-  min-width: 200px;
-  min-height: 38px;
-  font-family: $input-font-family;
-  font-weight: $input-font-weight;
-  line-height: $input-line-height;
-  @include font-size($input-font-size);
-  color: $input-color;
-  background-color: $input-bg;
-  background-clip: padding-box;
-  border: $input-border-width solid $input-border-color;
-
-  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
-  @include border-radius($btn-border-radius);
-
-  @include box-shadow($input-box-shadow);
-  @include transition($input-transition);
-
-  &:focus {
-    color: $input-focus-color;
-    background-color: $input-focus-bg;
-    border-color: $input-focus-border-color;
-    outline: 0;
-    @if $enable-shadows {
-      @include box-shadow($input-box-shadow, $input-focus-box-shadow);
-    } @else {
-      // Avoid using mixin so we can pass custom focus shadow properly
-      box-shadow: $input-focus-box-shadow;
-    }
-  }
-
-  &:hover:not(:disabled):not([readonly])::file-selector-button {
-    background-color: $form-file-button-hover-bg;
-  }
-
-  .DocSearch-Search-Icon {
-    opacity: .65;
-  }
-}
-
-
-.DocSearch-Button-Keys {
-  min-width: 0;
-  padding: 0 .25rem;
-  background: rgba($black, .125);
-  @include border-radius(.25rem);
-}
-
-.DocSearch-Button-Key {
-  top: 0;
-  width: auto;
-  height: 1.5rem;
-  padding: 0 .125rem;
-  margin-right: 0;
-  font-size: .875rem;
-  background: none;
-  box-shadow: none;
-}
-
-.DocSearch-Commands-Key {
-  padding-left: 1px;
-  font-size: .875rem;
-  background-color: rgba($black, .1);
-  background-image: none;
-  box-shadow: none;
-}
-
-.DocSearch-Form {
-  @include border-radius(var(--cui-border-radius));
-}
-
-.DocSearch-Hits {
-  mark {
-    padding: 0;
-  }
-}
-
-.DocSearch-Hit {
-  padding-bottom: 0;
-  @include border-radius(0);
-
-  a {
-    @include border-radius(0);
-    border: solid var(--cui-border-color);
-    border-width: 0 1px 1px;
-  }
-
-  &:first-child a {
-    @include border-top-radius(var(--cui-border-radius));
-    border-top-width: 1px;
-  }
-  &:last-child a {
-    @include border-bottom-radius(var(--cui-border-radius));
-  }
-}
-
-.DocSearch-Hit-icon {
-  display: flex;
-  align-items: center;
-}
-
-// Fix --docsearch-logo-color that doesn't do anything
-.DocSearch-Logo svg .cls-1,
-.DocSearch-Logo svg .cls-2 {
-  fill: var(--docsearch-logo-color);
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_sidebar.scss b/packages/docs/.vuepress/src/client/styles/_sidebar.scss
deleted file mode 100755
index 3e2482fa..00000000
--- a/packages/docs/.vuepress/src/client/styles/_sidebar.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-.sidebar.docs-sidebar {
-  --cui-sidebar-bg: var(--cui-tertiary-bg);
-  --cui-sidebar-brand-bg: transparent;
-  --cui-sidebar-brand-color: var(--cui-body-color);
-
-  .sidebar-nav {
-    --cui-sidebar-nav-link-color: var(--cui-body-color);
-    --cui-sidebar-nav-link-active-bg: transparent;
-    --cui-sidebar-nav-link-active-color: var(--cui-primary);
-    --cui-sidebar-nav-link-hover-bg: transparent;
-    --cui-sidebar-nav-link-hover-color: var(--cui-primary);
-    --cui-sidebar-nav-link-icon-margin: 1rem;
-    --cui-sidebar-nav-group-bg: transparent;
-    --cui-sidebar-nav-group-toggle-show-color: var(--cui-primary);
-
-    .compact .nav-link {
-      --cui-sidebar-nav-link-padding-y: .375rem;
-    }
-
-    .nav-group-items {
-      --cui-sidebar-nav-link-color: var(--cui-body-color);
-    }
-  }
-}
-
-@if $enable-dark-mode {
-  @include color-mode(dark) {
-    .docs-sidebar {
-      --cui-sidebar-bg: var(--cui-body-bg);
-    }
-  }
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_table-api.scss b/packages/docs/.vuepress/src/client/styles/_table-api.scss
deleted file mode 100644
index 43d33928..00000000
--- a/packages/docs/.vuepress/src/client/styles/_table-api.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-.table-api {
-  --cui-table-striped-bg: #{rgba(#f0f4f7, .25)} !important;
-  tr td {
-    padding-top: 1rem;
-    padding-bottom: 1rem;
-  }
-  td:first-child,
-  th:first-child {
-    width: 15%;
-    padding-left: 1rem;
-  }
-  td:first-child {
-    white-space: nowrap;
-  }
-  td:nth-child(2n) {
-    width: 55%;
-  }
-  td:nth-child(3n) {
-    width: 10%;
-  }
-  td:nth-child(4n) {
-    width: 10%;
-  }
-  td:nth-child(5n) {
-    width: 10%;
-  }
-
-  & + h3 {
-    margin-top: 2rem;
-  }
-}
-
-.markdown + h3 {
-  margin-top: 3rem;
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/styles/_toc.scss b/packages/docs/.vuepress/src/client/styles/_toc.scss
deleted file mode 100644
index 8f6dc04d..00000000
--- a/packages/docs/.vuepress/src/client/styles/_toc.scss
+++ /dev/null
@@ -1,87 +0,0 @@
-// stylelint-disable selector-max-type
-
-.docs-toc {
-  @include media-breakpoint-up(lg) {
-    position: sticky;
-    top: 5rem;
-    right: 0;
-    z-index: 2;
-    height: subtract(100vh, 7rem);
-    overflow-y: auto;
-  }
-
-  nav {
-    @include font-size(.875rem);
-
-    ul {
-      padding-left: 0;
-      list-style: none;
-
-      ul {
-        padding-left: 1rem;
-        margin-top: .25rem;
-      }
-    }
-
-    li {
-      margin-bottom: .25rem;
-    }
-
-    a {
-      color: inherit;
-
-      &:not(:hover) {
-        text-decoration: none;
-      }
-
-      code {
-        font: inherit;
-      }
-    }
-  }
-}
-
-.docs-toc-toggle {
-  display: flex;
-  align-items: center;
-
-  @include media-breakpoint-down(sm) {
-    justify-content: space-between;
-    width: 100%;
-  }
-
-  @include media-breakpoint-down(md) {
-    color: var(--cui-body-color);
-    border: 1px solid var(--cui-border-color);
-    @include border-radius(var(--cui-border-radius));
-
-    &:hover,
-    &:focus,
-    &:active,
-    &[aria-expanded="true"] {
-      color: var(--cui-primary);
-      background-color: var(--cui-body-bg);
-      border-color: var(--cui-primary);
-    }
-
-    &:focus,
-    &[aria-expanded="true"] {
-      box-shadow: 0 0 0 3px rgba(var(--cui-primary-rgb), .25);
-    }
-  }
-}
-
-.docs-toc-collapse {
-  @include media-breakpoint-down(md) {
-    nav {
-      padding: 1.25rem 1.25rem 1.25rem 1rem;
-      background-color: var(--cui-tertiary-bg);
-      border: 1px solid var(--cui-border-color);
-      @include border-radius(var(--cui-border-radius));
-    }
-  }
-
-  @include media-breakpoint-up(md) {
-    display: block !important; // stylelint-disable-line declaration-no-important
-  }
-}
diff --git a/packages/docs/.vuepress/src/client/styles/_variables.scss b/packages/docs/.vuepress/src/client/styles/_variables.scss
deleted file mode 100755
index b53b7754..00000000
--- a/packages/docs/.vuepress/src/client/styles/_variables.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-// stylelint-disable scss/dollar-variable-default
-
-// Local docs variables
-$cd-purple:        #4c0bce;
-$cd-violet:        lighten(saturate($cd-purple, 5%), 15%); // stylelint-disable-line function-disallowed-list
-$cd-accent:       #ffe484;
-
-$cd-gutter-x: 3rem;
-$cd-callout-variants: info, warning, danger !default;
-
-:root {
-  --cd-purple: #{$cd-purple};
-  --cd-violet: #{$cd-violet};
-  --cd-accent: #{$cd-accent};
-  --cd-violet-rgb: #{to-rgb($cd-violet)};
-  --cd-accent-rgb: #{to-rgb($cd-accent)};
-  --cd-pink-rgb: #{to-rgb($pink-500)};
-  --cd-teal-rgb: #{to-rgb($teal-500)};
-  --cd-violet-bg: var(--cd-violet);
-  --cd-toc-color: var(--cd-violet);
-  --cd-sidebar-link-bg: rgba(var(--cd-violet-rgb), .1);
-  --cd-callout-link: #{to-rgb($blue-600)};
-  --cd-callout-code-color: #{$pink-600};
-  --cd-pre-bg: var(--cui-tertiary-bg);
-}
diff --git a/packages/docs/.vuepress/src/client/styles/custom-container.scss b/packages/docs/.vuepress/src/client/styles/custom-container.scss
deleted file mode 100755
index 1985517d..00000000
--- a/packages/docs/.vuepress/src/client/styles/custom-container.scss
+++ /dev/null
@@ -1,83 +0,0 @@
-.custom-container {
-  .custom-container-title {
-    font-weight: 600;
-    margin-bottom: -0.4rem;
-  }
-
-  &.tip,
-  &.warning,
-  &.danger {
-    padding: 0.1rem 1.5rem;
-    border-left-width: 0.5rem;
-    border-left-style: solid;
-    margin: 1rem 0;
-  }
-
-  &.tip {
-    border-color: var(--c-tip);
-    background-color: var(--c-tip-bg);
-    color: var(--c-tip-text);
-
-    .custom-container-title {
-      color: var(--c-tip-title);
-    }
-
-    a {
-      color: var(--c-tip-text-accent);
-    }
-  }
-
-  &.warning {
-    border-color: var(--c-warning);
-    background-color: var(--c-warning-bg);
-    color: var(--c-warning-text);
-
-    .custom-container-title {
-      color: var(--c-warning-title);
-    }
-
-    a {
-      color: var(--c-warning-text-accent);
-    }
-  }
-
-  &.danger {
-    border-color: var(--c-danger);
-    background-color: var(--c-danger-bg);
-    color: var(--c-danger-text);
-
-    .custom-container-title {
-      color: var(--c-danger-title);
-    }
-
-    a {
-      color: var(--c-danger-text-accent);
-    }
-  }
-
-  &.details {
-    display: block;
-    position: relative;
-    border-radius: 2px;
-    margin: 1.6em 0;
-    padding: 1.6em;
-    background-color: var(--c-details-bg);
-
-    h4 {
-      margin-top: 0;
-    }
-
-    figure,
-    p {
-      &:last-child {
-        margin-bottom: 0;
-        padding-bottom: 0;
-      }
-    }
-
-    summary {
-      outline: none;
-      cursor: pointer;
-    }
-  }
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/client/styles/index.scss b/packages/docs/.vuepress/src/client/styles/index.scss
deleted file mode 100755
index ea3615e4..00000000
--- a/packages/docs/.vuepress/src/client/styles/index.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-@import "@coreui/coreui/scss/coreui.scss";
-@import "@docsearch/css/dist/style.css";
-
-@import "variables";
-
-@import "ads";
-@import "anchor";
-@import "callouts";
-@import "component-examples";
-@import "footer";
-@import "layout";
-@import "prism";
-@import "scrolling";
-@import "search";
-@import "sidebar";
-@import "table-api";
-@import "toc";
-@import "custom-container";
-
-.back-to-top {
---c-brand: #3eaf7c;
---c-brand-light: #4abf8a;
---back-to-top-color: var(--c-brand);
---back-to-top-color-hover: var(--c-brand-light);
-}
\ No newline at end of file
diff --git a/packages/docs/.vuepress/src/node/defaultTheme.ts b/packages/docs/.vuepress/src/node/defaultTheme.ts
deleted file mode 100755
index 0fe8ca5f..00000000
--- a/packages/docs/.vuepress/src/node/defaultTheme.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import type { Page, Theme } from '@vuepress/core'
-
-import { themeDataPlugin } from '@vuepress/plugin-theme-data'
-import { fs, getDirname, path } from '@vuepress/utils'
-import type {
-  DefaultThemeLocaleOptions,
-  DefaultThemePageData,
-  DefaultThemePluginsOptions,
-} from '../shared'
-import { assignDefaultLocaleOptions } from './utils'
-
-const __dirname = getDirname(import.meta.url)
-
-export interface DefaultThemeOptions extends DefaultThemeLocaleOptions {
-  /**
-   * To avoid confusion with the root `plugins` option,
-   * we use `themePlugins`
-   */
-  themePlugins?: DefaultThemePluginsOptions
-}
-export const defaultTheme = ({
-  themePlugins = {},
-  ...localeOptions
-}: DefaultThemeOptions = {}): Theme => {
-  assignDefaultLocaleOptions(localeOptions)
-
-  return {
-    name: '@vuepress/coreui-docs-theme',
-
-    templateBuild: path.resolve(__dirname, '../templates/build.html'),
-
-    clientConfigFile: path.resolve(__dirname, '../client/config.ts'),
-
-    extendsPage: (page: Page<Partial<DefaultThemePageData>>) => {
-      // save relative file path into page data to generate edit link
-      page.data.filePathRelative = page.filePathRelative
-      // save title into route meta to generate navbar and sidebar
-      page.routeMeta.title = page.title
-    },
-
-    plugins: [themeDataPlugin({ themeData: localeOptions })],
-  }
-}
diff --git a/packages/docs/.vuepress/src/node/index.ts b/packages/docs/.vuepress/src/node/index.ts
deleted file mode 100755
index 1c089073..00000000
--- a/packages/docs/.vuepress/src/node/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defaultTheme } from './defaultTheme'
-
-export * from '../shared'
-export * from './defaultTheme'
-export * from './utils'
-
-export default defaultTheme
diff --git a/packages/docs/.vuepress/src/node/utils/assignDefaultLocaleOptions.ts b/packages/docs/.vuepress/src/node/utils/assignDefaultLocaleOptions.ts
deleted file mode 100755
index 0268e061..00000000
--- a/packages/docs/.vuepress/src/node/utils/assignDefaultLocaleOptions.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import type {
-  DefaultThemeLocaleOptions,
-  DefaultThemeLocaleData,
-} from '../../shared'
-
-const defaultLocaleOptions: DefaultThemeLocaleOptions = {
-  // navbar
-  navbar: [],
-  logo: null,
-  darkMode: true,
-  repo: null,
-  selectLanguageText: 'Languages',
-  selectLanguageAriaLabel: 'Select language',
-
-  // sidebar
-  sidebar: 'auto',
-  sidebarDepth: 2,
-
-  // page meta
-  editLink: true,
-  editLinkText: 'Edit this page',
-  lastUpdated: true,
-  lastUpdatedText: 'Last Updated',
-  contributors: true,
-  contributorsText: 'Contributors',
-
-  // 404 page messages
-  notFound: [
-    `There's nothing here.`,
-    `How did we get here?`,
-    `That's a Four-Oh-Four.`,
-    `Looks like we've got some broken links.`,
-  ],
-  backToHome: 'Take me home',
-
-  // a11y
-  openInNewWindow: 'open in new window',
-  toggleDarkMode: 'toggle dark mode',
-}
-
-const defaultLocaleData: DefaultThemeLocaleData = {
-  // navbar
-  selectLanguageName: 'English',
-}
-
-/**
- * Assign default options to `themeConfig`
- */
-export const assignDefaultLocaleOptions = (
-  localeOptions: DefaultThemeLocaleOptions
-): void => {
-  if (!localeOptions.locales) {
-    localeOptions.locales = {}
-  }
-
-  if (!localeOptions.locales['/']) {
-    localeOptions.locales['/'] = {}
-  }
-
-  Object.assign(localeOptions, {
-    ...defaultLocaleOptions,
-    ...localeOptions,
-  })
-
-  Object.assign(localeOptions.locales['/'], {
-    ...defaultLocaleData,
-    ...localeOptions.locales['/'],
-  })
-}
diff --git a/packages/docs/.vuepress/src/node/utils/index.ts b/packages/docs/.vuepress/src/node/utils/index.ts
deleted file mode 100755
index 8f378cef..00000000
--- a/packages/docs/.vuepress/src/node/utils/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './assignDefaultLocaleOptions'
diff --git a/packages/docs/.vuepress/src/shared/index.ts b/packages/docs/.vuepress/src/shared/index.ts
deleted file mode 100755
index 4a0c5b08..00000000
--- a/packages/docs/.vuepress/src/shared/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './nav'
-export * from './options'
-export * from './page'
diff --git a/packages/docs/.vuepress/src/shared/nav.ts b/packages/docs/.vuepress/src/shared/nav.ts
deleted file mode 100755
index 153eabdc..00000000
--- a/packages/docs/.vuepress/src/shared/nav.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Base nav item, displayed as text
- */
-
-type Badge = {
-  color: string,
-  text: string
-}
-export interface NavItem {
-  badge?: Badge
-  disabled?: boolean
-  icon?: string
-  text: string
-  ariaLabel?: string
-}
-
-/**
- * Base nav group, has nav items children
- */
-export interface NavGroup<T> extends NavItem {
-  children: T[]
-}
-
-/**
- * Props for `<NavLink>`
- */
-export interface NavLink extends NavItem {
-  link: string
-  rel?: string
-  target?: string
-  activeMatch?: string
-}
-
-/**
- * Navbar types
- */
-// user config
-export type NavbarItem = NavLink
-export type NavbarGroup = NavGroup<NavbarGroup | NavbarItem | string>
-export type NavbarConfig = (NavbarItem | NavbarGroup | string)[]
-// resolved
-export type ResolvedNavbarItem = NavbarItem | NavGroup<ResolvedNavbarItem>
-
-/**
- * Sidebar types
- */
-// user config
-export type SidebarItem = NavItem &
-  Partial<NavLink> &
-  Partial<Pick<NavGroup<NavLink | SidebarItem | string>, 'children'>>
-export type SidebarConfigArray = (SidebarItem | string)[]
-export type SidebarConfigObject = Record<string, SidebarConfigArray>
-export type SidebarConfig = SidebarConfigArray | SidebarConfigObject
-// resolved
-export type ResolvedSidebarItem = NavItem &
-  Partial<NavLink> &
-  Partial<Pick<NavGroup<ResolvedSidebarItem>, 'children'>>
diff --git a/packages/docs/.vuepress/src/shared/options.ts b/packages/docs/.vuepress/src/shared/options.ts
deleted file mode 100755
index c8709f91..00000000
--- a/packages/docs/.vuepress/src/shared/options.ts
+++ /dev/null
@@ -1,260 +0,0 @@
-import type { LocaleData } from '@vuepress/shared'
-import type { ThemeData } from '@vuepress/plugin-theme-data'
-import type { NavbarConfig, SidebarConfig } from './nav'
-
-export interface DefaultThemePluginsOptions {
-  /**
-   * Enable @vuepress/plugin-active-header-links or not
-   */
-  activeHeaderLinks?: boolean
-
-  /**
-   * Enable @vuepress/plugin-back-to-top or not
-   */
-  backToTop?: boolean
-
-  /**
-   * Enable @vuepress/plugin-container or not
-   */
-  container?: {
-    tip?: boolean
-    warning?: boolean
-    danger?: boolean
-    details?: boolean
-    codeGroup?: boolean
-    codeGroupItem?: boolean
-  }
-
-  /**
-   * Enable @vuepress/plugin-git or not
-   */
-  git?: boolean
-
-  /**
-   * Enable @vuepress/plugin-medium-zoom or not
-   */
-  mediumZoom?: boolean
-
-  /**
-   * Enable @vuepress/plugin-nprogress or not
-   */
-  nprogress?: boolean
-
-  /**
-   * Enable @vuepress/plugin-prismjs or not
-   */
-  prismjs?: boolean
-}
-
-export type DefaultThemeLocaleOptions = DefaultThemeData
-
-export type DefaultThemeData = ThemeData<DefaultThemeLocaleData>
-
-export interface DefaultThemeLocaleData extends LocaleData {
-  /**
-   * Home path of current locale
-   *
-   * Used as the link of back-to-home and navbar logo
-   */
-  home?: string
-
-  /**
-   * Navbar config
-   *
-   * Set to `false` to disable navbar in current locale
-   */
-  navbar?: false | NavbarConfig
-
-  /**
-   * Navbar logo config
-   *
-   * Logo to display in navbar
-   */
-  logo?: null | string
-
-  /**
-   * Navbar dark mode button config
-   *
-   * Enable dark mode switching and display a button in navbar or not
-   */
-  darkMode?: boolean
-
-  /**
-   * Navbar repository config
-   *
-   * Used for the repository link of navbar
-   */
-  repo?: null | string
-
-  /**
-   * Navbar repository config
-   *
-   * Used for the repository text of navbar
-   */
-  repoLabel?: string
-
-  /**
-   * Navbar language selection config
-   *
-   * Text of the language selection dropdown
-   */
-  selectLanguageText?: string
-
-  /**
-   * Navbar language selection config
-   *
-   * Aria label of of the language selection dropdown
-   */
-  selectLanguageAriaLabel?: string
-
-  /**
-   * Navbar language selection config
-   *
-   * Language name of current locale
-   *
-   * Displayed inside the language selection dropdown
-   */
-  selectLanguageName?: string
-
-  /**
-   * Sidebar config
-   *
-   * Set to `false` to disable sidebar in current locale
-   */
-  sidebar?: 'auto' | false | SidebarConfig
-
-  /**
-   * Sidebar depth
-   *
-   * - Set to `0` to disable all levels
-   * - Set to `1` to include `<h2>`
-   * - Set to `2` to include `<h2>` and `<h3>`
-   * - ...
-   *
-   * The max value depends on which headers you have extracted
-   * via `markdown.extractHeaders.level`.
-   *
-   * The default value of `markdown.extractHeaders.level` is `[2, 3]`,
-   * so the default max value of `sidebarDepth` is `2`
-   */
-  sidebarDepth?: number
-
-  /**
-   * Page meta - edit link config
-   *
-   * Whether to show "Edit this page" or not
-   */
-  editLink?: boolean
-
-  /**
-   * Page meta - edit link config
-   *
-   * The text to replace the default "Edit this page"
-   */
-  editLinkText?: string
-
-  /**
-   * Page meta - edit link config
-   *
-   * Pattern of edit link
-   *
-   * @example ':repo/edit/:branch/:path'
-   */
-  editLinkPattern?: string
-
-  /**
-   * Page meta - edit link config
-   *
-   * Use `repo` config by default
-   *
-   * Set this config if your docs is placed in a different repo
-   */
-  docsRepo?: string
-
-  /**
-   * Page meta - edit link config
-   *
-   * Set this config if the branch of your docs is not 'main'
-   */
-  docsBranch?: string
-
-  /**
-   * Page meta - edit link config
-   *
-   * Set this config if your docs is placed in sub dir of your `docsRepo`
-   */
-  docsDir?: string
-
-  /**
-   * Page meta - last updated config
-   *
-   * Whether to show "Last Updated" or not
-   */
-  lastUpdated?: boolean
-
-  /**
-   * Page meta - last updated config
-   *
-   * The text to replace the default "Last Updated"
-   */
-  lastUpdatedText?: string
-
-  /**
-   * Page meta - contributors config
-   *
-   * Whether to show "Contributors" or not
-   */
-  contributors?: boolean
-
-  /**
-   * Page meta - contributors config
-   *
-   * The text to replace the default "Contributors"
-   */
-  contributorsText?: string
-
-  /**
-   * Custom block config
-   *
-   * Default title of TIP custom block
-   */
-  tip?: string
-
-  /**
-   * Custom block config
-   *
-   * Default title of WARNING custom block
-   */
-  warning?: string
-
-  /**
-   * Custom block config
-   *
-   * Default title of DANGER custom block
-   */
-  danger?: string
-
-  /**
-   * 404 page config
-   *
-   * Not Found messages for 404 page
-   */
-  notFound?: string[]
-
-  /**
-   * 404 page config
-   *
-   * Text of back-to-home link in 404 page
-   */
-  backToHome?: string
-
-  /**
-   * A11y text for `<OutboundLink>`
-   */
-  openInNewWindow?: string
-
-  /**
-   * A11y text for dark mode toggle button
-   */
-  toggleDarkMode?: string
-}
diff --git a/packages/docs/.vuepress/src/shared/page.ts b/packages/docs/.vuepress/src/shared/page.ts
deleted file mode 100755
index 40007b84..00000000
--- a/packages/docs/.vuepress/src/shared/page.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { GitPluginPageData } from '@vuepress/plugin-git'
-import type { NavLink, SidebarConfig } from './nav'
-
-export interface DefaultThemePageData extends GitPluginPageData {
-  filePathRelative: string
-}
-
-export interface DefaultThemePageFrontmatter {
-  home?: boolean
-  navbar?: boolean
-  pageClass?: string
-  name?: string
-  preview_component?: boolean
-  pro_component?: boolean
-  other_frameworks?: string
-}
-
-export interface DefaultThemeNormalPageFrontmatter extends DefaultThemePageFrontmatter {
-  home?: false
-  editLink?: boolean
-  lastUpdated?: boolean
-  contributors?: boolean
-  sidebar?: 'auto' | false | SidebarConfig
-  sidebarDepth?: number
-  prev?: string | NavLink
-  next?: string | NavLink
-}
diff --git a/packages/docs/.vuepress/src/templates/build.html b/packages/docs/.vuepress/src/templates/build.html
deleted file mode 100644
index 8198c3ac..00000000
--- a/packages/docs/.vuepress/src/templates/build.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html lang="{{ lang }}">
-  <head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width,initial-scale=1" />
-    <meta name="generator" content="VuePress {{ version }}" />
-    <script>
-      const userMode = localStorage.getItem('coreui-vue-docs-theme')
-      const systemDarkMode =
-        window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
-      if (userMode === 'dark' || (userMode !== 'light' && systemDarkMode)) {
-        document.documentElement.dataset.coreuiTheme = 'dark'
-      }
-    </script>
-    <!--vuepress-ssr-head-->
-    <!--vuepress-ssr-styles-->
-    <!--vuepress-ssr-resources-->
-  </head>
-  <body>
-    <!-- Google Tag Manager (noscript) -->
-    <noscript
-      ><iframe
-        src="https://www.googletagmanager.com/ns.html?id=GTM-KX4JH47"
-        height="0"
-        width="0"
-        style="display: none; visibility: hidden"
-      ></iframe
-    ></noscript>
-    <!-- End Google Tag Manager (noscript) -->
-    <div id="app"><!--vuepress-ssr-app--></div>
-    <!--vuepress-ssr-scripts-->
-  </body>
-</html>
diff --git a/packages/docs/api/CChart.api.md b/packages/docs/api/CChart.api.md
deleted file mode 100644
index e997de50..00000000
--- a/packages/docs/api/CChart.api.md
+++ /dev/null
@@ -1,30 +0,0 @@
-### CChart
-
-```jsx
-import { CChart } from '@coreui/vue-chartjs'
-// or
-import CChart from '@coreui/vue-chartjs/src/CChart'
-```
-
-#### Props
-
-| Prop name           | Description                                                                                                                                               | Type                                                    | Values | Default |
-| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------ | ------- |
-| **custom-tooltips** | Enables custom html based tooltips instead of standard tooltips.<br/>`@default` true                                                                      | boolean                                                 | -      | true    |
-| **data**            | The data object that is passed into the Chart.js chart (more info).                                                                                       | ChartData \| ((canvas: HTMLCanvasElement) => ChartData) | -      | -       |
-| **height**          | Height attribute applied to the rendered canvas.<br/>`@default` 150                                                                                       | number                                                  | -      | 150     |
-| **id**              | ID attribute applied to the rendered canvas.                                                                                                              | string                                                  | -      | -       |
-| **options**         | The options object that is passed into the Chart.js chartRef.value.<br><br>{@link https://www.chartjs.org/docs/latest/general/options.html More Info}     | ChartOptions                                            | -      | -       |
-| **plugins**         | The plugins array that is passed into the Chart.js chart (more info)<br><br>{@link https://www.chartjs.org/docs/latest/developers/plugins.html More Info} | Plugin[]                                                | -      | -       |
-| **redraw**          | If true, will tear down and redraw chart on all updates.                                                                                                  | boolean                                                 | -      | -       |
-| **type**            | Chart.js chart type.<br/>`@type` 'line' \| 'bar' \| 'radar' \| 'doughnut' \| 'polarArea' \| 'bubble' \| 'pie' \| 'scatter'                                | ChartType                                               | -      | 'bar'   |
-| **width**           | Width attribute applied to the rendered canvas.<br/>`@default` 300                                                                                        | number                                                  | -      | 300     |
-| **wrapper**         | Put the chart into the wrapper div element.<br/>`@default` true                                                                                           | boolean                                                 | -      | true    |
-
-#### Events
-
-| Event name                | Description                                                                                 | Properties |
-| ------------------------- | ------------------------------------------------------------------------------------------- | ---------- |
-| **get-dataset-at-event**  | Proxy for Chart.js getDatasetAtEvent. Calls with dataset and triggering event.              |
-| **get-element-at-event**  | Proxy for Chart.js getElementAtEvent. Calls with single element array and triggering event. |
-| **get-elements-at-event** | Proxy for Chart.js getElementsAtEvent. Calls with element array and triggering event.       |
diff --git a/packages/docs/api/accordion/CAccordion.api.md b/packages/docs/api/accordion/CAccordion.api.md
deleted file mode 100644
index 4c30183a..00000000
--- a/packages/docs/api/accordion/CAccordion.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CAccordion
-
-```jsx
-import { CAccordion } from '@coreui/vue'
-// or
-import CAccordion from '@coreui/vue/src/components/accordion/CAccordion'
-```
-
-#### Props
-
-| Prop name           | Description                                                                                                                                 | Type           | Values | Default |
-| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ------ | ------- |
-| **active-item-key** | The active item key.                                                                                                                        | number\|string | -      | -       |
-| **always-open**     | Make accordion items stay open when another item is opened                                                                                  | boolean        | -      | -       |
-| **flush**           | Removes the default background-color, some borders, and some rounded corners to render accordions edge-to-edge with their parent container. | boolean        | -      | -       |
diff --git a/packages/docs/api/accordion/CAccordionBody.api.md b/packages/docs/api/accordion/CAccordionBody.api.md
deleted file mode 100644
index a7ff4651..00000000
--- a/packages/docs/api/accordion/CAccordionBody.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CAccordionBody
-
-```jsx
-import { CAccordionBody } from '@coreui/vue'
-// or
-import CAccordionBody from '@coreui/vue/src/components/accordion/CAccordionBody'
-```
diff --git a/packages/docs/api/accordion/CAccordionButton.api.md b/packages/docs/api/accordion/CAccordionButton.api.md
deleted file mode 100644
index 873e8a2a..00000000
--- a/packages/docs/api/accordion/CAccordionButton.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CAccordionButton
-
-```jsx
-import { CAccordionButton } from '@coreui/vue'
-// or
-import CAccordionButton from '@coreui/vue/src/components/accordion/CAccordionButton'
-```
diff --git a/packages/docs/api/accordion/CAccordionHeader.api.md b/packages/docs/api/accordion/CAccordionHeader.api.md
deleted file mode 100644
index 844ac370..00000000
--- a/packages/docs/api/accordion/CAccordionHeader.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CAccordionHeader
-
-```jsx
-import { CAccordionHeader } from '@coreui/vue'
-// or
-import CAccordionHeader from '@coreui/vue/src/components/accordion/CAccordionHeader'
-```
diff --git a/packages/docs/api/accordion/CAccordionItem.api.md b/packages/docs/api/accordion/CAccordionItem.api.md
deleted file mode 100644
index 3e07d5aa..00000000
--- a/packages/docs/api/accordion/CAccordionItem.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CAccordionItem
-
-```jsx
-import { CAccordionItem } from '@coreui/vue'
-// or
-import CAccordionItem from '@coreui/vue/src/components/accordion/CAccordionItem'
-```
-
-#### Props
-
-| Prop name    | Description                                                                                   | Type           | Values | Default |
-| ------------ | --------------------------------------------------------------------------------------------- | -------------- | ------ | ------- |
-| **id**       | The id global attribute defines an identifier (ID) that must be unique in the whole document. | string         | -      | -       |
-| **item-key** | The item key.                                                                                 | number\|string | -      | -       |
diff --git a/packages/docs/api/alert/CAlert.api.md b/packages/docs/api/alert/CAlert.api.md
deleted file mode 100644
index 140f73d1..00000000
--- a/packages/docs/api/alert/CAlert.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CAlert
-
-```jsx
-import { CAlert } from '@coreui/vue'
-// or
-import CAlert from '@coreui/vue/src/components/alert/CAlert'
-```
-
-#### Props
-
-| Prop name       | Description                                                               | Type    | Values                                                                                          | Default |
-| --------------- | ------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------- | ------- |
-| **color**       | Sets the color context of the component to one of CoreUI’s themed colors. | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **dismissible** | Optionally add a close button to alert and allow it to self dismisss.     | boolean | -                                                                                               | -       |
-| **variant**     | Set the alert variant to a solid.                                         | string  | `'solid'`                                                                                       | -       |
-| **visible**     | Toggle the visibility of alert component.                                 | boolean | -                                                                                               | true    |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **close**  | Callback fired when the component requests to be closed. |
diff --git a/packages/docs/api/alert/CAlertHeading.api.md b/packages/docs/api/alert/CAlertHeading.api.md
deleted file mode 100644
index da1acd2d..00000000
--- a/packages/docs/api/alert/CAlertHeading.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CAlertHeading
-
-```jsx
-import { CAlertHeading } from '@coreui/vue'
-// or
-import CAlertHeading from '@coreui/vue/src/components/alert/CAlertHeading'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'h4'    |
diff --git a/packages/docs/api/alert/CAlertLink.api.md b/packages/docs/api/alert/CAlertLink.api.md
deleted file mode 100644
index c6fcfae4..00000000
--- a/packages/docs/api/alert/CAlertLink.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CAlertLink
-
-```jsx
-import { CAlertLink } from '@coreui/vue'
-// or
-import CAlertLink from '@coreui/vue/src/components/alert/CAlertLink'
-```
diff --git a/packages/docs/api/avatar/CAvatar.api.md b/packages/docs/api/avatar/CAvatar.api.md
deleted file mode 100644
index eb80cc30..00000000
--- a/packages/docs/api/avatar/CAvatar.api.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### CAvatar
-
-```jsx
-import { CAvatar } from '@coreui/vue'
-// or
-import CAvatar from '@coreui/vue/src/components/avatar/CAvatar'
-```
-
-#### Props
-
-| Prop name      | Description                                                                      | Type   | Values                                                                                                                                                                                                                                                                                                                                                                      | Default |
-| -------------- | -------------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| **color**      | Sets the color context of the component to one of CoreUI’s themed colors.        | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                                                                                                                                                                                                             | -       |
-| **shape**      | Select the shape of the component.                                               | string | `'rounded'`, `'rounded-top'`, `'rounded-end'`, `'rounded-bottom'`, `'rounded-start'`, `'rounded-circle'`, `'rounded-pill'`, `'rounded-0'`, `'rounded-1'`, `'rounded-2'`, `'rounded-3'`                                                                                                                                                                                      | -       |
-| **size**       | Size the component small, large, or extra large.                                 | string | `'sm'`, `'md'`, `'lg'`, `'xl'`                                                                                                                                                                                                                                                                                                                                              | -       |
-| **src**        | The src attribute for the img element.                                           | string | -                                                                                                                                                                                                                                                                                                                                                                           | -       |
-| **status**     | Sets the color context of the status indicator to one of CoreUI’s themed colors. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                                                                                                                                                                                                             | -       |
-| **text-color** | Sets the text color of the component to one of CoreUI’s themed colors.           | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `'primary-emphasis'`, `'secondary-emphasis'`, `'success-emphasis'`, `'danger-emphasis'`, `'warning-emphasis'`, `'info-emphasis'`, `'light-emphasis'`, `'body'`, `'body-emphasis'`, `'body-secondary'`, `'body-tertiary'`, `'black'`, `'black-50'`, `'white'`, `'white-50'` | -       |
diff --git a/packages/docs/api/backdrop/CBackdrop.api.md b/packages/docs/api/backdrop/CBackdrop.api.md
deleted file mode 100644
index d5e4dfaf..00000000
--- a/packages/docs/api/backdrop/CBackdrop.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CBackdrop
-
-```jsx
-import { CBackdrop } from '@coreui/vue'
-// or
-import CBackdrop from '@coreui/vue/src/components/backdrop/CBackdrop'
-```
-
-#### Props
-
-| Prop name   | Description                               | Type    | Values | Default |
-| ----------- | ----------------------------------------- | ------- | ------ | ------- |
-| **visible** | Toggle the visibility of modal component. | boolean | -      | false   |
diff --git a/packages/docs/api/badge/CBadge.api.md b/packages/docs/api/badge/CBadge.api.md
deleted file mode 100644
index 4d763c88..00000000
--- a/packages/docs/api/badge/CBadge.api.md
+++ /dev/null
@@ -1,19 +0,0 @@
-### CBadge
-
-```jsx
-import { CBadge } from '@coreui/vue'
-// or
-import CBadge from '@coreui/vue/src/components/badge/CBadge'
-```
-
-#### Props
-
-| Prop name                                                        | Description                                                                                                                                                               | Type   | Values                                                                                                                                                                                                                                                                                                                                                                      | Default |
-| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| **as**                                                           | Component used for the root node. Either a string to use a HTML element or a component.                                                                                   | string | -                                                                                                                                                                                                                                                                                                                                                                           | 'span'  |
-| **color**                                                        | Sets the color context of the component to one of CoreUI’s themed colors.                                                                                                 | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                                                                                                                                                                                                             | -       |
-| **position**                                                     | Position badge in one of the corners of a link or button.                                                                                                                 | string | `'top-start'`, `'top-end'`, `'bottom-end'`, `'bottom-start'`                                                                                                                                                                                                                                                                                                                | -       |
-| **shape**                                                        | Select the shape of the component.                                                                                                                                        | string | `'rounded'`, `'rounded-top'`, `'rounded-end'`, `'rounded-bottom'`, `'rounded-start'`, `'rounded-circle'`, `'rounded-pill'`, `'rounded-0'`, `'rounded-1'`, `'rounded-2'`, `'rounded-3'`                                                                                                                                                                                      | -       |
-| **size**                                                         | Size the component small.                                                                                                                                                 | string | `'sm'`                                                                                                                                                                                                                                                                                                                                                                      | -       |
-| **text-bg-color** <br><div class="badge bg-primary">5.0.0+</div> | Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                                                                                                                                                                                                             | -       |
-| **text-color**                                                   | Sets the text color of the component to one of CoreUI’s themed colors.                                                                                                    | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `'primary-emphasis'`, `'secondary-emphasis'`, `'success-emphasis'`, `'danger-emphasis'`, `'warning-emphasis'`, `'info-emphasis'`, `'light-emphasis'`, `'body'`, `'body-emphasis'`, `'body-secondary'`, `'body-tertiary'`, `'black'`, `'black-50'`, `'white'`, `'white-50'` | -       |
diff --git a/packages/docs/api/breadcrumb/CBreadcrumb.api.md b/packages/docs/api/breadcrumb/CBreadcrumb.api.md
deleted file mode 100644
index 5aeae206..00000000
--- a/packages/docs/api/breadcrumb/CBreadcrumb.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CBreadcrumb
-
-```jsx
-import { CBreadcrumb } from '@coreui/vue'
-// or
-import CBreadcrumb from '@coreui/vue/src/components/breadcrumb/CBreadcrumb'
-```
diff --git a/packages/docs/api/breadcrumb/CBreadcrumbItem.api.md b/packages/docs/api/breadcrumb/CBreadcrumbItem.api.md
deleted file mode 100644
index 792d17d6..00000000
--- a/packages/docs/api/breadcrumb/CBreadcrumbItem.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CBreadcrumbItem
-
-```jsx
-import { CBreadcrumbItem } from '@coreui/vue'
-// or
-import CBreadcrumbItem from '@coreui/vue/src/components/breadcrumb/CBreadcrumbItem'
-```
-
-#### Props
-
-| Prop name  | Description                                        | Type    | Values | Default |
-| ---------- | -------------------------------------------------- | ------- | ------ | ------- |
-| **active** | Toggle the active state for the component.         | boolean | -      | -       |
-| **href**   | The `href` attribute for the inner link component. | string  | -      | -       |
diff --git a/packages/docs/api/button-group/CButtonGroup.api.md b/packages/docs/api/button-group/CButtonGroup.api.md
deleted file mode 100644
index cef08210..00000000
--- a/packages/docs/api/button-group/CButtonGroup.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CButtonGroup
-
-```jsx
-import { CButtonGroup } from '@coreui/vue'
-// or
-import CButtonGroup from '@coreui/vue/src/components/button-group/CButtonGroup'
-```
-
-#### Props
-
-| Prop name    | Description                                                                                                                     | Type    | Values         | Default |
-| ------------ | ------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------- | ------- |
-| **size**     | Size the component small or large.                                                                                              | string  | `'sm'`, `'lg'` | -       |
-| **vertical** | Create a set of buttons that appear vertically stacked rather than horizontally. Split button dropdowns are not supported here. | boolean | -              | -       |
diff --git a/packages/docs/api/button-group/CButtonToolbar.api.md b/packages/docs/api/button-group/CButtonToolbar.api.md
deleted file mode 100644
index f5ce68f5..00000000
--- a/packages/docs/api/button-group/CButtonToolbar.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CButtonToolbar
-
-```jsx
-import { CButtonToolbar } from '@coreui/vue'
-// or
-import CButtonToolbar from '@coreui/vue/src/components/button-group/CButtonToolbar'
-```
diff --git a/packages/docs/api/button/CButton.api.md b/packages/docs/api/button/CButton.api.md
deleted file mode 100644
index 47adf340..00000000
--- a/packages/docs/api/button/CButton.api.md
+++ /dev/null
@@ -1,27 +0,0 @@
-### CButton
-
-```jsx
-import { CButton } from '@coreui/vue'
-// or
-import CButton from '@coreui/vue/src/components/button/CButton'
-```
-
-#### Props
-
-| Prop name    | Description                                                                                                                                                                   | Type    | Values                                                                                                                                                                                 | Default  |
-| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
-| **active**   | Toggle the active state for the component.                                                                                                                                    | boolean | -                                                                                                                                                                                      | -        |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component.                                                                                       | string  | -                                                                                                                                                                                      | 'button' |
-| **color**    | Sets the color context of the component to one of CoreUI’s themed colors.                                                                                                     | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                        | -        |
-| **disabled** | Toggle the disabled state for the component.                                                                                                                                  | boolean | -                                                                                                                                                                                      | -        |
-| **href**     | The href attribute specifies the URL of the page the link goes to.                                                                                                            | string  | -                                                                                                                                                                                      | -        |
-| **shape**    | Select the shape of the component.                                                                                                                                            | string  | `'rounded'`, `'rounded-top'`, `'rounded-end'`, `'rounded-bottom'`, `'rounded-start'`, `'rounded-circle'`, `'rounded-pill'`, `'rounded-0'`, `'rounded-1'`, `'rounded-2'`, `'rounded-3'` | -        |
-| **size**     | Size the component small or large.                                                                                                                                            | string  | `'sm'`, `'lg'`                                                                                                                                                                         | -        |
-| **type**     | Specifies the type of button. Always specify the type attribute for the `<button>` element.<br>Different browsers may use different default types for the `<button>` element. | string  | `'button'`, `'submit'`, `'reset'`                                                                                                                                                      | 'button' |
-| **variant**  | Set the button variant to an outlined button or a ghost button.                                                                                                               | string  | `'ghost'`, `'outline'`                                                                                                                                                                 | -        |
-
-#### Events
-
-| Event name | Description                                      | Properties |
-| ---------- | ------------------------------------------------ | ---------- |
-| **click**  | Event called when the user clicks on the button. |
diff --git a/packages/docs/api/callout/CCallout.api.md b/packages/docs/api/callout/CCallout.api.md
deleted file mode 100644
index 77e2cd84..00000000
--- a/packages/docs/api/callout/CCallout.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCallout
-
-```jsx
-import { CCallout } from '@coreui/vue'
-// or
-import CCallout from '@coreui/vue/src/components/callout/CCallout'
-```
-
-#### Props
-
-| Prop name | Description                                                               | Type   | Values                                                                                          | Default |
-| --------- | ------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------- | ------- |
-| **color** | Sets the color context of the component to one of CoreUI’s themed colors. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
diff --git a/packages/docs/api/card/CCard.api.md b/packages/docs/api/card/CCard.api.md
deleted file mode 100644
index 49c792f9..00000000
--- a/packages/docs/api/card/CCard.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CCard
-
-```jsx
-import { CCard } from '@coreui/vue'
-// or
-import CCard from '@coreui/vue/src/components/card/CCard'
-```
-
-#### Props
-
-| Prop name                                                        | Description                                                                                                                                                               | Type   | Values                                                                                                                                                                                                                                                                                                                                                                      | Default |
-| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| **color**                                                        | Sets the color context of the component to one of CoreUI’s themed colors.                                                                                                 | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                                                                                                                                                                                                             | -       |
-| **text-bg-color** <br><div class="badge bg-primary">5.0.0+</div> | Sets the component's color scheme to one of CoreUI's themed colors, ensuring the text color contrast adheres to the WCAG 4.5:1 contrast ratio standard for accessibility. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`                                                                                                                                                                                                                                                                             | -       |
-| **text-color**                                                   | Sets the text color context of the component to one of CoreUI’s themed colors.                                                                                            | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `'primary-emphasis'`, `'secondary-emphasis'`, `'success-emphasis'`, `'danger-emphasis'`, `'warning-emphasis'`, `'info-emphasis'`, `'light-emphasis'`, `'body'`, `'body-emphasis'`, `'body-secondary'`, `'body-tertiary'`, `'black'`, `'black-50'`, `'white'`, `'white-50'` | -       |
diff --git a/packages/docs/api/card/CCardBody.api.md b/packages/docs/api/card/CCardBody.api.md
deleted file mode 100644
index 3109ba9e..00000000
--- a/packages/docs/api/card/CCardBody.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CCardBody
-
-```jsx
-import { CCardBody } from '@coreui/vue'
-// or
-import CCardBody from '@coreui/vue/src/components/card/CCardBody'
-```
diff --git a/packages/docs/api/card/CCardFooter.api.md b/packages/docs/api/card/CCardFooter.api.md
deleted file mode 100644
index 448e9f90..00000000
--- a/packages/docs/api/card/CCardFooter.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CCardFooter
-
-```jsx
-import { CCardFooter } from '@coreui/vue'
-// or
-import CCardFooter from '@coreui/vue/src/components/card/CCardFooter'
-```
diff --git a/packages/docs/api/card/CCardGroup.api.md b/packages/docs/api/card/CCardGroup.api.md
deleted file mode 100644
index 88bf125e..00000000
--- a/packages/docs/api/card/CCardGroup.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CCardGroup
-
-```jsx
-import { CCardGroup } from '@coreui/vue'
-// or
-import CCardGroup from '@coreui/vue/src/components/card/CCardGroup'
-```
diff --git a/packages/docs/api/card/CCardHeader.api.md b/packages/docs/api/card/CCardHeader.api.md
deleted file mode 100644
index a04ae736..00000000
--- a/packages/docs/api/card/CCardHeader.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCardHeader
-
-```jsx
-import { CCardHeader } from '@coreui/vue'
-// or
-import CCardHeader from '@coreui/vue/src/components/card/CCardHeader'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'div'   |
diff --git a/packages/docs/api/card/CCardImage.api.md b/packages/docs/api/card/CCardImage.api.md
deleted file mode 100644
index 880ccab1..00000000
--- a/packages/docs/api/card/CCardImage.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CCardImage
-
-```jsx
-import { CCardImage } from '@coreui/vue'
-// or
-import CCardImage from '@coreui/vue/src/components/card/CCardImage'
-```
-
-#### Props
-
-| Prop name       | Description                                                                             | Type   | Values              | Default |
-| --------------- | --------------------------------------------------------------------------------------- | ------ | ------------------- | ------- |
-| **as**          | Component used for the root node. Either a string to use a HTML element or a component. | string | -                   | 'img'   |
-| **orientation** | Optionally orientate the image to the top, bottom.                                      | string | `'top'`, `'bottom'` | -       |
diff --git a/packages/docs/api/card/CCardImageOverlay.api.md b/packages/docs/api/card/CCardImageOverlay.api.md
deleted file mode 100644
index 0c860b4b..00000000
--- a/packages/docs/api/card/CCardImageOverlay.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CCardImageOverlay
-
-```jsx
-import { CCardImageOverlay } from '@coreui/vue'
-// or
-import CCardImageOverlay from '@coreui/vue/src/components/card/CCardImageOverlay'
-```
diff --git a/packages/docs/api/card/CCardLink.api.md b/packages/docs/api/card/CCardLink.api.md
deleted file mode 100644
index 9abdeb57..00000000
--- a/packages/docs/api/card/CCardLink.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCardLink
-
-```jsx
-import { CCardLink } from '@coreui/vue'
-// or
-import CCardLink from '@coreui/vue/src/components/card/CCardLink'
-```
-
-#### Props
-
-| Prop name | Description                                                        | Type   | Values | Default |
-| --------- | ------------------------------------------------------------------ | ------ | ------ | ------- |
-| **href**  | The href attribute specifies the URL of the page the link goes to. | string | -      | '#'     |
diff --git a/packages/docs/api/card/CCardSubtitle.api.md b/packages/docs/api/card/CCardSubtitle.api.md
deleted file mode 100644
index 8961c4d0..00000000
--- a/packages/docs/api/card/CCardSubtitle.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCardSubtitle
-
-```jsx
-import { CCardSubtitle } from '@coreui/vue'
-// or
-import CCardSubtitle from '@coreui/vue/src/components/card/CCardSubtitle'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'h6'    |
diff --git a/packages/docs/api/card/CCardText.api.md b/packages/docs/api/card/CCardText.api.md
deleted file mode 100644
index b2550fb6..00000000
--- a/packages/docs/api/card/CCardText.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCardText
-
-```jsx
-import { CCardText } from '@coreui/vue'
-// or
-import CCardText from '@coreui/vue/src/components/card/CCardText'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'p'     |
diff --git a/packages/docs/api/card/CCardTitle.api.md b/packages/docs/api/card/CCardTitle.api.md
deleted file mode 100644
index 6fe87e17..00000000
--- a/packages/docs/api/card/CCardTitle.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCardTitle
-
-```jsx
-import { CCardTitle } from '@coreui/vue'
-// or
-import CCardTitle from '@coreui/vue/src/components/card/CCardTitle'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'h5'    |
diff --git a/packages/docs/api/carousel/CCarousel.api.md b/packages/docs/api/carousel/CCarousel.api.md
deleted file mode 100644
index b9c9bd6d..00000000
--- a/packages/docs/api/carousel/CCarousel.api.md
+++ /dev/null
@@ -1,20 +0,0 @@
-### CCarousel
-
-```jsx
-import { CCarousel } from '@coreui/vue'
-// or
-import CCarousel from '@coreui/vue/src/components/carousel/CCarousel'
-```
-
-#### Props
-
-| Prop name      | Description                                                                                                                                                                            | Type            | Values                   | Default |
-| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | ------------------------ | ------- |
-| **controls**   | Adding in the previous and next controls.                                                                                                                                              | boolean         | -                        | -       |
-| **dark**       | Add darker controls, indicators, and captions.                                                                                                                                         | boolean         | -                        | -       |
-| **index**      | index of the active item.                                                                                                                                                              | number          | -                        | 0       |
-| **indicators** | Adding indicators at the bottom of the carousel for each item.                                                                                                                         | boolean         | -                        | -       |
-| **interval**   | The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.                                                                    | boolean\|number | -                        | 5000    |
-| **pause**      | 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. | boolean\|string | -                        | 'hover' |
-| **transition** | Set type of the transition.                                                                                                                                                            | string          | `'crossfade'`, `'slide'` | 'slide' |
-| **wrap**       | Set whether the carousel should cycle continuously or have hard stops.                                                                                                                 | boolean         | -                        | true    |
diff --git a/packages/docs/api/carousel/CCarouselCaption.api.md b/packages/docs/api/carousel/CCarouselCaption.api.md
deleted file mode 100644
index aebeb8f3..00000000
--- a/packages/docs/api/carousel/CCarouselCaption.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CCarouselCaption
-
-```jsx
-import { CCarouselCaption } from '@coreui/vue'
-// or
-import CCarouselCaption from '@coreui/vue/src/components/carousel/CCarouselCaption'
-```
diff --git a/packages/docs/api/carousel/CCarouselItem.api.md b/packages/docs/api/carousel/CCarouselItem.api.md
deleted file mode 100644
index 9f02bf6b..00000000
--- a/packages/docs/api/carousel/CCarouselItem.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CCarouselItem
-
-```jsx
-import { CCarouselItem } from '@coreui/vue'
-// or
-import CCarouselItem from '@coreui/vue/src/components/carousel/CCarouselItem'
-```
-
-#### Props
-
-| Prop name    | Description                                                        | Type            | Values | Default |
-| ------------ | ------------------------------------------------------------------ | --------------- | ------ | ------- |
-| **interval** | The amount of time to delay between automatically cycling an item. | boolean\|number | -      | false   |
diff --git a/packages/docs/api/close-button/CCloseButton.api.md b/packages/docs/api/close-button/CCloseButton.api.md
deleted file mode 100644
index 631cdaf2..00000000
--- a/packages/docs/api/close-button/CCloseButton.api.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### CCloseButton
-
-```jsx
-import { CCloseButton } from '@coreui/vue'
-// or
-import CCloseButton from '@coreui/vue/src/components/close-button/CCloseButton'
-```
-
-#### Props
-
-| Prop name    | Description                                  | Type    | Values | Default |
-| ------------ | -------------------------------------------- | ------- | ------ | ------- |
-| **dark**     | Invert the default color.                    | boolean | -      | -       |
-| **disabled** | Toggle the disabled state for the component. | boolean | -      | -       |
-| **white**    | Change the default color to white.           | boolean | -      | -       |
-
-#### Events
-
-| Event name | Description                                         | Properties |
-| ---------- | --------------------------------------------------- | ---------- |
-| **click**  | Event called when the user clicks on the component. |
diff --git a/packages/docs/api/collapse/CCollapse.api.md b/packages/docs/api/collapse/CCollapse.api.md
deleted file mode 100644
index 4f0fa2f6..00000000
--- a/packages/docs/api/collapse/CCollapse.api.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### CCollapse
-
-```jsx
-import { CCollapse } from '@coreui/vue'
-// or
-import CCollapse from '@coreui/vue/src/components/collapse/CCollapse'
-```
-
-#### Props
-
-| Prop name      | Description                                                          | Type    | Values | Default |
-| -------------- | -------------------------------------------------------------------- | ------- | ------ | ------- |
-| **horizontal** | Set horizontal collapsing to transition the width instead of height. | boolean | -      | -       |
-| **visible**    | Toggle the visibility of component.                                  | boolean | -      | -       |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/conditional-teleport/CConditionalTeleport.api.md b/packages/docs/api/conditional-teleport/CConditionalTeleport.api.md
deleted file mode 100644
index 79b60043..00000000
--- a/packages/docs/api/conditional-teleport/CConditionalTeleport.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CConditionalTeleport
-
-```jsx
-import { CConditionalTeleport } from '@coreui/vue'
-// or
-import CConditionalTeleport from '@coreui/vue/src/components/conditional-teleport/CConditionalTeleport'
-```
-
-#### Props
-
-| Prop name                                                    | Description                                                                                     | Type                                         | Values | Default |
-| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | -------------------------------------------- | ------ | ------- |
-| **container** <br><div class="badge bg-primary">5.0.0+</div> | An HTML element or function that returns a single element, with `document.body` as the default. | HTMLElement \| (() => HTMLElement) \| string | -      | 'body'  |
-| **teleport**                                                 | Render some children into a different part of the DOM                                           | boolean                                      | -      | true    |
diff --git a/packages/docs/api/coreui-icons-vue/src/CIcon.api.md b/packages/docs/api/coreui-icons-vue/src/CIcon.api.md
deleted file mode 100644
index 2811502c..00000000
--- a/packages/docs/api/coreui-icons-vue/src/CIcon.api.md
+++ /dev/null
@@ -1,19 +0,0 @@
-### CIcon
-
-```jsx
-import { CIcon } from '@coreui/icons-vue'
-// or
-import CIcon from '@coreui/icons-vue/src/CIcon'
-```
-
-#### Props
-
-| Prop name             | Description                                                                                       | Type                  | Values | Default |
-| --------------------- | ------------------------------------------------------------------------------------------------- | --------------------- | ------ | ------- |
-| **content**           | Use `:icon="..."` instead of<br/>`@deprecated` since version 3.0                                  | string\|array         | -      | -       |
-| **custom-class-name** | Use for replacing default CIcon component classes. Prop is overriding the 'size' prop.            | string\|array\|object | -      | -       |
-| **icon**              | Name of the icon placed in React object or SVG content.                                           | string \| string[]    | -      | -       |
-| **name**              | Use `icon="..."` instead of<br/>`@deprecated` since version 3.0                                   | string                | -      | -       |
-| **size**              | Size of the icon. Available sizes: 'sm', 'lg', 'xl', 'xxl', '3xl...9xl', 'custom', 'custom-size'. | string                | -      | -       |
-| **title**             | Title tag content.                                                                                | string                | -      | -       |
-| **use**               | If defined component will be rendered using 'use' tag.                                            | string                | -      | -       |
diff --git a/packages/docs/api/coreui-icons-vue/src/CIconSvg.api.md b/packages/docs/api/coreui-icons-vue/src/CIconSvg.api.md
deleted file mode 100644
index 1984a5a7..00000000
--- a/packages/docs/api/coreui-icons-vue/src/CIconSvg.api.md
+++ /dev/null
@@ -1,17 +0,0 @@
-### CIconSvg
-
-```jsx
-import { CIconSvg } from '@coreui/icons-vue'
-// or
-import CIconSvg from '@coreui/icons-vue/src/CIconSvg'
-```
-
-#### Props
-
-| Prop name             | Description                                                                                       | Type                  | Values | Default |
-| --------------------- | ------------------------------------------------------------------------------------------------- | --------------------- | ------ | ------- |
-| **custom-class-name** | Use for replacing default CIconSvg component classes. Prop is overriding the 'size' prop.         | string\|array\|object | -      | -       |
-| **height**            | The height attribute defines the vertical length of an icon.                                      | number                | -      | -       |
-| **size**              | Size of the icon. Available sizes: 'sm', 'lg', 'xl', 'xxl', '3xl...9xl', 'custom', 'custom-size'. | string                | -      | -       |
-| **title**             | Title tag content.                                                                                | string                | -      | -       |
-| **width**             | The width attribute defines the horizontal length of an icon.                                     | number                | -      | -       |
diff --git a/packages/docs/api/dropdown/CDropdown.api.md b/packages/docs/api/dropdown/CDropdown.api.md
deleted file mode 100644
index 6d3bade5..00000000
--- a/packages/docs/api/dropdown/CDropdown.api.md
+++ /dev/null
@@ -1,32 +0,0 @@
-### CDropdown
-
-```jsx
-import { CDropdown } from '@coreui/vue'
-// or
-import CDropdown from '@coreui/vue/src/components/dropdown/CDropdown'
-```
-
-#### Props
-
-| Prop name                                                    | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Type                                         | Values                                                                                                                                                                                        | Default        |
-| ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
-| **alignment**                                                | Set aligment of dropdown menu.                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | string \| Alignments                         | `{ 'start' \| 'end' \| { xs: 'start' \| 'end' } \| { sm: 'start' \| 'end' } \| { md: 'start' \| 'end' } \| { lg: 'start' \| 'end' } \| { xl: 'start' \| 'end'} \| { xxl: 'start' \| 'end'} }` | -              |
-| **auto-close**                                               | Configure the auto close behavior of the dropdown:<br>- `true` - the dropdown will be closed by clicking outside or inside the dropdown menu.<br>- `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 esc key)<br>- `'inside'` - the dropdown will be closed (only) by clicking inside the dropdown menu.<br>- `'outside'` - the dropdown will be closed (only) by clicking outside the dropdown menu. | boolean\|string                              | -                                                                                                                                                                                             | true           |
-| **container** <br><div class="badge bg-primary">5.0.0+</div> | Appends the vue dropdown menu to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.                                                                                                                                                                                                                                                                                                                                                 | HTMLElement \| (() => HTMLElement) \| string | -                                                                                                                                                                                             | 'body'         |
-| **dark**                                                     | Sets a darker color scheme to match a dark navbar.                                                                                                                                                                                                                                                                                                                                                                                                                                                       | boolean                                      | -                                                                                                                                                                                             | -              |
-| **direction**                                                | Sets a specified direction and location of the dropdown menu.                                                                                                                                                                                                                                                                                                                                                                                                                                            | string                                       | `'center'`, `'dropup'`, `'dropup-center'`, `'dropend'`, `'dropstart'`                                                                                                                         | -              |
-| **disabled**                                                 | Toggle the disabled state for the component.                                                                                                                                                                                                                                                                                                                                                                                                                                                             | boolean                                      | -                                                                                                                                                                                             | -              |
-| **offset** <br><div class="badge bg-primary">4.9.0+</div>    | Offset of the dropdown menu relative to its target.                                                                                                                                                                                                                                                                                                                                                                                                                                                      | array                                        | -                                                                                                                                                                                             | [0, 2]         |
-| **placement**                                                | Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.                                                                                                                                                                                                                                                                                                                                     | Placement                                    | `'auto'`, `'top-end'`, `'top'`, `'top-start'`, `'bottom-end'`, `'bottom'`, `'bottom-start'`, `'right-start'`, `'right'`, `'right-end'`, `'left-start'`, `'left'`, `'left-end'`                | 'bottom-start' |
-| **popper**                                                   | If you want to disable dynamic positioning set this property to `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                  | boolean                                      | -                                                                                                                                                                                             | true           |
-| **teleport** <br><div class="badge bg-primary">5.0.0+</div>  | Generates dropdown menu using Teleport.                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | boolean                                      | -                                                                                                                                                                                             | false          |
-| **trigger**                                                  | Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.                                                                                                                                                                                                                                                                                                                                                                                      | Triggers                                     | -                                                                                                                                                                                             | 'click'        |
-| **variant**                                                  | Set the dropdown variant to an btn-group, dropdown, input-group, and nav-item.                                                                                                                                                                                                                                                                                                                                                                                                                           | string                                       | `'btn-group'`, `'dropdown'`, `'input-group'`, `'nav-item'`                                                                                                                                    | 'btn-group'    |
-| **visible**                                                  | Toggle the visibility of dropdown menu component.                                                                                                                                                                                                                                                                                                                                                                                                                                                        | boolean                                      | -                                                                                                                                                                                             | -              |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/dropdown/CDropdownDivider.api.md b/packages/docs/api/dropdown/CDropdownDivider.api.md
deleted file mode 100644
index a8c44961..00000000
--- a/packages/docs/api/dropdown/CDropdownDivider.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CDropdownDivider
-
-```jsx
-import { CDropdownDivider } from '@coreui/vue'
-// or
-import CDropdownDivider from '@coreui/vue/src/components/dropdown/CDropdownDivider'
-```
diff --git a/packages/docs/api/dropdown/CDropdownHeader.api.md b/packages/docs/api/dropdown/CDropdownHeader.api.md
deleted file mode 100644
index 97d237e2..00000000
--- a/packages/docs/api/dropdown/CDropdownHeader.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CDropdownHeader
-
-```jsx
-import { CDropdownHeader } from '@coreui/vue'
-// or
-import CDropdownHeader from '@coreui/vue/src/components/dropdown/CDropdownHeader'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'h6'    |
diff --git a/packages/docs/api/dropdown/CDropdownItem.api.md b/packages/docs/api/dropdown/CDropdownItem.api.md
deleted file mode 100644
index c9d88766..00000000
--- a/packages/docs/api/dropdown/CDropdownItem.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CDropdownItem
-
-```jsx
-import { CDropdownItem } from '@coreui/vue'
-// or
-import CDropdownItem from '@coreui/vue/src/components/dropdown/CDropdownItem'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type    | Values | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **active**   | Toggle the active state for the component.                                              | boolean | -      | -       |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | 'a'     |
-| **disabled** | Toggle the disabled state for the component.                                            | boolean | -      | -       |
-| **href**     | The href attribute specifies the URL of the page the link goes to.                      | string  | -      | -       |
diff --git a/packages/docs/api/dropdown/CDropdownMenu.api.md b/packages/docs/api/dropdown/CDropdownMenu.api.md
deleted file mode 100644
index 2c7c07b0..00000000
--- a/packages/docs/api/dropdown/CDropdownMenu.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CDropdownMenu
-
-```jsx
-import { CDropdownMenu } from '@coreui/vue'
-// or
-import CDropdownMenu from '@coreui/vue/src/components/dropdown/CDropdownMenu'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values          | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | --------------- | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | `'div'`, `'ul'` | 'div'   |
diff --git a/packages/docs/api/dropdown/CDropdownToggle.api.md b/packages/docs/api/dropdown/CDropdownToggle.api.md
deleted file mode 100644
index ddf79509..00000000
--- a/packages/docs/api/dropdown/CDropdownToggle.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CDropdownToggle
-
-```jsx
-import { CDropdownToggle } from '@coreui/vue'
-// or
-import CDropdownToggle from '@coreui/vue/src/components/dropdown/CDropdownToggle'
-```
-
-#### Props
-
-| Prop name                                                   | Description                                                                                                                                                                                                   | Type     | Values                                                                                          | Default  |
-| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------- | -------- |
-| **as**                                                      | Component used for the root node. Either a string to use a HTML element or a component.                                                                                                                       | string   | -                                                                                               | 'button' |
-| **color**                                                   | Sets the color context of the component to one of CoreUI’s themed colors.                                                                                                                                     | string   | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -        |
-| **caret**                                                   | Enables pseudo element caret on toggler.                                                                                                                                                                      | boolean  | -                                                                                               | true     |
-| **custom**                                                  | Create a custom toggler which accepts any content.                                                                                                                                                            | boolean  | -                                                                                               | -        |
-| **disabled**                                                | Toggle the disabled state for the component.                                                                                                                                                                  | boolean  | -                                                                                               | -        |
-| **nav-link** <br><div class="badge bg-primary">5.0.0+</div> | If a dropdown `variant` is set to `nav-item` then render the toggler as a link instead of a button.                                                                                                           | boolean  | -                                                                                               | true     |
-| **size**                                                    | Size the component small or large.                                                                                                                                                                            | string   | `'sm'`, `'lg'`                                                                                  | -        |
-| **split**                                                   | Similarly, create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of `.dropdown-toggle-split` className for proper spacing around the dropdown caret. | boolean  | -                                                                                               | -        |
-| **trigger**                                                 | Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.<br/>`@type` 'hover' \| 'focus' \| 'click'                                                 | Triggers | -                                                                                               | 'click'  |
-| **variant**                                                 | Set the button variant to an outlined button or a ghost button.                                                                                                                                               | string   | `'ghost'`, `'outline'`                                                                          | -        |
diff --git a/packages/docs/api/footer/CFooter.api.md b/packages/docs/api/footer/CFooter.api.md
deleted file mode 100644
index bc9337fe..00000000
--- a/packages/docs/api/footer/CFooter.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CFooter
-
-```jsx
-import { CFooter } from '@coreui/vue'
-// or
-import CFooter from '@coreui/vue/src/components/footer/CFooter'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type   | Values                | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------ | --------------------- | ------- |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string | -                     | 'div'   |
-| **position** | Place footer in non-static positions.                                                   | string | `'fixed'`, `'sticky'` | -       |
diff --git a/packages/docs/api/form/CForm.api.md b/packages/docs/api/form/CForm.api.md
deleted file mode 100644
index fdaf792d..00000000
--- a/packages/docs/api/form/CForm.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CForm
-
-```jsx
-import { CForm } from '@coreui/vue'
-// or
-import CForm from '@coreui/vue/src/components/form/CForm'
-```
-
-#### Props
-
-| Prop name     | Description                                                                                                   | Type    | Values | Default |
-| ------------- | ------------------------------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **validated** | Mark a form as validated. If you set it `true`, all validation styles will be applied to the forms component. | boolean | -      | -       |
diff --git a/packages/docs/api/form/CFormCheck.api.md b/packages/docs/api/form/CFormCheck.api.md
deleted file mode 100644
index 1d906212..00000000
--- a/packages/docs/api/form/CFormCheck.api.md
+++ /dev/null
@@ -1,37 +0,0 @@
-### CFormCheck
-
-```jsx
-import { CFormCheck } from '@coreui/vue'
-// or
-import CFormCheck from '@coreui/vue/src/components/form/CFormCheck'
-```
-
-#### Props
-
-| Prop name                                                           | Description                                                                                                                                                 | Type                   | Values                  | Default    |
-| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------------- | ---------- |
-| **button**                                                          | Create button-like checkboxes and radio buttons.<br/>`@see` http://coreui.io/vue/docs/components/button.html                                                | object                 | -                       | -          |
-| **false-value** <br><div class="badge bg-primary">4.10.0+</div>     | Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `false` state. | string                 | -                       | -          |
-| **feedback** <br><div class="badge bg-primary">4.3.0+</div>         | Provide valuable, actionable feedback.                                                                                                                      | string                 | -                       | -          |
-| **feedback-invalid** <br><div class="badge bg-primary">4.3.0+</div> | Provide valuable, actionable feedback.                                                                                                                      | string                 | -                       | -          |
-| **feedback-valid** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.       | string                 | -                       | -          |
-| **hit-area**                                                        | Sets hit area to the full area of the component.                                                                                                            | string                 | -                       | -          |
-| **id**                                                              | The id global attribute defines an identifier (ID) that must be unique in the whole document.                                                               | string                 | -                       | -          |
-| **indeterminate**                                                   | Input Checkbox indeterminate Property                                                                                                                       | boolean                | -                       | -          |
-| **inline**                                                          | Group checkboxes or radios on the same horizontal row by adding.                                                                                            | boolean                | -                       | -          |
-| **invalid**                                                         | Set component validation state to invalid.                                                                                                                  | boolean                | -                       | -          |
-| **label**                                                           | The element represents a caption for a component.                                                                                                           | string                 | -                       | -          |
-| **model-value**                                                     | The default name for a value passed using v-model.                                                                                                          | array\|boolean\|string | -                       | -          |
-| **reverse** <br><div class="badge bg-primary">4.8.0+</div>          | Put checkboxes or radios on the opposite side.                                                                                                              | boolean                | -                       | -          |
-| **tooltip-feedback** <br><div class="badge bg-primary">4.3.0+</div> | Display validation feedback in a styled tooltip.                                                                                                            | boolean                | -                       | -          |
-| **true-value** <br><div class="badge bg-primary">4.10.0+</div>      | Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `true` state.  | string                 | -                       | -          |
-| **type**                                                            | Specifies the type of component.                                                                                                                            | string                 | `'checkbox'`, `'radio'` | 'checkbox' |
-| **valid**                                                           | Set component validation state to valid.                                                                                                                    | boolean                | -                       | -          |
-| **value**                                                           | The value attribute of component.                                                                                                                           | string                 | -                       | -          |
-
-#### Events
-
-| Event name            | Description                                           | Properties |
-| --------------------- | ----------------------------------------------------- | ---------- |
-| **change**            | Event occurs when the checked value has been changed. |
-| **update:modelValue** | Emit the new value whenever there’s a change event.   |
diff --git a/packages/docs/api/form/CFormControl.api.md b/packages/docs/api/form/CFormControl.api.md
deleted file mode 100644
index b522760f..00000000
--- a/packages/docs/api/form/CFormControl.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CFormControl
-
-```jsx
-import { CFormControl } from '@coreui/vue'
-// or
-import CFormControl from '@coreui/vue/src/components/form/CFormControl'
-```
diff --git a/packages/docs/api/form/CFormControlValidation.api.md b/packages/docs/api/form/CFormControlValidation.api.md
deleted file mode 100644
index 09aed3b7..00000000
--- a/packages/docs/api/form/CFormControlValidation.api.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### CFormControlValidation
-
-```jsx
-import { CFormControlValidation } from '@coreui/vue'
-// or
-import CFormControlValidation from '@coreui/vue/src/components/form/CFormControlValidation'
-```
-
-#### Props
-
-| Prop name                                                           | Description                                                                                                                                           | Type    | Values | Default |
-| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **feedback** <br><div class="badge bg-primary">4.3.0+</div>         | Provide valuable, actionable feedback.                                                                                                                | string  | -      | -       |
-| **feedback-invalid** <br><div class="badge bg-primary">4.3.0+</div> | Provide valuable, actionable feedback.                                                                                                                | string  | -      | -       |
-| **feedback-valid** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`. | string  | -      | -       |
-| **invalid**                                                         | Set component validation state to invalid.                                                                                                            | boolean | -      | -       |
-| **tooltip-feedback** <br><div class="badge bg-primary">4.3.0+</div> | Display validation feedback in a styled tooltip.                                                                                                      | boolean | -      | -       |
-| **valid**                                                           | Set component validation state to valid.                                                                                                              | boolean | -      | -       |
diff --git a/packages/docs/api/form/CFormControlWrapper.api.md b/packages/docs/api/form/CFormControlWrapper.api.md
deleted file mode 100644
index ebce3a46..00000000
--- a/packages/docs/api/form/CFormControlWrapper.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CFormControlWrapper
-
-```jsx
-import { CFormControlWrapper } from '@coreui/vue'
-// or
-import CFormControlWrapper from '@coreui/vue/src/components/form/CFormControlWrapper'
-```
-
-#### Props
-
-| Prop name                                                              | Description                                                                                                                                         | Type   | Values | Default |
-| ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **floating-class-name** <br><div class="badge bg-primary">5.5.0+</div> | A string of all className you want applied to the floating label wrapper.                                                                           | string | -      | -       |
-| **floating-label** <br><div class="badge bg-primary">4.3.0+</div>      | Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`. | string | -      | -       |
-| **label** <br><div class="badge bg-primary">4.3.0+</div>               | Add a caption for a component.                                                                                                                      | string | -      | -       |
-| **text** <br><div class="badge bg-primary">4.3.0+</div>                | Add helper text to the component.                                                                                                                   | string | -      | -       |
diff --git a/packages/docs/api/form/CFormFeedback.api.md b/packages/docs/api/form/CFormFeedback.api.md
deleted file mode 100644
index 3ab11d05..00000000
--- a/packages/docs/api/form/CFormFeedback.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CFormFeedback
-
-```jsx
-import { CFormFeedback } from '@coreui/vue'
-// or
-import CFormFeedback from '@coreui/vue/src/components/form/CFormFeedback'
-```
-
-#### Props
-
-| Prop name   | Description                                                                             | Type    | Values | Default |
-| ----------- | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **as**      | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | 'div'   |
-| **invalid** | Method called immediately after the `value` prop changes.                               | boolean | -      | -       |
-| **tooltip** | If your form layout allows it, you can display validation feedback in a styled tooltip. | boolean | -      | -       |
-| **valid**   | Set component validation state to valid.                                                | boolean | -      | -       |
diff --git a/packages/docs/api/form/CFormFloating.api.md b/packages/docs/api/form/CFormFloating.api.md
deleted file mode 100644
index 8a462a15..00000000
--- a/packages/docs/api/form/CFormFloating.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CFormFloating
-
-```jsx
-import { CFormFloating } from '@coreui/vue'
-// or
-import CFormFloating from '@coreui/vue/src/components/form/CFormFloating'
-```
diff --git a/packages/docs/api/form/CFormInput.api.md b/packages/docs/api/form/CFormInput.api.md
deleted file mode 100644
index 1dfb422b..00000000
--- a/packages/docs/api/form/CFormInput.api.md
+++ /dev/null
@@ -1,36 +0,0 @@
-### CFormInput
-
-```jsx
-import { CFormInput } from '@coreui/vue'
-// or
-import CFormInput from '@coreui/vue/src/components/form/CFormInput'
-```
-
-#### Props
-
-| Prop name                                                           | Description                                                                                                                                                                 | Type                 | Values                                  | Default |
-| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------- | ------- |
-| **disabled**                                                        | Toggle the disabled state for the component.                                                                                                                                | boolean              | -                                       | -       |
-| **feedback** <br><div class="badge bg-primary">4.3.0+</div>         | Provide valuable, actionable feedback.                                                                                                                                      | string               | -                                       | -       |
-| **feedback-invalid** <br><div class="badge bg-primary">4.3.0+</div> | Provide valuable, actionable feedback.                                                                                                                                      | string               | -                                       | -       |
-| **feedback-valid** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.                       | string               | -                                       | -       |
-| **floating-label** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.                         | string               | -                                       | -       |
-| **id**                                                              | The id global attribute defines an identifier (ID) that must be unique in the whole document.                                                                               | string               | -                                       | -       |
-| **invalid**                                                         | Set component validation state to invalid.                                                                                                                                  | boolean              | -                                       | -       |
-| **label** <br><div class="badge bg-primary">4.3.0+</div>            | Add a caption for a component.                                                                                                                                              | string               | -                                       | -       |
-| **model-value**                                                     | The default name for a value passed using v-model.                                                                                                                          | File\|number\|string | -                                       | -       |
-| **plain-text**                                                      | Render the component styled as plain text. Removes the default form field styling and preserve the correct margin and padding. Recommend to use only along side `readonly`. | boolean              | -                                       | -       |
-| **readonly**                                                        | Toggle the readonly state for the component.                                                                                                                                | boolean              | -                                       | -       |
-| **size**                                                            | Size the component small or large.                                                                                                                                          | string               | `'sm' \| 'lg'`                          | -       |
-| **text** <br><div class="badge bg-primary">4.3.0+</div>             | Add helper text to the component.                                                                                                                                           | string               | -                                       | -       |
-| **tooltip-feedback** <br><div class="badge bg-primary">4.3.0+</div> | Display validation feedback in a styled tooltip.                                                                                                                            | boolean              | -                                       | -       |
-| **type**                                                            | Specifies the type of component.                                                                                                                                            | string               | `'color' \| 'file' \| 'text' \| string` | 'text'  |
-| **valid**                                                           | Set component validation state to valid.                                                                                                                                    | boolean              | -                                       | -       |
-
-#### Events
-
-| Event name            | Description                                                                    | Properties |
-| --------------------- | ------------------------------------------------------------------------------ | ---------- |
-| **change**            | Event occurs when the element loses focus, after the content has been changed. |
-| **input**             | Event occurs immediately after the value of a component has changed.           |
-| **update:modelValue** | Emit the new value whenever there’s an input or change event.                  |
diff --git a/packages/docs/api/form/CFormLabel.api.md b/packages/docs/api/form/CFormLabel.api.md
deleted file mode 100644
index adc3c93b..00000000
--- a/packages/docs/api/form/CFormLabel.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CFormLabel
-
-```jsx
-import { CFormLabel } from '@coreui/vue'
-// or
-import CFormLabel from '@coreui/vue/src/components/form/CFormLabel'
-```
-
-#### Props
-
-| Prop name             | Description                                                                                               | Type          | Values | Default |
-| --------------------- | --------------------------------------------------------------------------------------------------------- | ------------- | ------ | ------- |
-| **custom-class-name** | A string of all className you want to be applied to the component, and override standard className value. | array\|string | -      | -       |
diff --git a/packages/docs/api/form/CFormRange.api.md b/packages/docs/api/form/CFormRange.api.md
deleted file mode 100644
index 878b82d2..00000000
--- a/packages/docs/api/form/CFormRange.api.md
+++ /dev/null
@@ -1,27 +0,0 @@
-### CFormRange
-
-```jsx
-import { CFormRange } from '@coreui/vue'
-// or
-import CFormRange from '@coreui/vue/src/components/form/CFormRange'
-```
-
-#### Props
-
-| Prop name                                                | Description                                                      | Type    | Values | Default |
-| -------------------------------------------------------- | ---------------------------------------------------------------- | ------- | ------ | ------- |
-| **disabled**                                             | Toggle the disabled state for the component.                     | boolean | -      | -       |
-| **label** <br><div class="badge bg-primary">4.3.0+</div> | Add a caption for a component.                                   | string  | -      | -       |
-| **max**                                                  | Specifies the maximum value for the component.                   | number  | -      | -       |
-| **min**                                                  | Specifies the minimum value for the component.                   | number  | -      | -       |
-| **model-value**                                          | The default name for a value passed using v-model.               | string  | -      | -       |
-| **readonly**                                             | Toggle the readonly state for the component.                     | boolean | -      | -       |
-| **steps**                                                | Specifies the interval between legal numbers in the component.   | number  | -      | -       |
-| **value**                                                | The `value` attribute of component.<br/>`@controllable` onChange | number  | -      | -       |
-
-#### Events
-
-| Event name            | Description                                         | Properties |
-| --------------------- | --------------------------------------------------- | ---------- |
-| **change**            | Event occurs when the value has been changed.       |
-| **update:modelValue** | Emit the new value whenever there’s a change event. |
diff --git a/packages/docs/api/form/CFormSelect.api.md b/packages/docs/api/form/CFormSelect.api.md
deleted file mode 100644
index 8d77c483..00000000
--- a/packages/docs/api/form/CFormSelect.api.md
+++ /dev/null
@@ -1,33 +0,0 @@
-### CFormSelect
-
-```jsx
-import { CFormSelect } from '@coreui/vue'
-// or
-import CFormSelect from '@coreui/vue/src/components/form/CFormSelect'
-```
-
-#### Props
-
-| Prop name                                                           | Description                                                                                                                                                                                                                                  | Type                 | Values         | Default |
-| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------- | ------- |
-| **feedback** <br><div class="badge bg-primary">4.3.0+</div>         | Provide valuable, actionable feedback.                                                                                                                                                                                                       | string               | -              | -       |
-| **feedback-invalid** <br><div class="badge bg-primary">4.3.0+</div> | Provide valuable, actionable feedback.                                                                                                                                                                                                       | string               | -              | -       |
-| **feedback-valid** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.                                                                                        | string               | -              | -       |
-| **floating-label** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.                                                                                          | string               | -              | -       |
-| **html-size**                                                       | Specifies the number of visible options in a drop-down list.                                                                                                                                                                                 | number               | -              | -       |
-| **id**                                                              | The id global attribute defines an identifier (ID) that must be unique in the whole document.                                                                                                                                                | string               | -              | -       |
-| **invalid**                                                         | Set component validation state to invalid.                                                                                                                                                                                                   | boolean              | -              | -       |
-| **label** <br><div class="badge bg-primary">4.3.0+</div>            | Add a caption for a component.                                                                                                                                                                                                               | string               | -              | -       |
-| **model-value**                                                     | The default name for a value passed using v-model.                                                                                                                                                                                           | string \| string[]   | -              | -       |
-| **options**                                                         | Options list of the select component. Available keys: `label`, `value`, `disabled`.<br>Examples:<br>- `:options="[{ value: 'js', label: 'JavaScript' }, { value: 'html', label: 'HTML', disabled: true }]"`<br>- `:options="['js', 'html']"` | Option[] \| string[] | -              | -       |
-| **size**                                                            | Size the component small or large.                                                                                                                                                                                                           | string               | `'sm' \| 'lg'` | -       |
-| **text** <br><div class="badge bg-primary">4.3.0+</div>             | Add helper text to the component.                                                                                                                                                                                                            | string               | -              | -       |
-| **tooltip-feedback** <br><div class="badge bg-primary">4.3.0+</div> | Display validation feedback in a styled tooltip.                                                                                                                                                                                             | boolean              | -              | -       |
-| **valid**                                                           | Set component validation state to valid.                                                                                                                                                                                                     | boolean              | -              | -       |
-
-#### Events
-
-| Event name            | Description                                                                        | Properties |
-| --------------------- | ---------------------------------------------------------------------------------- | ---------- |
-| **change**            | Event occurs when when a user changes the selected option of a `<select>` element. |
-| **update:modelValue** | Emit the new value whenever there’s a change event.                                |
diff --git a/packages/docs/api/form/CFormSwitch.api.md b/packages/docs/api/form/CFormSwitch.api.md
deleted file mode 100644
index fc2864c1..00000000
--- a/packages/docs/api/form/CFormSwitch.api.md
+++ /dev/null
@@ -1,27 +0,0 @@
-### CFormSwitch
-
-```jsx
-import { CFormSwitch } from '@coreui/vue'
-// or
-import CFormSwitch from '@coreui/vue/src/components/form/CFormSwitch'
-```
-
-#### Props
-
-| Prop name                                                  | Description                                                                                  | Type            | Values                  | Default    |
-| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------- | --------------- | ----------------------- | ---------- |
-| **id**                                                     | The id global attribute defines an identifier (ID) that must be unique in the whole document | string          | -                       | -          |
-| **invalid**                                                | Set component validation state to invalid.                                                   | boolean         | -                       | -          |
-| **label**                                                  | The element represents a caption for a component.                                            | string          | -                       | -          |
-| **model-value**                                            | The default name for a value passed using v-model.                                           | boolean\|string | -                       | -          |
-| **reverse** <br><div class="badge bg-primary">4.8.0+</div> | Put checkboxes or radios on the opposite side.                                               | boolean         | -                       | -          |
-| **size**                                                   | Size the component large or extra large. Works only with `switch`.                           | string          | `'lg' \| 'xl'`          | -          |
-| **type**                                                   | Specifies the type of component.                                                             | string          | `'checkbox'`, `'radio'` | 'checkbox' |
-| **valid**                                                  | Set component validation state to valid.                                                     | boolean         | -                       | -          |
-
-#### Events
-
-| Event name            | Description                                           | Properties |
-| --------------------- | ----------------------------------------------------- | ---------- |
-| **change**            | Event occurs when the checked value has been changed. |
-| **update:modelValue** | Emit the new value whenever there’s a change event.   |
diff --git a/packages/docs/api/form/CFormText.api.md b/packages/docs/api/form/CFormText.api.md
deleted file mode 100644
index 33cdc019..00000000
--- a/packages/docs/api/form/CFormText.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CFormText
-
-```jsx
-import { CFormText } from '@coreui/vue'
-// or
-import CFormText from '@coreui/vue/src/components/form/CFormText'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'div'   |
diff --git a/packages/docs/api/form/CFormTextarea.api.md b/packages/docs/api/form/CFormTextarea.api.md
deleted file mode 100644
index d3bb2949..00000000
--- a/packages/docs/api/form/CFormTextarea.api.md
+++ /dev/null
@@ -1,34 +0,0 @@
-### CFormTextarea
-
-```jsx
-import { CFormTextarea } from '@coreui/vue'
-// or
-import CFormTextarea from '@coreui/vue/src/components/form/CFormTextarea'
-```
-
-#### Props
-
-| Prop name                                                           | Description                                                                                                                                                                 | Type    | Values | Default |
-| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **disabled**                                                        | Toggle the disabled state for the component.                                                                                                                                | boolean | -      | -       |
-| **feedback** <br><div class="badge bg-primary">4.3.0+</div>         | Provide valuable, actionable feedback.                                                                                                                                      | string  | -      | -       |
-| **feedback-invalid** <br><div class="badge bg-primary">4.3.0+</div> | Provide valuable, actionable feedback.                                                                                                                                      | string  | -      | -       |
-| **feedback-valid** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable invalid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.                       | string  | -      | -       |
-| **floating-label** <br><div class="badge bg-primary">4.3.0+</div>   | Provide valuable, actionable valid feedback when using standard HTML form validation which applied two CSS pseudo-classes, `:invalid` and `:valid`.                         | string  | -      | -       |
-| **id**                                                              | The id global attribute defines an identifier (ID) that must be unique in the whole document.                                                                               | string  | -      | -       |
-| **invalid**                                                         | Set component validation state to invalid.                                                                                                                                  | boolean | -      | -       |
-| **label** <br><div class="badge bg-primary">4.3.0+</div>            | Add a caption for a component.                                                                                                                                              | string  | -      | -       |
-| **model-value**                                                     | The default name for a value passed using v-model.                                                                                                                          | string  | -      | -       |
-| **plain-text**                                                      | Render the component styled as plain text. Removes the default form field styling and preserve the correct margin and padding. Recommend to use only along side `readonly`. | boolean | -      | -       |
-| **readonly**                                                        | Toggle the readonly state for the component.                                                                                                                                | boolean | -      | -       |
-| **text** <br><div class="badge bg-primary">4.3.0+</div>             | Add helper text to the component.                                                                                                                                           | string  | -      | -       |
-| **tooltip-feedback** <br><div class="badge bg-primary">4.3.0+</div> | Display validation feedback in a styled tooltip.                                                                                                                            | boolean | -      | -       |
-| **valid**                                                           | Set component validation state to valid.                                                                                                                                    | boolean | -      | -       |
-
-#### Events
-
-| Event name            | Description                                                                    | Properties |
-| --------------------- | ------------------------------------------------------------------------------ | ---------- |
-| **change**            | Event occurs when the element loses focus, after the content has been changed. |
-| **input**             | Event occurs immediately after the value of a component has changed.           |
-| **update:modelValue** | Emit the new value whenever there’s an input or change event.                  |
diff --git a/packages/docs/api/form/CInputGroup.api.md b/packages/docs/api/form/CInputGroup.api.md
deleted file mode 100644
index 128ce4f1..00000000
--- a/packages/docs/api/form/CInputGroup.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CInputGroup
-
-```jsx
-import { CInputGroup } from '@coreui/vue'
-// or
-import CInputGroup from '@coreui/vue/src/components/form/CInputGroup'
-```
-
-#### Props
-
-| Prop name | Description                        | Type   | Values         | Default |
-| --------- | ---------------------------------- | ------ | -------------- | ------- |
-| **size**  | Size the component small or large. | string | `'sm'`, `'lg'` | -       |
diff --git a/packages/docs/api/form/CInputGroupText.api.md b/packages/docs/api/form/CInputGroupText.api.md
deleted file mode 100644
index 09998a59..00000000
--- a/packages/docs/api/form/CInputGroupText.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CInputGroupText
-
-```jsx
-import { CInputGroupText } from '@coreui/vue'
-// or
-import CInputGroupText from '@coreui/vue/src/components/form/CInputGroupText'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'span'  |
diff --git a/packages/docs/api/grid/CCol.api.md b/packages/docs/api/grid/CCol.api.md
deleted file mode 100644
index 7ba17d00..00000000
--- a/packages/docs/api/grid/CCol.api.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### CCol
-
-```jsx
-import { CCol } from '@coreui/vue'
-// or
-import CCol from '@coreui/vue/src/components/grid/CCol'
-```
-
-#### Props
-
-| Prop name | Description                                                         | Type | Values                                                                                                                                                                         | Default |
-| --------- | ------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
-| **xs**    | The number of columns/offset/order on extra small devices (<576px). | Col  | `'auto' \| number \| string \| boolean \| { span: 'auto' \| number \| string \| boolean } \| { offset: number \| string } \| { order: 'first' \| 'last' \| number \| string }` | -       |
-| **sm**    | The number of columns/offset/order on small devices (<768px).       | Col  | `'auto' \| number \| string \| boolean \| { span: 'auto' \| number \| string \| boolean } \| { offset: number \| string } \| { order: 'first' \| 'last' \| number \| string }` | -       |
-| **md**    | The number of columns/offset/order on medium devices (<992px).      | Col  | `'auto' \| number \| string \| boolean \| { span: 'auto' \| number \| string \| boolean } \| { offset: number \| string } \| { order: 'first' \| 'last' \| number \| string }` | -       |
-| **lg**    | The number of columns/offset/order on large devices (<1200px).      | Col  | `'auto' \| number \| string \| boolean \| { span: 'auto' \| number \| string \| boolean } \| { offset: number \| string } \| { order: 'first' \| 'last' \| number \| string }` | -       |
-| **xl**    | The number of columns/offset/order on X-Large devices (<1400px).    | Col  | `'auto' \| number \| string \| boolean \| { span: 'auto' \| number \| string \| boolean } \| { offset: number \| string } \| { order: 'first' \| 'last' \| number \| string }` | -       |
-| **xxl**   | The number of columns/offset/order on XX-Large devices (≥1400px).   | Col  | `'auto' \| number \| string \| boolean \| { span: 'auto' \| number \| string \| boolean } \| { offset: number \| string } \| { order: 'first' \| 'last' \| number \| string }` | -       |
diff --git a/packages/docs/api/grid/CContainer.api.md b/packages/docs/api/grid/CContainer.api.md
deleted file mode 100644
index fc321b95..00000000
--- a/packages/docs/api/grid/CContainer.api.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### CContainer
-
-```jsx
-import { CContainer } from '@coreui/vue'
-// or
-import CContainer from '@coreui/vue/src/components/grid/CContainer'
-```
-
-#### Props
-
-| Prop name | Description                                                         | Type    | Values | Default |
-| --------- | ------------------------------------------------------------------- | ------- | ------ | ------- |
-| **sm**    | Set container 100% wide until small breakpoint.                     | boolean | -      | -       |
-| **md**    | Set container 100% wide until medium breakpoint.                    | boolean | -      | -       |
-| **lg**    | Set container 100% wide until large breakpoint.                     | boolean | -      | -       |
-| **xl**    | Set container 100% wide until X-large breakpoint.                   | boolean | -      | -       |
-| **xxl**   | Set container 100% wide until XX-large breakpoint.                  | boolean | -      | -       |
-| **fluid** | Set container 100% wide, spanning the entire width of the viewport. | boolean | -      | -       |
diff --git a/packages/docs/api/grid/CRow.api.md b/packages/docs/api/grid/CRow.api.md
deleted file mode 100644
index 9510684e..00000000
--- a/packages/docs/api/grid/CRow.api.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### CRow
-
-```jsx
-import { CRow } from '@coreui/vue'
-// or
-import CRow from '@coreui/vue/src/components/grid/CRow'
-```
-
-#### Props
-
-| Prop name | Description                                                         | Type                     | Values                                                                                                                                   | Default |
-| --------- | ------------------------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| **xs**    | The number of columns/offset/order on extra small devices (<576px). | Object as () => BPObject | `{ cols: 'auto' \| number \| string } \| { gutter: number \| string } \| { gutterX: number \| string } \| { gutterY: number \| string }` | -       |
-| **sm**    | The number of columns/offset/order on small devices (<768px).       | Object as () => BPObject | `{ cols: 'auto' \| number \| string } \| { gutter: number \| string } \| { gutterX: number \| string } \| { gutterY: number \| string }` | -       |
-| **md**    | The number of columns/offset/order on medium devices (<992px).      | Object as () => BPObject | `{ cols: 'auto' \| number \| string } \| { gutter: number \| string } \| { gutterX: number \| string } \| { gutterY: number \| string }` | -       |
-| **lg**    | The number of columns/offset/order on large devices (<1200px).      | Object as () => BPObject | `{ cols: 'auto' \| number \| string } \| { gutter: number \| string } \| { gutterX: number \| string } \| { gutterY: number \| string }` | -       |
-| **xl**    | The number of columns/offset/order on X-Large devices (<1400px).    | Object as () => BPObject | `{ cols: 'auto' \| number \| string } \| { gutter: number \| string } \| { gutterX: number \| string } \| { gutterY: number \| string }` | -       |
-| **xxl**   | The number of columns/offset/order on XX-Large devices (≥1400px).   | Object as () => BPObject | `{ cols: 'auto' \| number \| string } \| { gutter: number \| string } \| { gutterX: number \| string } \| { gutterY: number \| string }` | -       |
diff --git a/packages/docs/api/header/CHeader.api.md b/packages/docs/api/header/CHeader.api.md
deleted file mode 100644
index f47ab627..00000000
--- a/packages/docs/api/header/CHeader.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CHeader
-
-```jsx
-import { CHeader } from '@coreui/vue'
-// or
-import CHeader from '@coreui/vue/src/components/header/CHeader'
-```
-
-#### Props
-
-| Prop name     | Description                                                                             | Type            | Values                                                        | Default |
-| ------------- | --------------------------------------------------------------------------------------- | --------------- | ------------------------------------------------------------- | ------- |
-| **as**        | Component used for the root node. Either a string to use a HTML element or a component. | string          | -                                                             | 'div'   |
-| **container** | Defines optional container wrapping children elements.                                  | boolean\|string | `boolean`, `'sm'`, `'md'`, `'lg'`, `'xl'`, `'xxl'`, `'fluid'` | -       |
-| **position**  | Place header in non-static positions.                                                   | string          | `'fixed'`, `'sticky'`                                         | -       |
diff --git a/packages/docs/api/header/CHeaderBrand.api.md b/packages/docs/api/header/CHeaderBrand.api.md
deleted file mode 100644
index 9249d0a0..00000000
--- a/packages/docs/api/header/CHeaderBrand.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CHeaderBrand
-
-```jsx
-import { CHeaderBrand } from '@coreui/vue'
-// or
-import CHeaderBrand from '@coreui/vue/src/components/header/CHeaderBrand'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'a'     |
diff --git a/packages/docs/api/header/CHeaderDivider.api.md b/packages/docs/api/header/CHeaderDivider.api.md
deleted file mode 100644
index d1b28fb9..00000000
--- a/packages/docs/api/header/CHeaderDivider.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CHeaderDivider
-
-```jsx
-import { CHeaderDivider } from '@coreui/vue'
-// or
-import CHeaderDivider from '@coreui/vue/src/components/header/CHeaderDivider'
-```
diff --git a/packages/docs/api/header/CHeaderNav.api.md b/packages/docs/api/header/CHeaderNav.api.md
deleted file mode 100644
index dde286f0..00000000
--- a/packages/docs/api/header/CHeaderNav.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CHeaderNav
-
-```jsx
-import { CHeaderNav } from '@coreui/vue'
-// or
-import CHeaderNav from '@coreui/vue/src/components/header/CHeaderNav'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'ul'    |
diff --git a/packages/docs/api/header/CHeaderText.api.md b/packages/docs/api/header/CHeaderText.api.md
deleted file mode 100644
index 3c989326..00000000
--- a/packages/docs/api/header/CHeaderText.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CHeaderText
-
-```jsx
-import { CHeaderText } from '@coreui/vue'
-// or
-import CHeaderText from '@coreui/vue/src/components/header/CHeaderText'
-```
diff --git a/packages/docs/api/header/CHeaderToggler.api.md b/packages/docs/api/header/CHeaderToggler.api.md
deleted file mode 100644
index 8e01dac1..00000000
--- a/packages/docs/api/header/CHeaderToggler.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CHeaderToggler
-
-```jsx
-import { CHeaderToggler } from '@coreui/vue'
-// or
-import CHeaderToggler from '@coreui/vue/src/components/header/CHeaderToggler'
-```
diff --git a/packages/docs/api/image/CImage.api.md b/packages/docs/api/image/CImage.api.md
deleted file mode 100644
index bdbc187b..00000000
--- a/packages/docs/api/image/CImage.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CImage
-
-```jsx
-import { CImage } from '@coreui/vue'
-// or
-import CImage from '@coreui/vue/src/components/image/CImage'
-```
-
-#### Props
-
-| Prop name     | Description                                    | Type    | Values                         | Default |
-| ------------- | ---------------------------------------------- | ------- | ------------------------------ | ------- |
-| **align**     | Set the horizontal aligment.                   | string  | `'start'`, `'center'`, `'end'` | -       |
-| **fluid**     | Make image responsive.                         | boolean | -                              | -       |
-| **rounded**   | Make image rounded.                            | boolean | -                              | -       |
-| **thumbnail** | Give an image a rounded 1px border appearance. | boolean | -                              | -       |
diff --git a/packages/docs/api/link/CLink.api.md b/packages/docs/api/link/CLink.api.md
deleted file mode 100644
index ddf93047..00000000
--- a/packages/docs/api/link/CLink.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CLink
-
-```jsx
-import { CLink } from '@coreui/vue'
-// or
-import CLink from '@coreui/vue/src/components/link/CLink'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type    | Values | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **active**   | Toggle the active state for the component.                                              | boolean | -      | -       |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | 'a'     |
-| **disabled** | Toggle the disabled state for the component.                                            | boolean | -      | -       |
-| **href**     | The href attribute specifies the URL of the page the link goes to.                      | string  | -      | -       |
-
-#### Events
-
-| Event name | Description                                         | Properties |
-| ---------- | --------------------------------------------------- | ---------- |
-| **click**  | Event called when the user clicks on the component. |
diff --git a/packages/docs/api/list-group/CListGroup.api.md b/packages/docs/api/list-group/CListGroup.api.md
deleted file mode 100644
index 2a88b9d3..00000000
--- a/packages/docs/api/list-group/CListGroup.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CListGroup
-
-```jsx
-import { CListGroup } from '@coreui/vue'
-// or
-import CListGroup from '@coreui/vue/src/components/list-group/CListGroup'
-```
-
-#### Props
-
-| Prop name  | Description                                                                                                             | Type    | Values                                                                                                             | Default |
-| ---------- | ----------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------ | ------- |
-| **as**     | Component used for the root node. Either a string to use a HTML element or a component.                                 | string  | -                                                                                                                  | 'ul'    |
-| **flush**  | Remove some borders and rounded corners to render list group items edge-to-edge in a parent component (e.g., `<CCard>`) | boolean | -                                                                                                                  | -       |
-| **layout** | Specify a layout type.                                                                                                  | string  | `'horizontal'`, `'horizontal-sm'`, `'horizontal-md'`, `'horizontal-lg'`, `'horizontal-xl'`, `'horizontal-xxl'`, `` | -       |
diff --git a/packages/docs/api/list-group/CListGroupItem.api.md b/packages/docs/api/list-group/CListGroupItem.api.md
deleted file mode 100644
index a5eddd7a..00000000
--- a/packages/docs/api/list-group/CListGroupItem.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CListGroupItem
-
-```jsx
-import { CListGroupItem } from '@coreui/vue'
-// or
-import CListGroupItem from '@coreui/vue/src/components/list-group/CListGroupItem'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type    | Values                                                                                                    | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ------- |
-| **active**   | Toggle the active state for the component.                                              | boolean | -                                                                                                         | -       |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string  | -                                                                                                         | 'li'    |
-| **color**    | Sets the color context of the component to one of CoreUI’s themed colors.               | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
-| **disabled** | Toggle the disabled state for the component.                                            | boolean | -                                                                                                         | -       |
diff --git a/packages/docs/api/modal/CModal.api.md b/packages/docs/api/modal/CModal.api.md
deleted file mode 100644
index 6f201012..00000000
--- a/packages/docs/api/modal/CModal.api.md
+++ /dev/null
@@ -1,33 +0,0 @@
-### CModal
-
-```jsx
-import { CModal } from '@coreui/vue'
-// or
-import CModal from '@coreui/vue/src/components/modal/CModal'
-```
-
-#### Props
-
-| Prop name                                                    | Description                                                                                                                                        | Type                                         | Values                                             | Default |
-| ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | -------------------------------------------------- | ------- |
-| **alignment**                                                | Align the modal in the center or top of the screen.                                                                                                | string                                       | `'top'`, `'center'`                                | 'top'   |
-| **backdrop**                                                 | Apply a backdrop on body while offcanvas is open.                                                                                                  | boolean\|string                              | `boolean \| 'static'`                              | true    |
-| **container** <br><div class="badge bg-primary">5.3.0+</div> | Appends the vue popover to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`. | HTMLElement \| (() => HTMLElement) \| string | -                                                  | 'body'  |
-| **content-class-name**                                       | A string of all className you want applied to the modal content component.                                                                         | string                                       | -                                                  | -       |
-| **focus** <br><div class="badge bg-primary">5.0.0+</div>     | Puts the focus on the modal when shown.                                                                                                            | boolean                                      | -                                                  | true    |
-| **fullscreen**                                               | Set modal to covers the entire user viewport                                                                                                       | boolean\|string                              | `boolean`, `'sm'`, `'md'`, `'lg'`, `'xl'`, `'xxl'` | -       |
-| **keyboard**                                                 | Closes the modal when escape key is pressed.                                                                                                       | boolean                                      | -                                                  | true    |
-| **scrollable**                                               | Create a scrollable modal that allows scrolling the modal body.                                                                                    | boolean                                      | -                                                  | -       |
-| **size**                                                     | Size the component small, large, or extra large.                                                                                                   | string                                       | `'sm'`, `'lg'`, `'xl'`                             | -       |
-| **teleport** <br><div class="badge bg-primary">5.3.0+</div>  | Generates modal using Teleport.                                                                                                                    | boolean                                      | -                                                  | false   |
-| **transition**                                               | Remove animation to create modal that simply appear rather than fade in to view.                                                                   | boolean                                      | -                                                  | true    |
-| **unmount-on-close**                                         | By default the component is unmounted after close animation, if you want to keep the component mounted set this property to false.                 | boolean                                      | -                                                  | true    |
-| **visible**                                                  | Toggle the visibility of alert component.                                                                                                          | boolean                                      | -                                                  | -       |
-
-#### Events
-
-| Event name          | Description                                                                                                                                                             | Properties |
-| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
-| **close**           | Callback fired when the component requests to be closed.                                                                                                                |
-| **close-prevented** | Callback fired when the component requests to be closed.                                                                                                                |
-| **show**            | Callback fired when the modal is shown, its backdrop is static and a click outside the modal or an escape key press is performed with the keyboard option set to false. |
diff --git a/packages/docs/api/modal/CModalBody.api.md b/packages/docs/api/modal/CModalBody.api.md
deleted file mode 100644
index 17e58f45..00000000
--- a/packages/docs/api/modal/CModalBody.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CModalBody
-
-```jsx
-import { CModalBody } from '@coreui/vue'
-// or
-import CModalBody from '@coreui/vue/src/components/modal/CModalBody'
-```
diff --git a/packages/docs/api/modal/CModalFooter.api.md b/packages/docs/api/modal/CModalFooter.api.md
deleted file mode 100644
index 265a5090..00000000
--- a/packages/docs/api/modal/CModalFooter.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CModalFooter
-
-```jsx
-import { CModalFooter } from '@coreui/vue'
-// or
-import CModalFooter from '@coreui/vue/src/components/modal/CModalFooter'
-```
diff --git a/packages/docs/api/modal/CModalHeader.api.md b/packages/docs/api/modal/CModalHeader.api.md
deleted file mode 100644
index caede3d5..00000000
--- a/packages/docs/api/modal/CModalHeader.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CModalHeader
-
-```jsx
-import { CModalHeader } from '@coreui/vue'
-// or
-import CModalHeader from '@coreui/vue/src/components/modal/CModalHeader'
-```
-
-#### Props
-
-| Prop name        | Description                                 | Type    | Values | Default |
-| ---------------- | ------------------------------------------- | ------- | ------ | ------- |
-| **close-button** | Add a close button component to the header. | boolean | -      | true    |
diff --git a/packages/docs/api/modal/CModalTitle.api.md b/packages/docs/api/modal/CModalTitle.api.md
deleted file mode 100644
index 93d9891a..00000000
--- a/packages/docs/api/modal/CModalTitle.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CModalTitle
-
-```jsx
-import { CModalTitle } from '@coreui/vue'
-// or
-import CModalTitle from '@coreui/vue/src/components/modal/CModalTitle'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'h5'    |
diff --git a/packages/docs/api/nav/CNav.api.md b/packages/docs/api/nav/CNav.api.md
deleted file mode 100644
index 37c9f02c..00000000
--- a/packages/docs/api/nav/CNav.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CNav
-
-```jsx
-import { CNav } from '@coreui/vue'
-// or
-import CNav from '@coreui/vue/src/components/nav/CNav'
-```
-
-#### Props
-
-| Prop name   | Description                                                                             | Type   | Values                                                                                     | Default |
-| ----------- | --------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------ | ------- |
-| **as**      | Component used for the root node. Either a string to use a HTML element or a component. | string | -                                                                                          | 'ul'    |
-| **layout**  | Specify a layout type for component.                                                    | string | `'fill'`, `'justified'`                                                                    | -       |
-| **variant** | Set the nav variant to tabs or pills.                                                   | string | `'enclosed'`, `'enclosed-pills'`, `'pills'`, `'tabs'`, `'underline'`, `'underline-border'` | -       |
diff --git a/packages/docs/api/nav/CNavGroup.api.md b/packages/docs/api/nav/CNavGroup.api.md
deleted file mode 100644
index 309a55c4..00000000
--- a/packages/docs/api/nav/CNavGroup.api.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### CNavGroup
-
-```jsx
-import { CNavGroup } from '@coreui/vue'
-// or
-import CNavGroup from '@coreui/vue/src/components/nav/CNavGroup'
-```
-
-#### Props
-
-| Prop name   | Description                                                                             | Type    | Values | Default |
-| ----------- | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **as**      | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | 'li'    |
-| **compact** | Make nav group more compact by cutting all `padding` in half.                           | boolean | -      | -       |
-| **visible** | Show nav group items.                                                                   | boolean | -      | -       |
-
-#### Events
-
-| Event name         | Description | Properties |
-| ------------------ | ----------- | ---------- |
-| **visible-change** |             |
diff --git a/packages/docs/api/nav/CNavGroupItems.api.md b/packages/docs/api/nav/CNavGroupItems.api.md
deleted file mode 100644
index c689a0e2..00000000
--- a/packages/docs/api/nav/CNavGroupItems.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CNavGroupItems
-
-```jsx
-import { CNavGroupItems } from '@coreui/vue'
-// or
-import CNavGroupItems from '@coreui/vue/src/components/nav/CNavGroupItems'
-```
diff --git a/packages/docs/api/nav/CNavItem.api.md b/packages/docs/api/nav/CNavItem.api.md
deleted file mode 100644
index 788b3792..00000000
--- a/packages/docs/api/nav/CNavItem.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CNavItem
-
-```jsx
-import { CNavItem } from '@coreui/vue'
-// or
-import CNavItem from '@coreui/vue/src/components/nav/CNavItem'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type    | Values | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **active**   | Toggle the active state for the component.                                              | boolean | -      | -       |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | 'li'    |
-| **class**    | A string of all className you want applied to the component.                            | string  | -      | -       |
-| **disabled** | Toggle the disabled state for the component.                                            | boolean | -      | -       |
diff --git a/packages/docs/api/nav/CNavLink.api.md b/packages/docs/api/nav/CNavLink.api.md
deleted file mode 100644
index 7e17ce27..00000000
--- a/packages/docs/api/nav/CNavLink.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CNavLink
-
-```jsx
-import { CNavLink } from '@coreui/vue'
-// or
-import CNavLink from '@coreui/vue/src/components/nav/CNavLink'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type    | Values | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **active**   | Toggle the active state for the component.                                              | boolean | -      | -       |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | 'a'     |
-| **disabled** | Toggle the disabled state for the component.                                            | boolean | -      | -       |
diff --git a/packages/docs/api/nav/CNavTitle.api.md b/packages/docs/api/nav/CNavTitle.api.md
deleted file mode 100644
index ce56c9b1..00000000
--- a/packages/docs/api/nav/CNavTitle.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CNavTitle
-
-```jsx
-import { CNavTitle } from '@coreui/vue'
-// or
-import CNavTitle from '@coreui/vue/src/components/nav/CNavTitle'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'li'    |
diff --git a/packages/docs/api/navbar/CNavbar.api.md b/packages/docs/api/navbar/CNavbar.api.md
deleted file mode 100644
index bc8d5c8b..00000000
--- a/packages/docs/api/navbar/CNavbar.api.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### CNavbar
-
-```jsx
-import { CNavbar } from '@coreui/vue'
-// or
-import CNavbar from '@coreui/vue/src/components/navbar/CNavbar'
-```
-
-#### Props
-
-| Prop name        | Description                                                                             | Type            | Values                                                                                                    | Default |
-| ---------------- | --------------------------------------------------------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------- | ------- |
-| **as**           | Component used for the root node. Either a string to use a HTML element or a component. | string          | -                                                                                                         | 'nav'   |
-| **color**        | Sets the color context of the component to one of CoreUI’s themed colors.               | string          | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
-| **color-scheme** | Sets if the color of text should be colored for a light or dark dark background.        | string          | `'dark'`, `'light'`                                                                                       | -       |
-| **container**    | Defines optional container wrapping children elements.                                  | boolean\|string | `boolean`, `'sm'`, `'md'`, `'lg'`, `'xl'`, `'xxl'`, `'fluid'`                                             | -       |
-| **expand**       | Defines the responsive breakpoint to determine when content collapses.                  | boolean\|string | `boolean`, `'sm'`, `'md'`, `'lg'`, `'xl'`, `'xxl'`                                                        | -       |
-| **placement**    | Place component in non-static positions.                                                | string          | `'fixed-top'`, `'fixed-bottom'`, `'sticky-top'`                                                           | -       |
diff --git a/packages/docs/api/navbar/CNavbarBrand.api.md b/packages/docs/api/navbar/CNavbarBrand.api.md
deleted file mode 100644
index de415ed5..00000000
--- a/packages/docs/api/navbar/CNavbarBrand.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CNavbarBrand
-
-```jsx
-import { CNavbarBrand } from '@coreui/vue'
-// or
-import CNavbarBrand from '@coreui/vue/src/components/navbar/CNavbarBrand'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'a'     |
-| **href**  | The href attribute specifies the URL of the page the link goes to.                      | string | -      | -       |
diff --git a/packages/docs/api/navbar/CNavbarNav.api.md b/packages/docs/api/navbar/CNavbarNav.api.md
deleted file mode 100644
index ce7da6a2..00000000
--- a/packages/docs/api/navbar/CNavbarNav.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CNavbarNav
-
-```jsx
-import { CNavbarNav } from '@coreui/vue'
-// or
-import CNavbarNav from '@coreui/vue/src/components/navbar/CNavbarNav'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'ul'    |
diff --git a/packages/docs/api/navbar/CNavbarText.api.md b/packages/docs/api/navbar/CNavbarText.api.md
deleted file mode 100644
index fe71eefd..00000000
--- a/packages/docs/api/navbar/CNavbarText.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CNavbarText
-
-```jsx
-import { CNavbarText } from '@coreui/vue'
-// or
-import CNavbarText from '@coreui/vue/src/components/navbar/CNavbarText'
-```
diff --git a/packages/docs/api/navbar/CNavbarToggler.api.md b/packages/docs/api/navbar/CNavbarToggler.api.md
deleted file mode 100644
index a709a452..00000000
--- a/packages/docs/api/navbar/CNavbarToggler.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CNavbarToggler
-
-```jsx
-import { CNavbarToggler } from '@coreui/vue'
-// or
-import CNavbarToggler from '@coreui/vue/src/components/navbar/CNavbarToggler'
-```
diff --git a/packages/docs/api/offcanvas/COffcanvas.api.md b/packages/docs/api/offcanvas/COffcanvas.api.md
deleted file mode 100644
index 130ab67f..00000000
--- a/packages/docs/api/offcanvas/COffcanvas.api.md
+++ /dev/null
@@ -1,26 +0,0 @@
-### COffcanvas
-
-```jsx
-import { COffcanvas } from '@coreui/vue'
-// or
-import COffcanvas from '@coreui/vue/src/components/offcanvas/COffcanvas'
-```
-
-#### Props
-
-| Prop name                                                     | Description                                                                                           | Type            | Values                                             | Default |
-| ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------- | -------------------------------------------------- | ------- |
-| **backdrop**                                                  | Apply a backdrop on body while offcanvas is open.                                                     | boolean\|string | `boolean \| 'static'`                              | true    |
-| **dark**                                                      | Sets a darker color scheme.                                                                           | boolean         | -                                                  | -       |
-| **keyboard**                                                  | Closes the offcanvas when escape key is pressed.                                                      | boolean         | -                                                  | true    |
-| **placement**                                                 | Components placement, there’s no default placement.                                                   | string          | `'start'`, `'end'`, `'top'`, `'bottom'`            | -       |
-| **responsive** <br><div class="badge bg-primary">4.7.0+</div> | Responsive offcanvas property hide content outside the viewport from a specified breakpoint and down. | boolean\|string | `boolean \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'xxl'` | true    |
-| **scroll**                                                    | Allow body scrolling while offcanvas is open                                                          | boolean         | -                                                  | false   |
-| **visible**                                                   | Toggle the visibility of offcanvas component.                                                         | boolean         | -                                                  | false   |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/offcanvas/COffcanvasBody.api.md b/packages/docs/api/offcanvas/COffcanvasBody.api.md
deleted file mode 100644
index 012b209e..00000000
--- a/packages/docs/api/offcanvas/COffcanvasBody.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### COffcanvasBody
-
-```jsx
-import { COffcanvasBody } from '@coreui/vue'
-// or
-import COffcanvasBody from '@coreui/vue/src/components/offcanvas/COffcanvasBody'
-```
diff --git a/packages/docs/api/offcanvas/COffcanvasHeader.api.md b/packages/docs/api/offcanvas/COffcanvasHeader.api.md
deleted file mode 100644
index 97e87d66..00000000
--- a/packages/docs/api/offcanvas/COffcanvasHeader.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### COffcanvasHeader
-
-```jsx
-import { COffcanvasHeader } from '@coreui/vue'
-// or
-import COffcanvasHeader from '@coreui/vue/src/components/offcanvas/COffcanvasHeader'
-```
diff --git a/packages/docs/api/offcanvas/COffcanvasTitle.api.md b/packages/docs/api/offcanvas/COffcanvasTitle.api.md
deleted file mode 100644
index f920006c..00000000
--- a/packages/docs/api/offcanvas/COffcanvasTitle.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### COffcanvasTitle
-
-```jsx
-import { COffcanvasTitle } from '@coreui/vue'
-// or
-import COffcanvasTitle from '@coreui/vue/src/components/offcanvas/COffcanvasTitle'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'h5'    |
diff --git a/packages/docs/api/pagination/CPagination.api.md b/packages/docs/api/pagination/CPagination.api.md
deleted file mode 100644
index cfd5eb9c..00000000
--- a/packages/docs/api/pagination/CPagination.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CPagination
-
-```jsx
-import { CPagination } from '@coreui/vue'
-// or
-import CPagination from '@coreui/vue/src/components/pagination/CPagination'
-```
-
-#### Props
-
-| Prop name | Description                                 | Type   | Values                         | Default |
-| --------- | ------------------------------------------- | ------ | ------------------------------ | ------- |
-| **align** | Set the alignment of pagination components. | string | `'start'`, `'center'`, `'end'` | -       |
-| **size**  | Size the component small or large.          | string | `'sm'`, `'lg'`                 | -       |
diff --git a/packages/docs/api/pagination/CPaginationItem.api.md b/packages/docs/api/pagination/CPaginationItem.api.md
deleted file mode 100644
index ce607b0b..00000000
--- a/packages/docs/api/pagination/CPaginationItem.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CPaginationItem
-
-```jsx
-import { CPaginationItem } from '@coreui/vue'
-// or
-import CPaginationItem from '@coreui/vue/src/components/pagination/CPaginationItem'
-```
-
-#### Props
-
-| Prop name    | Description                                                                             | Type    | Values | Default |
-| ------------ | --------------------------------------------------------------------------------------- | ------- | ------ | ------- |
-| **active**   | Toggle the active state for the component.                                              | boolean | -      | -       |
-| **as**       | Component used for the root node. Either a string to use a HTML element or a component. | string  | -      | -       |
-| **disabled** | Toggle the disabled state for the component.                                            | boolean | -      | -       |
-| **href**     | The href attribute specifies the URL of the page the link goes to.                      | string  | -      | -       |
diff --git a/packages/docs/api/placeholder/CPlaceholder.api.md b/packages/docs/api/placeholder/CPlaceholder.api.md
deleted file mode 100644
index 074a0c57..00000000
--- a/packages/docs/api/placeholder/CPlaceholder.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CPlaceholder
-
-```jsx
-import { CPlaceholder } from '@coreui/vue'
-// or
-import CPlaceholder from '@coreui/vue/src/components/placeholder/CPlaceholder'
-```
-
-#### Props
-
-| Prop name     | Description                                                                             | Type   | Values                                                                                          | Default |
-| ------------- | --------------------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------- | ------- |
-| **animation** | Set animation type to better convey the perception of something being actively loaded.  | string | `'glow'`, `'wave'`                                                                              | -       |
-| **as**        | Component used for the root node. Either a string to use a HTML element or a component. | string | -                                                                                               | 'span'  |
-| **color**     | Sets the color context of the component to one of CoreUI’s themed colors.               | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **size**      | Size the component extra small, small, or large.                                        | string | `'xs'`, `'sm'`, `'lg'`                                                                          | -       |
-| **xs**        | The number of columns on extra small devices (<576px).                                  | number | -                                                                                               | -       |
-| **sm**        | The number of columns on small devices (<768px).                                        | number | -                                                                                               | -       |
-| **md**        | The number of columns on medium devices (<992px).                                       | number | -                                                                                               | -       |
-| **lg**        | The number of columns on large devices (<1200px).                                       | number | -                                                                                               | -       |
-| **xl**        | The number of columns on X-Large devices (<1400px).                                     | number | -                                                                                               | -       |
-| **xxl**       | The number of columns on XX-Large devices (≥1400px).                                    | number | -                                                                                               | -       |
diff --git a/packages/docs/api/popover/CPopover.api.md b/packages/docs/api/popover/CPopover.api.md
deleted file mode 100644
index 725e4846..00000000
--- a/packages/docs/api/popover/CPopover.api.md
+++ /dev/null
@@ -1,29 +0,0 @@
-### CPopover
-
-```jsx
-import { CPopover } from '@coreui/vue'
-// or
-import CPopover from '@coreui/vue/src/components/popover/CPopover'
-```
-
-#### Props
-
-| Prop name                                                              | Description                                                                                                                                                                                                                                                     | Type                                         | Values                          | Default                                  |
-| ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------- | ---------------------------------------- |
-| **animation** <br><div class="badge bg-primary">4.9.0+</div>           | Apply a CSS fade transition to the popover.                                                                                                                                                                                                                     | boolean                                      | -                               | true                                     |
-| **container** <br><div class="badge bg-primary">5.0.0+</div>           | Appends the vue popover to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.                                                                                                              | HTMLElement \| (() => HTMLElement) \| string | -                               | 'body'                                   |
-| **content**                                                            | Content for your component. If you want to pass non-string value please use dedicated slot `<template #content>...</template>`                                                                                                                                  | string                                       | -                               | -                                        |
-| **delay** <br><div class="badge bg-primary">4.9.0+</div>               | The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`. | number \| { show: number; hide: number }     | -                               | 0                                        |
-| **fallback-placements** <br><div class="badge bg-primary">4.9.0+</div> | Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.                                                                                                       | Placements \| Placements[]                   | -                               | () => ['top', 'right', 'bottom', 'left'] |
-| **offset**                                                             | Offset of the popover relative to its target.                                                                                                                                                                                                                   | array                                        | -                               | [0, 8]                                   |
-| **placement**                                                          | Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.                                                                                            | Placement                                    | -                               | 'top'                                    |
-| **title**                                                              | Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`                                                                                                                                      | string                                       | -                               | -                                        |
-| **trigger**                                                            | Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.                                                                                                                                             | Triggers \| Triggers[]                       | `'click'`, `'focus'`, `'hover'` | 'click'                                  |
-| **visible**                                                            | Toggle the visibility of popover component.                                                                                                                                                                                                                     | boolean                                      | -                               | -                                        |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/progress/CProgress.api.md b/packages/docs/api/progress/CProgress.api.md
deleted file mode 100644
index 1236b6ba..00000000
--- a/packages/docs/api/progress/CProgress.api.md
+++ /dev/null
@@ -1,20 +0,0 @@
-### CProgress
-
-```jsx
-import { CProgress } from '@coreui/vue'
-// or
-import CProgress from '@coreui/vue/src/components/progress/CProgress'
-```
-
-#### Props
-
-| Prop name                                                                  | Description                                                                                                               | Type    | Values                                                                                          | Default |
-| -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------- | ------- |
-| **animated**                                                               | Use to animate the stripes right to left via CSS3 animations.                                                             | boolean | -                                                                                               | -       |
-| **color**                                                                  | Sets the color context of the component to one of CoreUI’s themed colors.                                                 | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **height**                                                                 | Sets the height of the component. If you set that value the inner `<CProgressBar>` will automatically resize accordingly. | number  | -                                                                                               | -       |
-| **progress-bar-class-name** <br><div class="badge bg-primary">5.0.0+</div> | A string of all className you want applied to the <CProgressBar/> component.                                              | string  | -                                                                                               | -       |
-| **thin**                                                                   | Makes progress bar thinner.                                                                                               | boolean | -                                                                                               | -       |
-| **value**                                                                  | The percent to progress the ProgressBar.                                                                                  | number  | -                                                                                               | 0       |
-| **variant**                                                                | Set the progress bar variant to optional striped.                                                                         | string  | `'striped'`                                                                                     | -       |
-| **white**                                                                  | Change the default color to white.                                                                                        | boolean | -                                                                                               | -       |
diff --git a/packages/docs/api/progress/CProgressBar.api.md b/packages/docs/api/progress/CProgressBar.api.md
deleted file mode 100644
index efff5775..00000000
--- a/packages/docs/api/progress/CProgressBar.api.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### CProgressBar
-
-```jsx
-import { CProgressBar } from '@coreui/vue'
-// or
-import CProgressBar from '@coreui/vue/src/components/progress/CProgressBar'
-```
-
-#### Props
-
-| Prop name    | Description                                                               | Type    | Values                                                                                          | Default |
-| ------------ | ------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------- | ------- |
-| **animated** | Use to animate the stripes right to left via CSS3 animations.             | boolean | -                                                                                               | -       |
-| **color**    | Sets the color context of the component to one of CoreUI’s themed colors. | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **value**    | The percent to progress the ProgressBar.                                  | number  | -                                                                                               | 0       |
-| **variant**  | Set the progress bar variant to optional striped.                         | string  | `'striped'`                                                                                     | -       |
diff --git a/packages/docs/api/progress/CProgressStacked.api.md b/packages/docs/api/progress/CProgressStacked.api.md
deleted file mode 100644
index 8faf5158..00000000
--- a/packages/docs/api/progress/CProgressStacked.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CProgressStacked
-
-```jsx
-import { CProgressStacked } from '@coreui/vue'
-// or
-import CProgressStacked from '@coreui/vue/src/components/progress/CProgressStacked'
-```
diff --git a/packages/docs/api/sidebar/CSidebar.api.md b/packages/docs/api/sidebar/CSidebar.api.md
deleted file mode 100644
index 94a678d8..00000000
--- a/packages/docs/api/sidebar/CSidebar.api.md
+++ /dev/null
@@ -1,28 +0,0 @@
-### CSidebar
-
-```jsx
-import { CSidebar } from '@coreui/vue'
-// or
-import CSidebar from '@coreui/vue/src/components/sidebar/CSidebar'
-```
-
-#### Props
-
-| Prop name        | Description                                                                      | Type    | Values             | Default |
-| ---------------- | -------------------------------------------------------------------------------- | ------- | ------------------ | ------- |
-| **color-scheme** | Sets if the color of text should be colored for a light or dark dark background. | string  | `'dark'`, `light'` | -       |
-| **narrow**       | Make sidebar narrow.                                                             | boolean | -                  | -       |
-| **overlaid**     | Set sidebar to overlaid variant.                                                 | boolean | -                  | -       |
-| **placement**    | Components placement, there’s no default placement.                              | string  | `'start'`, `'end'` | -       |
-| **position**     | Place sidebar in non-static positions.                                           | string  | -                  | -       |
-| **size**         | Size the component small, large, or extra large.                                 | string  | -                  | -       |
-| **unfoldable**   | Expand narrowed sidebar on hover.                                                | boolean | -                  | -       |
-| **visible**      | Toggle the visibility of sidebar component.                                      | boolean | -                  | -       |
-
-#### Events
-
-| Event name         | Description                                              | Properties |
-| ------------------ | -------------------------------------------------------- | ---------- |
-| **hide**           | Callback fired when the component requests to be hidden. |
-| **show**           | Callback fired when the component requests to be shown.  |
-| **visible-change** | Event emitted after visibility of component changed.     |
diff --git a/packages/docs/api/sidebar/CSidebarBrand.api.md b/packages/docs/api/sidebar/CSidebarBrand.api.md
deleted file mode 100644
index 9819a335..00000000
--- a/packages/docs/api/sidebar/CSidebarBrand.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CSidebarBrand
-
-```jsx
-import { CSidebarBrand } from '@coreui/vue'
-// or
-import CSidebarBrand from '@coreui/vue/src/components/sidebar/CSidebarBrand'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | 'div'   |
-| **href**  | The href attribute specifies the URL of the page the link goes to.                      | string | -      | -       |
diff --git a/packages/docs/api/sidebar/CSidebarFooter.api.md b/packages/docs/api/sidebar/CSidebarFooter.api.md
deleted file mode 100644
index baa1fb7e..00000000
--- a/packages/docs/api/sidebar/CSidebarFooter.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CSidebarFooter
-
-```jsx
-import { CSidebarFooter } from '@coreui/vue'
-// or
-import CSidebarFooter from '@coreui/vue/src/components/sidebar/CSidebarFooter'
-```
diff --git a/packages/docs/api/sidebar/CSidebarHeader.api.md b/packages/docs/api/sidebar/CSidebarHeader.api.md
deleted file mode 100644
index efe7681a..00000000
--- a/packages/docs/api/sidebar/CSidebarHeader.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CSidebarHeader
-
-```jsx
-import { CSidebarHeader } from '@coreui/vue'
-// or
-import CSidebarHeader from '@coreui/vue/src/components/sidebar/CSidebarHeader'
-```
diff --git a/packages/docs/api/sidebar/CSidebarNav.api.md b/packages/docs/api/sidebar/CSidebarNav.api.md
deleted file mode 100644
index fdfa8a1c..00000000
--- a/packages/docs/api/sidebar/CSidebarNav.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CSidebarNav
-
-```jsx
-import { CSidebarNav } from '@coreui/vue'
-// or
-import CSidebarNav from '@coreui/vue/src/components/sidebar/CSidebarNav'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type                | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------------------- | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string \| Component | -      | 'ul'    |
diff --git a/packages/docs/api/sidebar/CSidebarToggler.api.md b/packages/docs/api/sidebar/CSidebarToggler.api.md
deleted file mode 100644
index 00af2ff5..00000000
--- a/packages/docs/api/sidebar/CSidebarToggler.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CSidebarToggler
-
-```jsx
-import { CSidebarToggler } from '@coreui/vue'
-// or
-import CSidebarToggler from '@coreui/vue/src/components/sidebar/CSidebarToggler'
-```
diff --git a/packages/docs/api/spinner/CSpinner.api.md b/packages/docs/api/spinner/CSpinner.api.md
deleted file mode 100644
index 2ff979b7..00000000
--- a/packages/docs/api/spinner/CSpinner.api.md
+++ /dev/null
@@ -1,17 +0,0 @@
-### CSpinner
-
-```jsx
-import { CSpinner } from '@coreui/vue'
-// or
-import CSpinner from '@coreui/vue/src/components/spinner/CSpinner'
-```
-
-#### Props
-
-| Prop name                 | Description                                                                             | Type   | Values                                                                                          | Default      |
-| ------------------------- | --------------------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------- | ------------ |
-| **as**                    | Component used for the root node. Either a string to use a HTML element or a component. | string | -                                                                                               | 'div'        |
-| **color**                 | Sets the color context of the component to one of CoreUI’s themed colors.               | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -            |
-| **size**                  | Size the component small.                                                               | string | `'sm'`                                                                                          | -            |
-| **variant**               | Set the button variant to an outlined button or a ghost button.                         | string | `'border'`, `'grow'`                                                                            | 'border'     |
-| **visually-hidden-label** | Set visually hidden label for accessibility purposes.                                   | string | -                                                                                               | 'Loading...' |
diff --git a/packages/docs/api/stepper/CStepper.api.md b/packages/docs/api/stepper/CStepper.api.md
deleted file mode 100644
index e13e9c9a..00000000
--- a/packages/docs/api/stepper/CStepper.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CStepper
-
-```jsx
-import { CStepper } from '@coreui/vue'
-// or
-import CStepper from '@coreui/vue/src/components/stepper/CStepper'
-```
-
-#### Props
-
-| Prop name | Description | Type | Values | Default |
-| --------- | ----------- | ---- | ------ | ------- |
-
-#### Events
-
-| Event name                   | Description | Properties |
-| ---------------------------- | ----------- | ---------- |
-| **update:modelValue**        |             |
-| **finish**                   |             |
-| **reset**                    |             |
-| **step-change**              |             |
-| **step-validation-complete** |             |
diff --git a/packages/docs/api/table/CTable.api.md b/packages/docs/api/table/CTable.api.md
deleted file mode 100644
index d66ae093..00000000
--- a/packages/docs/api/table/CTable.api.md
+++ /dev/null
@@ -1,28 +0,0 @@
-### CTable
-
-```jsx
-import { CTable } from '@coreui/vue'
-// or
-import CTable from '@coreui/vue/src/components/table/CTable'
-```
-
-#### Props
-
-| Prop name                                                           | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | Type                     | Values                                                                                                    | Default |
-| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------- | ------- |
-| **align**                                                           | Set the vertical aligment.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | string                   | `'bottom'`, `'middle'`, `'top'`                                                                           | -       |
-| **border-color**                                                    | Sets the border color of the component to one of CoreUI’s themed colors.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | string                   | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`           | -       |
-| **bordered**                                                        | Add borders on all sides of the table and cells.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | boolean                  | -                                                                                                         | -       |
-| **borderless**                                                      | Remove borders on all sides of the table and cells.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | boolean                  | -                                                                                                         | -       |
-| **caption**                                                         | Put the `<caption>` on the top of the table.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | string                   | `'top' \| string`                                                                                         | -       |
-| **caption-top** <br><div class="badge bg-primary">4.5.0+</div>      | Set the text of the table caption and the caption on the top of the table.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | string                   | -                                                                                                         | -       |
-| **columns** <br><div class="badge bg-primary">4.5.0+</div>          | Prop for table columns configuration. If prop is not defined, table will display columns based on the first item keys, omitting keys that begins with underscore (e.g. '\_props')<br><br>In columns prop each array item represents one column. Item might be specified in two ways:<br>String: each item define column name equal to item value.<br>Object: item is object with following keys available as column configuration:<br>- key (required)(String) - define column name equal to item key.<br>- label (String) - define visible label of column. If not defined, label will be generated automatically based on column name, by converting kebab-case and snake_case to individual words and capitalization of each word.<br>- \_props (Object) - adds classes to all cels in column, ex. \_props: { scope: 'col', className: 'custom-class' },<br>- \_style (Object) - adds styles to the column header (useful for defining widths) | (Column \| string)[]     | -                                                                                                         | -       |
-| **color**                                                           | Sets the color context of the component to one of CoreUI’s themed colors.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | string                   | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
-| **footer** <br><div class="badge bg-primary">4.5.0+</div>           | Array of objects or strings, where each element represents one cell in the table footer.<br><br>Example items:<br>['FooterCell', 'FooterCell', 'FooterCell']<br>or<br>[{ label: 'FooterCell', _props: { color: 'success' }, ...]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | (FooterItem \| string)[] | -                                                                                                         | -       |
-| **hover**                                                           | Enable a hover state on table rows within a `<CTableBody>`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | boolean                  | -                                                                                                         | -       |
-| **items** <br><div class="badge bg-primary">4.5.0+</div>            | Array of objects, where each object represents one item - row in table. Additionally, you can add style classes to each row by passing them by '\_props' key and to single cell by '\_cellProps'.<br><br>Example item:<br>{ name: 'John' , age: 12, \_props: { color: 'success' }, \_cellProps: { age: { className: 'fw-bold'}}}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | Item[]                   | -                                                                                                         | -       |
-| **small**                                                           | Make table more compact by cutting all cell `padding` in half.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | boolean                  | -                                                                                                         | -       |
-| **striped**                                                         | Add zebra-striping to any table row within the `<CTableBody>`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | boolean                  | -                                                                                                         | -       |
-| **striped-columns** <br><div class="badge bg-primary">4.4.0+</div>  | Add zebra-striping to any table column.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | boolean                  | -                                                                                                         | -       |
-| **table-foot-props** <br><div class="badge bg-primary">4.5.0+</div> | Properties that will be passed to the table footer component.<br><br>Properties to [CTableFoot](#ctablefoot) component.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | object                   | -                                                                                                         | -       |
-| **table-head-props** <br><div class="badge bg-primary">4.5.0+</div> | Properties that will be passed to the table head component.<br><br> Properties to [CTableHead](#ctablehead) component.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | object                   | -                                                                                                         | -       |
diff --git a/packages/docs/api/table/CTableBody.api.md b/packages/docs/api/table/CTableBody.api.md
deleted file mode 100644
index 36042398..00000000
--- a/packages/docs/api/table/CTableBody.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CTableBody
-
-```jsx
-import { CTableBody } from '@coreui/vue'
-// or
-import CTableBody from '@coreui/vue/src/components/table/CTableBody'
-```
-
-#### Props
-
-| Prop name | Description                                                               | Type   | Values                                                                                                    | Default |
-| --------- | ------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- | ------- |
-| **color** | Sets the color context of the component to one of CoreUI’s themed colors. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
diff --git a/packages/docs/api/table/CTableCaption.api.md b/packages/docs/api/table/CTableCaption.api.md
deleted file mode 100644
index dea077aa..00000000
--- a/packages/docs/api/table/CTableCaption.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CTableCaption
-
-```jsx
-import { CTableCaption } from '@coreui/vue'
-// or
-import CTableCaption from '@coreui/vue/src/components/table/CTableCaption'
-```
diff --git a/packages/docs/api/table/CTableDataCell.api.md b/packages/docs/api/table/CTableDataCell.api.md
deleted file mode 100644
index b1409a32..00000000
--- a/packages/docs/api/table/CTableDataCell.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CTableDataCell
-
-```jsx
-import { CTableDataCell } from '@coreui/vue'
-// or
-import CTableDataCell from '@coreui/vue/src/components/table/CTableDataCell'
-```
-
-#### Props
-
-| Prop name  | Description                                                               | Type    | Values                                                                                                    | Default |
-| ---------- | ------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ------- |
-| **active** | Highlight a table row or cell.                                            | boolean | -                                                                                                         | -       |
-| **align**  | Set the vertical aligment.                                                | string  | `'bottom'`, `'middle'`, `'top'`                                                                           | -       |
-| **color**  | Sets the color context of the component to one of CoreUI’s themed colors. | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
diff --git a/packages/docs/api/table/CTableFoot.api.md b/packages/docs/api/table/CTableFoot.api.md
deleted file mode 100644
index b961f96c..00000000
--- a/packages/docs/api/table/CTableFoot.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CTableFoot
-
-```jsx
-import { CTableFoot } from '@coreui/vue'
-// or
-import CTableFoot from '@coreui/vue/src/components/table/CTableFoot'
-```
-
-#### Props
-
-| Prop name | Description                                                               | Type   | Values                                                                                                    | Default |
-| --------- | ------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- | ------- |
-| **color** | Sets the color context of the component to one of CoreUI’s themed colors. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
diff --git a/packages/docs/api/table/CTableHead.api.md b/packages/docs/api/table/CTableHead.api.md
deleted file mode 100644
index 5f7facc3..00000000
--- a/packages/docs/api/table/CTableHead.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CTableHead
-
-```jsx
-import { CTableHead } from '@coreui/vue'
-// or
-import CTableHead from '@coreui/vue/src/components/table/CTableHead'
-```
-
-#### Props
-
-| Prop name | Description                                                               | Type   | Values                                                                                                    | Default |
-| --------- | ------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- | ------- |
-| **color** | Sets the color context of the component to one of CoreUI’s themed colors. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
diff --git a/packages/docs/api/table/CTableHeaderCell.api.md b/packages/docs/api/table/CTableHeaderCell.api.md
deleted file mode 100644
index c1217162..00000000
--- a/packages/docs/api/table/CTableHeaderCell.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CTableHeaderCell
-
-```jsx
-import { CTableHeaderCell } from '@coreui/vue'
-// or
-import CTableHeaderCell from '@coreui/vue/src/components/table/CTableHeaderCell'
-```
-
-#### Props
-
-| Prop name | Description                                                               | Type   | Values                                                                                                    | Default |
-| --------- | ------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- | ------- |
-| **color** | Sets the color context of the component to one of CoreUI’s themed colors. | string | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
diff --git a/packages/docs/api/table/CTableRow.api.md b/packages/docs/api/table/CTableRow.api.md
deleted file mode 100644
index 19670a06..00000000
--- a/packages/docs/api/table/CTableRow.api.md
+++ /dev/null
@@ -1,15 +0,0 @@
-### CTableRow
-
-```jsx
-import { CTableRow } from '@coreui/vue'
-// or
-import CTableRow from '@coreui/vue/src/components/table/CTableRow'
-```
-
-#### Props
-
-| Prop name  | Description                                                               | Type    | Values                                                                                                    | Default |
-| ---------- | ------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ------- |
-| **active** | Highlight a table row or cell..                                           | boolean | -                                                                                                         | -       |
-| **align**  | Set the vertical aligment.                                                | string  | `'bottom'`, `'middle'`, `'top'`                                                                           | -       |
-| **color**  | Sets the color context of the component to one of CoreUI’s themed colors. | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
diff --git a/packages/docs/api/tabs/CTab.api.md b/packages/docs/api/tabs/CTab.api.md
deleted file mode 100644
index 7cdff394..00000000
--- a/packages/docs/api/tabs/CTab.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CTab
-
-```jsx
-import { CTab } from '@coreui/vue'
-// or
-import CTab from '@coreui/vue/src/components/tabs/CTab'
-```
-
-#### Props
-
-| Prop name                                                   | Description                                  | Type           | Values | Default |
-| ----------------------------------------------------------- | -------------------------------------------- | -------------- | ------ | ------- |
-| **disabled** <br><div class="badge bg-primary">5.4.0+</div> | Toggle the disabled state for the component. | boolean        | -      | -       |
-| **item-key**                                                | Item key.                                    | number\|string | -      | -       |
diff --git a/packages/docs/api/tabs/CTabContent.api.md b/packages/docs/api/tabs/CTabContent.api.md
deleted file mode 100644
index 788d2118..00000000
--- a/packages/docs/api/tabs/CTabContent.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CTabContent
-
-```jsx
-import { CTabContent } from '@coreui/vue'
-// or
-import CTabContent from '@coreui/vue/src/components/tabs/CTabContent'
-```
diff --git a/packages/docs/api/tabs/CTabList.api.md b/packages/docs/api/tabs/CTabList.api.md
deleted file mode 100644
index c12138af..00000000
--- a/packages/docs/api/tabs/CTabList.api.md
+++ /dev/null
@@ -1,14 +0,0 @@
-### CTabList
-
-```jsx
-import { CTabList } from '@coreui/vue'
-// or
-import CTabList from '@coreui/vue/src/components/tabs/CTabList'
-```
-
-#### Props
-
-| Prop name   | Description                           | Type   | Values                                                                                     | Default |
-| ----------- | ------------------------------------- | ------ | ------------------------------------------------------------------------------------------ | ------- |
-| **layout**  | Specify a layout type for component.  | string | `'fill'`, `'justified'`                                                                    | -       |
-| **variant** | Set the nav variant to tabs or pills. | string | `'enclosed'`, `'enclosed-pills'`, `'pills'`, `'tabs'`, `'underline'`, `'underline-border'` | -       |
diff --git a/packages/docs/api/tabs/CTabPane.api.md b/packages/docs/api/tabs/CTabPane.api.md
deleted file mode 100644
index 17eb0a59..00000000
--- a/packages/docs/api/tabs/CTabPane.api.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### CTabPane
-
-```jsx
-import { CTabPane } from '@coreui/vue'
-// or
-import CTabPane from '@coreui/vue/src/components/tabs/CTabPane'
-```
-
-#### Props
-
-| Prop name                                                     | Description                             | Type    | Values | Default |
-| ------------------------------------------------------------- | --------------------------------------- | ------- | ------ | ------- |
-| **transition** <br><div class="badge bg-primary">5.1.0+</div> | Enable fade in and fade out transition. | boolean | -      | true    |
-| **visible**                                                   | Toggle the visibility of component.     | boolean | -      | false   |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/tabs/CTabPanel.api.md b/packages/docs/api/tabs/CTabPanel.api.md
deleted file mode 100644
index bf254378..00000000
--- a/packages/docs/api/tabs/CTabPanel.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CTabPanel
-
-```jsx
-import { CTabPanel } from '@coreui/vue'
-// or
-import CTabPanel from '@coreui/vue/src/components/tabs/CTabPanel'
-```
-
-#### Props
-
-| Prop name      | Description                             | Type           | Values | Default |
-| -------------- | --------------------------------------- | -------------- | ------ | ------- |
-| **item-key**   | Item key.                               | number\|string | -      | -       |
-| **transition** | Enable fade in and fade out transition. | boolean        | -      | true    |
-| **visible**    | Toggle the visibility of component.     | boolean        | -      | false   |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/tabs/CTabs.api.md b/packages/docs/api/tabs/CTabs.api.md
deleted file mode 100644
index 4fea4982..00000000
--- a/packages/docs/api/tabs/CTabs.api.md
+++ /dev/null
@@ -1,19 +0,0 @@
-### CTabs
-
-```jsx
-import { CTabs } from '@coreui/vue'
-// or
-import CTabs from '@coreui/vue/src/components/tabs/CTabs'
-```
-
-#### Props
-
-| Prop name           | Description          | Type           | Values | Default |
-| ------------------- | -------------------- | -------------- | ------ | ------- |
-| **active-item-key** | The active item key. | number\|string | -      | -       |
-
-#### Events
-
-| Event name | Description                                        | Properties |
-| ---------- | -------------------------------------------------- | ---------- |
-| **change** | The callback is fired when the active tab changes. |
diff --git a/packages/docs/api/toast/CToast.api.md b/packages/docs/api/toast/CToast.api.md
deleted file mode 100644
index 6079903e..00000000
--- a/packages/docs/api/toast/CToast.api.md
+++ /dev/null
@@ -1,26 +0,0 @@
-### CToast
-
-```jsx
-import { CToast } from '@coreui/vue'
-// or
-import CToast from '@coreui/vue/src/components/toast/CToast'
-```
-
-#### Props
-
-| Prop name       | Description                                                               | Type    | Values                                                                                                    | Default |
-| --------------- | ------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ------- |
-| **autohide**    | Auto hide the toast.                                                      | boolean | -                                                                                                         | true    |
-| **color**       | Sets the color context of the component to one of CoreUI’s themed colors. | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'`, `string` | -       |
-| **delay**       | Delay hiding the toast (ms).                                              | number  | -                                                                                                         | 5000    |
-| **dismissible** | Optionally add a close button to component and allow it to self dismiss.  | boolean | -                                                                                                         | true    |
-| **index**       | index of the component.                                                   | number  | -                                                                                                         | -       |
-| **title**       | Title node for your component.                                            | string  | -                                                                                                         | -       |
-| **visible**     | Toggle the visibility of component.                                       | boolean | -                                                                                                         | -       |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **close**  | Callback fired when the component requests to be closed. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/toast/CToastBody.api.md b/packages/docs/api/toast/CToastBody.api.md
deleted file mode 100644
index b858d476..00000000
--- a/packages/docs/api/toast/CToastBody.api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### CToastBody
-
-```jsx
-import { CToastBody } from '@coreui/vue'
-// or
-import CToastBody from '@coreui/vue/src/components/toast/CToastBody'
-```
diff --git a/packages/docs/api/toast/CToastClose.api.md b/packages/docs/api/toast/CToastClose.api.md
deleted file mode 100644
index c1b0f388..00000000
--- a/packages/docs/api/toast/CToastClose.api.md
+++ /dev/null
@@ -1,19 +0,0 @@
-### CToastClose
-
-```jsx
-import { CToastClose } from '@coreui/vue'
-// or
-import CToastClose from '@coreui/vue/src/components/toast/CToastClose'
-```
-
-#### Props
-
-| Prop name | Description                                                                             | Type   | Values | Default |
-| --------- | --------------------------------------------------------------------------------------- | ------ | ------ | ------- |
-| **as**    | Component used for the root node. Either a string to use a HTML element or a component. | string | -      | -       |
-
-#### Events
-
-| Event name | Description                                             | Properties |
-| ---------- | ------------------------------------------------------- | ---------- |
-| **close**  | Event called before the dissmiss animation has started. |
diff --git a/packages/docs/api/toast/CToastHeader.api.md b/packages/docs/api/toast/CToastHeader.api.md
deleted file mode 100644
index a8ff8638..00000000
--- a/packages/docs/api/toast/CToastHeader.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CToastHeader
-
-```jsx
-import { CToastHeader } from '@coreui/vue'
-// or
-import CToastHeader from '@coreui/vue/src/components/toast/CToastHeader'
-```
-
-#### Props
-
-| Prop name        | Description                                     | Type    | Values | Default |
-| ---------------- | ----------------------------------------------- | ------- | ------ | ------- |
-| **close-button** | Automatically add a close button to the header. | boolean | -      | -       |
diff --git a/packages/docs/api/toast/CToaster.api.md b/packages/docs/api/toast/CToaster.api.md
deleted file mode 100644
index f21a2180..00000000
--- a/packages/docs/api/toast/CToaster.api.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### CToaster
-
-```jsx
-import { CToaster } from '@coreui/vue'
-// or
-import CToaster from '@coreui/vue/src/components/toast/CToaster'
-```
-
-#### Props
-
-| Prop name     | Description                           | Type   | Values                                                                                                                          | Default |
-| ------------- | ------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| **placement** | Describes the placement of component. | string | `'top-start'`, `'top'`, `'top-end'`, `'middle-start'`, `'middle'`, `'middle-end'`, `'bottom-start'`, `'bottom'`, `'bottom-end'` | -       |
diff --git a/packages/docs/api/tooltip/CTooltip.api.md b/packages/docs/api/tooltip/CTooltip.api.md
deleted file mode 100644
index 3b0cac97..00000000
--- a/packages/docs/api/tooltip/CTooltip.api.md
+++ /dev/null
@@ -1,28 +0,0 @@
-### CTooltip
-
-```jsx
-import { CTooltip } from '@coreui/vue'
-// or
-import CTooltip from '@coreui/vue/src/components/tooltip/CTooltip'
-```
-
-#### Props
-
-| Prop name                                                              | Description                                                                                                                                                                                                                                                     | Type                                         | Values                          | Default                                  |
-| ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------- | ---------------------------------------- |
-| **animation** <br><div class="badge bg-primary">4.9.0+</div>           | Apply a CSS fade transition to the tooltip.                                                                                                                                                                                                                     | boolean                                      | -                               | true                                     |
-| **container** <br><div class="badge bg-primary">5.0.0+</div>           | Appends the vue tooltip to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.                                                                                                              | HTMLElement \| (() => HTMLElement) \| string | -                               | 'body'                                   |
-| **content**                                                            | Content for your component. If you want to pass non-string value please use dedicated slot `<template #content>...</template>`                                                                                                                                  | string                                       | -                               | -                                        |
-| **delay** <br><div class="badge bg-primary">4.9.0+</div>               | The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`. | number \| { show: number; hide: number }     | -                               | 0                                        |
-| **fallback-placements** <br><div class="badge bg-primary">4.9.0+</div> | Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.                                                                                                       | Placements \| Placements[]                   | -                               | () => ['top', 'right', 'bottom', 'left'] |
-| **offset**                                                             | Offset of the tooltip relative to its target.                                                                                                                                                                                                                   | array                                        | -                               | [0, 6]                                   |
-| **placement**                                                          | Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.                                                                                            | Placement                                    | -                               | 'top'                                    |
-| **trigger**                                                            | Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.                                                                                                                                             | Triggers \| Triggers[]                       | `'click'`, `'focus'`, `'hover'` | () => ['hover', 'focus']                 |
-| **visible**                                                            | Toggle the visibility of tooltip component.                                                                                                                                                                                                                     | boolean                                      | -                               | -                                        |
-
-#### Events
-
-| Event name | Description                                              | Properties |
-| ---------- | -------------------------------------------------------- | ---------- |
-| **hide**   | Callback fired when the component requests to be hidden. |
-| **show**   | Callback fired when the component requests to be shown.  |
diff --git a/packages/docs/api/widgets/CWidgetStatsA.api.md b/packages/docs/api/widgets/CWidgetStatsA.api.md
deleted file mode 100644
index 5bab31a0..00000000
--- a/packages/docs/api/widgets/CWidgetStatsA.api.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### CWidgetStatsA
-
-```jsx
-import { CWidgetStatsA } from '@coreui/vue'
-// or
-import CWidgetStatsA from '@coreui/vue/src/components/widgets/CWidgetStatsA'
-```
-
-#### Props
-
-| Prop name | Description                                                                                                                              | Type           | Values | Default |
-| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ------ | ------- |
-| **title** | Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`               | string         | -      | -       |
-| **value** | Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>` | number\|string | -      | 0       |
-
-#### Slots
-
-| Name   | Description                                       | Bindings |
-| ------ | ------------------------------------------------- | -------- |
-| chart  | Location for chart component.                     |          |
-| action | Location for action component, ex. `<CDropdown>`. |          |
diff --git a/packages/docs/api/widgets/CWidgetStatsB.api.md b/packages/docs/api/widgets/CWidgetStatsB.api.md
deleted file mode 100644
index 53c4aaf6..00000000
--- a/packages/docs/api/widgets/CWidgetStatsB.api.md
+++ /dev/null
@@ -1,17 +0,0 @@
-### CWidgetStatsB
-
-```jsx
-import { CWidgetStatsB } from '@coreui/vue'
-// or
-import CWidgetStatsB from '@coreui/vue/src/components/widgets/CWidgetStatsB'
-```
-
-#### Props
-
-| Prop name   | Description                                                                                                                              | Type           | Values                                                                                          | Default |
-| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------- | ------- |
-| **color**   | Sets the color context of the component to one of CoreUI’s themed colors                                                                 | string         | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **inverse** | Colors have been inverted from their default dark shade.                                                                                 | boolean        | -                                                                                               | -       |
-| **text**    | Helper text for your component. If you want to pass non-string value please use dedicated slot `<template #text>...</template>`          | string         | -                                                                                               | -       |
-| **title**   | Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`               | string         | -                                                                                               | -       |
-| **value**   | Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>` | number\|string | -                                                                                               | 0       |
diff --git a/packages/docs/api/widgets/CWidgetStatsC.api.md b/packages/docs/api/widgets/CWidgetStatsC.api.md
deleted file mode 100644
index 485f5f4f..00000000
--- a/packages/docs/api/widgets/CWidgetStatsC.api.md
+++ /dev/null
@@ -1,22 +0,0 @@
-### CWidgetStatsC
-
-```jsx
-import { CWidgetStatsC } from '@coreui/vue'
-// or
-import CWidgetStatsC from '@coreui/vue/src/components/widgets/CWidgetStatsC'
-```
-
-#### Props
-
-| Prop name   | Description                                                                                                                              | Type           | Values                                                                                          | Default |
-| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------- | ------- |
-| **color**   | Sets the color context of the component to one of CoreUI’s themed colors.                                                                | string         | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **inverse** | Colors have been inverted from their default dark shade.                                                                                 | boolean        | -                                                                                               | -       |
-| **title**   | Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`               | string         | -                                                                                               | -       |
-| **value**   | Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>` | number\|string | -                                                                                               | 0       |
-
-#### Slots
-
-| Name | Description                  | Bindings |
-| ---- | ---------------------------- | -------- |
-| icon | Location for icon component. |          |
diff --git a/packages/docs/api/widgets/CWidgetStatsD.api.md b/packages/docs/api/widgets/CWidgetStatsD.api.md
deleted file mode 100644
index 6e6835c5..00000000
--- a/packages/docs/api/widgets/CWidgetStatsD.api.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### CWidgetStatsD
-
-```jsx
-import { CWidgetStatsD } from '@coreui/vue'
-// or
-import CWidgetStatsD from '@coreui/vue/src/components/widgets/CWidgetStatsD'
-```
-
-#### Props
-
-| Prop name  | Description                                                               | Type    | Values                                                                                          | Default  |
-| ---------- | ------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------- | -------- |
-| **color**  | Sets the color context of the component to one of CoreUI’s themed colors. | string  | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -        |
-| **values** | Values and titles for your component.                                     | Value[] | -                                                                                               | () => [] |
-
-#### Slots
-
-| Name  | Description                                     | Bindings |
-| ----- | ----------------------------------------------- | -------- |
-| chart | Location for chart component.                   |          |
-| icon  | Location for icon component, ex. `<CDropdown>`. |          |
diff --git a/packages/docs/api/widgets/CWidgetStatsE.api.md b/packages/docs/api/widgets/CWidgetStatsE.api.md
deleted file mode 100644
index 436ec923..00000000
--- a/packages/docs/api/widgets/CWidgetStatsE.api.md
+++ /dev/null
@@ -1,20 +0,0 @@
-### CWidgetStatsE
-
-```jsx
-import { CWidgetStatsE } from '@coreui/vue'
-// or
-import CWidgetStatsE from '@coreui/vue/src/components/widgets/CWidgetStatsE'
-```
-
-#### Props
-
-| Prop name | Description                                                                                                                              | Type           | Values | Default |
-| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ------ | ------- |
-| **title** | Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`               | string         | -      | -       |
-| **value** | Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>` | number\|string | -      | 0       |
-
-#### Slots
-
-| Name  | Description                   | Bindings |
-| ----- | ----------------------------- | -------- |
-| chart | Location for chart component. |          |
diff --git a/packages/docs/api/widgets/CWidgetStatsF.api.md b/packages/docs/api/widgets/CWidgetStatsF.api.md
deleted file mode 100644
index 49dd0bdb..00000000
--- a/packages/docs/api/widgets/CWidgetStatsF.api.md
+++ /dev/null
@@ -1,23 +0,0 @@
-### CWidgetStatsF
-
-```jsx
-import { CWidgetStatsF } from '@coreui/vue'
-// or
-import CWidgetStatsF from '@coreui/vue/src/components/widgets/CWidgetStatsF'
-```
-
-#### Props
-
-| Prop name   | Description                                                                                                                              | Type           | Values                                                                                          | Default |
-| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------- | ------- |
-| **color**   | Sets the color context of the component to one of CoreUI’s themed colors.                                                                | string         | `'primary'`, `'secondary'`, `'success'`, `'danger'`, `'warning'`, `'info'`, `'dark'`, `'light'` | -       |
-| **padding** | Set padding of your component.                                                                                                           | boolean        | -                                                                                               | true    |
-| **title**   | Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`               | string         | -                                                                                               | -       |
-| **text**    | Helper text for your component. If you want to pass non-string value please use dedicated slot `<template #text>...</template>`          | string         | -                                                                                               | -       |
-| **value**   | Value for your component. If you want to pass non-string or non-number value please use dedicated slot `<template #value>...</template>` | number\|string | -                                                                                               | 0       |
-
-#### Slots
-
-| Name | Description                  | Bindings |
-| ---- | ---------------------------- | -------- |
-| icon | Location for icon component. |          |
diff --git a/packages/docs/build/docgen.config.js b/packages/docs/build/docgen.config.js
deleted file mode 100644
index 7d654712..00000000
--- a/packages/docs/build/docgen.config.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* eslint-disable @typescript-eslint/no-var-requires */
-'use strict'
-
-const path = require('path')
-
-module.exports = {
-  componentsRoot: './../../packages', // the folder where CLI will start searching for components.
-  components: [
-    '**/[A-Z]*.ts',
-    '!**/[A-Z]*.d.ts',
-    '!**/[A-Z]*.spec.ts',
-    '!**/ComponentProps.ts',
-  ],
-  outDir: 'api', // folder to save components docs in (relative to the current working directry)
-  getDocFileName: (componentPath) =>
-    componentPath.replace(/\.ts$/, '.md'), // specify the name of the input md file
-  getDestFile: (file, config) => {
-    return path.join(
-      config.outDir,
-      file.replace('coreui-vue/src/components', '')
-          .replace('coreui-vue-chartjs/src/', '')).replace(/\.ts$/, '.api.md') // specify the name of the output md file
-  },
-  // templates,
-  templates: {
-    // global component template wrapping all others see #templates
-    component: require('./templates/component'),
-    events: require('./templates/events'),
-    props: require('./templates/props'),
-    slots: require('./templates/slots'),
-  },
-  docsRepo: '@coreui/vue',
-  docsBranch: 'main',
-  docsFolder: '',
-  editLinkLabel: 'Edit on github',
-}
\ No newline at end of file
diff --git a/packages/docs/build/templates/component.js b/packages/docs/build/templates/component.js
deleted file mode 100644
index d5f403cf..00000000
--- a/packages/docs/build/templates/component.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict'
-
-module.exports = (renderedUsage, doc, config, fileName, requiresMd, { isSubComponent, hasSubComponents }) => {
-  const { displayName, description, tags, functional } = doc;
-  const { deprecated, author, since, version, see, link } = tags || {};
-  const frontMatter = [];
-  if (!config.outFile && deprecated) {
-      // to avoid having the squiggles in the left menu for deprecated items
-      // use the frontmatter feature of vuepress
-      frontMatter.push(`title: ${displayName}`);
-  }
-  if (hasSubComponents) {
-      // show more than one level on subcomponents
-      frontMatter.push('sidebarDepth: 2');
-  }
-
-  return `${frontMatter.length && !isSubComponent
-      ? `
----
-${frontMatter.join('\n')}
----
-`
-      : ''}
-${isSubComponent || hasSubComponents ? '#' : ''}### ${deprecated ? `~~${displayName}~~` : displayName}
-
-${deprecated ? `> **Deprecated** ${deprecated[0].description}\n` : ''}
-${description ? '> ' + description : ''}
-
-
-\`\`\`jsx
-import { ${displayName} } from '@coreui/${fileName.replace('coreui-', '').split('/')[0]}'
-// or
-import ${displayName} from '@coreui/${fileName.replace('coreui-', '').replace('.ts', '')}'
-\`\`\`\n
-
-${functional ? renderedUsage.functionalTag : ''}
-${author ? author.map(a => `Author: ${a.description}\n`) : ''}
-${since ? `Since: ${since[0].description}\n` : ''}
-${version ? `Version: ${version[0].description}\n` : ''}
-${see ? see.map(s => `[See](${s.description})\n`) : ''}
-${link ? link.map(l => `[See](${l.description})\n`) : ''}
-
-${renderedUsage.props}
-${renderedUsage.methods}
-${renderedUsage.events}
-${renderedUsage.slots}
-
-${requiresMd.length
-      ? '---\n' + requiresMd.map(component => component.content).join('\n---\n')
-      : ''}
-`;
-};
\ No newline at end of file
diff --git a/packages/docs/build/templates/events.js b/packages/docs/build/templates/events.js
deleted file mode 100644
index 56550438..00000000
--- a/packages/docs/build/templates/events.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict'
-
-function mdclean(input) {
-	return input.replace(/\r?\n/g, '<br>').replace(/\|/g, '\\|')
-}
-
-function formatProperties(properties) {
-	if (!properties) {
-		return ''
-	}
-	return properties
-		.map(property => {
-			const { name, description, type } = property
-			if (!type) {
-				return ''
-			}
-			return `**${name}** \`${type.names.length ? type.names.join(', ') : ''}\` - ${description}`
-		})
-		.join('\n')
-}
-
-const tmpl = (events) => {
-	let ret = ''
-	events.forEach(evt => {
-		const { description = '', ...e } = evt
-		const readableProperties = e.properties ? `${formatProperties(e.properties)}` : ''
-		ret += `| **${e.name.includes('update:') ? mdclean(e.name) : mdclean(e.name.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
-    .map(x => x.toLowerCase())
-    .join('-'))}** | ${mdclean(description)}| ${mdclean(readableProperties)}\n`
-	})
-	return ret
-}
-
-module.exports = (events, opt = {}) => {
-	return `
-${opt.isSubComponent || opt.hasSubComponents ? '#' : ''}#### Events
-
-  | Event name     | Description    | Properties   |
-  | -------------- |--------------- | -------------|
-  ${tmpl(events)}
-  `
-}
\ No newline at end of file
diff --git a/packages/docs/build/templates/props.js b/packages/docs/build/templates/props.js
deleted file mode 100644
index 44997ddf..00000000
--- a/packages/docs/build/templates/props.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict'
-function mdclean(input) {
-	return input.replace(/\r?\n/g, '<br>').replace(/\|/g, '\\|')
-}
-function isTag(v) {
-  return !!v.content;
-}
-const renderTags = (tags) => {
-  if (!tags) {
-    return '';
-  }
-  return Object.entries(tags)
-    .map(([tag, values]) => {
-    return tag !== 'since' ? values.map(v => `<br/>\`@${tag}\` ${isTag(v) ? v.content : v.description}`).join(''): '';
-  })
-  .join('');
-};
-const tmpl = (props) => {
-  let ret = '';
-  const replaceToString = /Color|TextColor|Shape/i;
-  props.forEach(prop => {
-    const name = prop.name
-    let t = prop.description ?? ''
-    t += renderTags(prop.tags)
-    const n = prop.type?.name ?? ''
-    const v = prop.values?.map(pv => `\`${pv}\``).join(', ') ?? '-'
-    const d = prop.defaultValue?.value ?? '-'
-    const since = prop.tags && prop.tags.since ? `<br><div class="badge bg-primary">${prop.tags.since[0].description}+</div>` : ''
-
-    if (prop.description && !prop.description.includes('@ignore')) {
-      ret += `| **${mdclean(name.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
-      .map(x => x.toLowerCase())
-      .join('-'))}** ${mdclean(since)} | ${mdclean(t)} | ${mdclean(n.replace(replaceToString, 'string'))} | ${mdclean(v)} | ${mdclean(d.replace('undefined', '-'))} |\n`;
-    }
-  });
-  return ret;
-};
-module.exports = (props, opt = {}) => {
-    return `
-${opt.isSubComponent || opt.hasSubComponents ? '#' : ''}#### Props
-  | Prop name     | Description | Type      | Values      | Default     |
-  | ------------- | ----------- | --------- | ----------- | ----------- |
-  ${tmpl(props)}
-  `;
-};
diff --git a/packages/docs/build/templates/slots.js b/packages/docs/build/templates/slots.js
deleted file mode 100644
index 39155874..00000000
--- a/packages/docs/build/templates/slots.js
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict'
-
-function mdclean(input) {
-	return input.replace(/\r?\n/g, '<br>').replace(/\|/g, '\\|')
-}
-
-const formatBindings = bindings => {
-    if (!bindings) {
-        return '';
-    }
-    return bindings
-        .map(binding => {
-        const { name, description, type } = binding;
-        if (!type) {
-            return '';
-        }
-        return `**${name}** \`${type.name === 'union' && type.elements
-            ? type.elements.map(({ name: insideName }) => insideName).join(', ')
-            : type.name}\` - ${description}`;
-    })
-        .join('\n');
-};
-
-module.exports = (slots, opt = {}) => {
-    return `
-${opt.isSubComponent || opt.hasSubComponents ? '#' : ''}#### Slots
-
-  | Name          | Description  | Bindings |
-  | ------------- | ------------ | -------- |
-  ${slots
-        .map(slot => {
-        const { description, bindings, name } = slot;
-        const readableBindings = bindings ? `${formatBindings(bindings)}` : '';
-        return `| ${mdclean(name)} | ${mdclean(description || '')} | ${mdclean(readableBindings)} |`; // replace returns by <br> to allow them in a table cell
-    })
-        .join('\n')}
-`;
-};
\ No newline at end of file
diff --git a/packages/docs/components/accordion.md b/packages/docs/components/accordion.md
deleted file mode 100644
index def460c1..00000000
--- a/packages/docs/components/accordion.md
+++ /dev/null
@@ -1,309 +0,0 @@
----
-title: Vue Accordion Component
-name: Accordion
-description: Build vertically collapsing accordions in combination with our Vue Collapse component.
-other_frameworks: accordion
----
-
-## Examples
-
-Click the accordions below to expand/collapse the accordion content.
-
-::: demo
-<CAccordion>
-  <CAccordionItem :item-key="1">
-    <CAccordionHeader>
-      Accordion Item #1
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="2">
-    <CAccordionHeader>
-      Accordion Item #2
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="3">
-    <CAccordionHeader>
-      Accordion Item #3
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-</CAccordion>
-:::
-```markup
-<CAccordion>
-  <CAccordionItem :item-key="1">
-    <CAccordionHeader>
-      Accordion Item #1
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="2">
-    <CAccordionHeader>
-      Accordion Item #2
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="3">
-    <CAccordionHeader>
-      Accordion Item #3
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-</CAccordion>
-```
-
-### Flush
-
-Add `flush` to remove the default `background-color`, some borders, and some rounded corners to render accordions edge-to-edge with their parent container.
-
-:::demo
-<CAccordion flush>
-  <CAccordionItem>
-    <CAccordionHeader>
-      Accordion Item #1
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem>
-    <CAccordionHeader>
-      Accordion Item #2
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem>
-    <CAccordionHeader>
-      Accordion Item #3
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-</CAccordion>
-:::
-```markup
-<CAccordion flush>
-  <CAccordionItem>
-    <CAccordionHeader>
-      Accordion Item #1
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem>
-    <CAccordionHeader>
-      Accordion Item #2
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem>
-    <CAccordionHeader>
-      Accordion Item #3
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-</CAccordion>
-```
-
-### Always open
-
-Add `always-open` property to make accordion items stay open when another item is opened.
-
-:::demo
-<CAccordion :active-item-key="2" always-open>
-  <CAccordionItem :item-key="1">
-    <CAccordionHeader>
-      Accordion Item #1
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="2">
-    <CAccordionHeader>
-      Accordion Item #2
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="3">
-    <CAccordionHeader>
-      Accordion Item #3
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-</CAccordion>
-:::
-```markup
-<CAccordion :active-item-key="2" always-open>
-  <CAccordionItem :item-key="1">
-    <CAccordionHeader>
-      Accordion Item #1
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="2">
-    <CAccordionHeader>
-      Accordion Item #2
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-  <CAccordionItem :item-key="3">
-    <CAccordionHeader>
-      Accordion Item #3
-    </CAccordionHeader>
-    <CAccordionBody>
-      <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.
-    </CAccordionBody>
-  </CAccordionItem>
-</CAccordion>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue accordions 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.
-
-<ScssDocs file="_accordion.scss" capture="accordion-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CAccordion :style="vars">...</CAccordion>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="accordion-variables" />
-
-## API
-
-!!!include(./api/accordion/CAccordion.api.md)!!!
-
-!!!include(./api/accordion/CAccordionHeader.api.md)!!!
-
-!!!include(./api/accordion/CAccordionBody.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/alert.md b/packages/docs/components/alert.md
deleted file mode 100644
index 96091ca9..00000000
--- a/packages/docs/components/alert.md
+++ /dev/null
@@ -1,299 +0,0 @@
----
-title: Vue Alert Component
-name: Alert
-description: Vue alert component gives contextual feedback information for common user operations. The alert component is delivered with a bunch of usable and adjustable alert messages.
-other_frameworks: alert
----
-
-## Examples
-
-Vue Alert is prepared for any length of text, as well as an optional close button. For a styling, use one of the **required** contextual `color` props (e.g., `primary`). For inline dismissal, use the [dismissing prop](#dismissing).
-
-::: demo
-<CAlert color="primary">A simple primary alert—check it out!</CAlert>
-<CAlert color="secondary">A simple secondary alert—check it out!</CAlert>
-<CAlert color="success">A simple success alert—check it out!</CAlert>
-<CAlert color="danger">A simple danger alert—check it out!</CAlert>
-<CAlert color="warning">A simple warning alert—check it out!</CAlert>
-<CAlert color="info">A simple info alert—check it out!</CAlert>
-<CAlert color="light">A simple light alert—check it out!</CAlert>
-<CAlert color="dark">A simple dark alert—check it out!</CAlert>
-:::
-
-```vue
-<CAlert color="primary">A simple primary alert—check it out!</CAlert>
-<CAlert color="secondary">A simple secondary alert—check it out!</CAlert>
-<CAlert color="success">A simple success alert—check it out!</CAlert>
-<CAlert color="danger">A simple danger alert—check it out!</CAlert>
-<CAlert color="warning">A simple warning alert—check it out!</CAlert>
-<CAlert color="info">A simple info alert—check it out!</CAlert>
-<CAlert color="light">A simple light alert—check it out!</CAlert>
-<CAlert color="dark">A simple dark alert—check it out!</CAlert>
-```
-
-### Live example
-
-Click the button below to show an alert (hidden with inline styles to start), then dismiss (and destroy) it with the built-in close button.
-
-::: demo
-<CAlert color="primary" :visible="liveExampleVisible" dismissible @close="() => { liveExampleVisible = false }">A simple primary alert—check it out!</CAlert>
-<CButton color="primary" @click="() => { liveExampleVisible = true }">Show live alert</CButton>
-:::
-
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const liveExampleVisible = ref(false)
-</script>
-<template>
-  <CAlert color="primary" :visible="liveExampleVisible" dismissible @close="() => { liveExampleVisible = false }">A simple primary alert—check it out!</CAlert>
-  <CButton color="primary" @click="() => { liveExampleVisible = true }">Show live alert</CButton>
-</template>
-```
-
-### Link color
-
-Use the `<CAlertLink>` component to immediately give matching colored links inside any alert.
-::: demo
-<CAlert color="primary">
-A simple primary alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="secondary">
-A simple secondary alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="success">
-A simple success alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="danger">
-A simple danger alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="warning">
-A simple warning alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="info">
-A simple info alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="light">
-A simple light alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="dark">
-A simple dark alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-:::
-
-```vue
-<CAlert color="primary">
-  A simple primary alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="secondary">
-  A simple secondary alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="success">
-  A simple success alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="danger">
-  A simple danger alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="warning">
-  A simple warning alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="info">
-  A simple info alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="light">
-  A simple light alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-<CAlert color="dark">
-  A simple dark alert with <CAlertLink href="#">an example link</CAlertLink>. Give it a click if you like.
-</CAlert>
-```
-
-### Additional content
-
-Alert can also incorporate supplementary HTML elements like heading, paragraph, and divider.
-
-::: demo
-<CAlert color="success">
-<CAlertHeading>Well done!</CAlertHeading>
-
-  <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>
-  <hr />
-  <p class="mb-0">Whenever you need to, be sure to use margin utilities to keep things nice and tidy.</p>
-</CAlert>
-:::
-
-```vue
-<CAlert color="success" v-bind:visible="true">
-  <CAlertHeading>Well done!</CAlertHeading>
-  <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>
-  <hr />
-  <p class="mb-0">Whenever you need to, be sure to use margin utilities to keep things nice and tidy.</p>
-</CAlert>
-```
-
-### Icons
-
-Similarly, you can use [flexbox utilities](https//coreui.io/docs/4.0/utilities/flex") and [CoreUI Icons](https://icons.coreui.io) to create alerts with icons. Depending on your icons and content, you may want to add more utilities or custom styles.
-
-::: demo
-<CAlert color="primary" class="d-flex align-items-center">
-<svg class="flex-shrink-0 me-2" width="24" height="24" viewBox="0 0 512 512">
-<rect width="32" height="176" x="240" y="176" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><rect width="32" height="32" x="240" y="384" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><path fill="var(--ci-primary-color, currentColor)" d="M274.014,16H237.986L16,445.174V496H496V445.174ZM464,464H48V452.959L256,50.826,464,452.959Z" class="ci-primary"></path>
-</svg>
-
-  <div>
-    An example alert with an icon
-  </div>
-</CAlert>
-:::
-```vue
-<CAlert color="primary" class="d-flex align-items-center">
-  <svg class="flex-shrink-0 me-2" width="24" height="24" viewBox="0 0 512 512">
-    <rect width="32" height="176" x="240" y="176" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><rect width="32" height="32" x="240" y="384" fill="var(--ci-primary-color, currentColor)" class="ci-primary"></rect><path fill="var(--ci-primary-color, currentColor)" d="M274.014,16H237.986L16,445.174V496H496V445.174ZM464,464H48V452.959L256,50.826,464,452.959Z" class="ci-primary"></path>
-  </svg>
-  <div>
-    An example alert with an icon
-  </div>
-</CAlert>
-```
-
-Need more than one icon for your alerts? Consider using [CoreUI Icons](https://icons.coreui.io).
-
-::: demo
-<CAlert color="primary" class="d-flex align-items-center">
-<CIcon icon="cil-info" class="flex-shrink-0 me-2" width="24" height="24" />
-
-  <div>
-    An example alert with an icon
-  </div>
-</CAlert>
-<CAlert color="success" class="d-flex align-items-center">
-  <CIcon icon="cil-check-circle" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example success alert with an icon
-  </div>
-</CAlert>
-<CAlert color="warning" class="d-flex align-items-center">
-  <CIcon icon="cil-warning" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example warning alert with an icon
-  </div>
-</CAlert>
-<CAlert color="danger" class="d-flex align-items-center">
-  <CIcon icon="cil-burn" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example danger alert with an icon
-  </div>
-</CAlert>
-:::
-```vue
-<CAlert color="primary" class="d-flex align-items-center">
-  <CIcon icon="cil-info" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example alert with an icon
-  </div>
-</CAlert>
-<CAlert color="success" class="d-flex align-items-center">
-  <CIcon icon="cil-check-circle" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example success alert with an icon
-  </div>
-</CAlert>
-<CAlert color="warning" class="d-flex align-items-center">
-  <CIcon icon="cil-warning" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example warning alert with an icon
-  </div>
-</CAlert>
-<CAlert color="danger" class="d-flex align-items-center">
-  <CIcon icon="cil-burn" class="flex-shrink-0 me-2" width="24" height="24" />
-  <div>
-    An example danger alert with an icon
-  </div>
-</CAlert>
-```
-
-### Solid
-
-Use `variant="solid"` to change contextual colors to solid.
-
-::: demo
-<CAlert color="primary" variant="solid">A simple solid primary alert—check it out!</CAlert>
-<CAlert color="secondary" variant="solid">A simple solid secondary alert—check it out!</CAlert>
-<CAlert color="success" variant="solid">A simple solid success alert—check it out!</CAlert>
-<CAlert color="danger" variant="solid">A simple solid danger alert—check it out!</CAlert>
-<CAlert color="warning" variant="solid">A simple solid warning alert—check it out!</CAlert>
-<CAlert color="info" variant="solid">A simple solid info alert—check it out!</CAlert>
-<CAlert color="light" variant="solid" class="text-high-emphasis">A simple solid light alert—check it out!</CAlert>
-<CAlert color="dark" variant="solid">A simple solid dark alert—check it out!</CAlert>
-:::
-
-```vue
-<CAlert color="primary" variant="solid">A simple solid primary alert—check it out!</CAlert>
-<CAlert color="secondary" variant="solid">A simple solid secondary alert—check it out!</CAlert>
-<CAlert color="success" variant="solid">A simple solid success alert—check it out!</CAlert>
-<CAlert color="danger" variant="solid">A simple solid danger alert—check it out!</CAlert>
-<CAlert color="warning" variant="solid">A simple solid warning alert—check it out!</CAlert>
-<CAlert color="info" variant="solid">A simple solid info alert—check it out!</CAlert>
-<CAlert color="light" variant="solid" class="text-high-emphasis">A simple solid light alert—check it out!</CAlert>
-<CAlert color="dark" variant="solid">A simple solid dark alert—check it out!</CAlert>
-```
-
-### Dismissing
-
-Alerts can also be easily dismissed. Just add the `dismissible` prop.
-
-::: demo
-<CAlert color="warning" dismissible @close="message">
-  <strong>Go right ahead</strong> and click that dimiss over there on the right.
-</CAlert>
-:::
-
-```vue
-<script setup>
-  const message = () => {
-    alert("👋 Well, hi there! Thanks for dismissing me.")
-  }
-</script>
-<template>
-  <CAlert color="warning" dismissible @close="message">
-    <strong>Go right ahead</strong> and click that dimiss over there on the right.
-  </CAlert>
-</template>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue alerts 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.
-
-<ScssDocs file="_alert.scss" capture="alert-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = {
-  '--my-css-var': 10,
-  '--my-another-css-var': "red"
-}
-return <CAlert :style="vars">...</CAlert>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="alert-variables" />
-
-## API
-
-!!!include(./api/alert/CAlert.api.md)!!!
-
-!!!include(./api/alert/CAlertHeading.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const liveExampleVisible = ref(false)
-  const message = () => {
-    alert("👋 Well, hi there! Thanks for dismissing me.")
-  }
-</script>
diff --git a/packages/docs/components/avatar.md b/packages/docs/components/avatar.md
deleted file mode 100644
index 02fb3b37..00000000
--- a/packages/docs/components/avatar.md
+++ /dev/null
@@ -1,162 +0,0 @@
----
-title: Vue Avatar Component
-name: Avatar
-description: The Vue Avatar component is used to display circular user profile pictures. Vue avatars can portray people or objects and support images, icons, or letters.
-other_frameworks: avatar
----
-
-## Image avatars
-
-Showcase Vue avatars using images. These avatars are typically circular and can display user profile pictures.
-
-::: demo
-<CAvatar :src="$withBase('/images/avatars/1.jpg')"/>
-<CAvatar :src="$withBase('/images/avatars/2.jpg')"/>
-<CAvatar :src="$withBase('/images/avatars/3.jpg')"/>
-:::
-```vue
-<CAvatar src="/images/avatars/1.jpg"/>
-<CAvatar src="/images/avatars/2.jpg"/>
-<CAvatar src="/images/avatars/3.jpg"/>
-```
-
-## Letter avatars
-
-Use letters inside avatars to represent users or objects when images are not available. This can be useful for displaying initials.
-
-::: demo
-<CAvatar color="primary" text-color="white">CUI</CAvatar>
-<CAvatar color="secondary">CUI</CAvatar>
-<CAvatar color="warning" text-color="white">CUI</CAvatar>
-:::
-```vue
-<CAvatar color="primary" text-color="white">CUI</CAvatar>
-<CAvatar color="secondary">CUI</CAvatar>
-<CAvatar color="warning" text-color="white">CUI</CAvatar>
-```
-
-## Icons avatars 
-
-Incorporate icons within Vue avatars, allowing for a visual representation using scalable vector graphics (SVG).
-
-::: demo
-<CAvatar color="info" textColor="white">
-  <svg id="cib-coreui-c" class="icon" viewBox="0 0 32 32">
-    <path d="M27.912 7.289l-10.324-5.961c-0.455-0.268-1.002-0.425-1.588-0.425s-1.133 0.158-1.604 0.433l0.015-0.008-10.324 5.961c-0.955 0.561-1.586 1.582-1.588 2.75v11.922c0.002 1.168 0.635 2.189 1.574 2.742l0.016 0.008 10.322 5.961c0.455 0.267 1.004 0.425 1.59 0.425 0.584 0 1.131-0.158 1.602-0.433l-0.014 0.008 10.322-5.961c0.955-0.561 1.586-1.582 1.588-2.75v-11.922c-0.002-1.168-0.633-2.189-1.573-2.742zM27.383 21.961c0 0.389-0.211 0.73-0.526 0.914l-0.004 0.002-10.324 5.961c-0.152 0.088-0.334 0.142-0.53 0.142s-0.377-0.053-0.535-0.145l0.005 0.002-10.324-5.961c-0.319-0.186-0.529-0.527-0.529-0.916v-11.922c0-0.389 0.211-0.73 0.526-0.914l0.004-0.002 10.324-5.961c0.152-0.090 0.334-0.143 0.53-0.143s0.377 0.053 0.535 0.144l-0.006-0.002 10.324 5.961c0.319 0.185 0.529 0.527 0.529 0.916z"></path><path d="M22.094 19.451h-0.758c-0.188 0-0.363 0.049-0.515 0.135l0.006-0.004-4.574 2.512-5.282-3.049v-6.082l5.282-3.051 4.576 2.504c0.146 0.082 0.323 0.131 0.508 0.131h0.758c0.293 0 0.529-0.239 0.529-0.531v-0.716c0-0.2-0.11-0.373-0.271-0.463l-0.004-0.002-5.078-2.777c-0.293-0.164-0.645-0.26-1.015-0.26-0.39 0-0.756 0.106-1.070 0.289l0.010-0.006-5.281 3.049c-0.636 0.375-1.056 1.055-1.059 1.834v6.082c0 0.779 0.422 1.461 1.049 1.828l0.009 0.006 5.281 3.049c0.305 0.178 0.67 0.284 1.061 0.284 0.373 0 0.723-0.098 1.027-0.265l-0.012 0.006 5.080-2.787c0.166-0.091 0.276-0.265 0.276-0.465v-0.716c0-0.293-0.238-0.529-0.529-0.529z"></path>
-  </svg>
-</CAvatar>
-<CAvatar color="success" textColor="white">
-  <svg id="cib-coreui-c" class="icon" viewBox="0 0 32 32">
-    <path d="M27.912 7.289l-10.324-5.961c-0.455-0.268-1.002-0.425-1.588-0.425s-1.133 0.158-1.604 0.433l0.015-0.008-10.324 5.961c-0.955 0.561-1.586 1.582-1.588 2.75v11.922c0.002 1.168 0.635 2.189 1.574 2.742l0.016 0.008 10.322 5.961c0.455 0.267 1.004 0.425 1.59 0.425 0.584 0 1.131-0.158 1.602-0.433l-0.014 0.008 10.322-5.961c0.955-0.561 1.586-1.582 1.588-2.75v-11.922c-0.002-1.168-0.633-2.189-1.573-2.742zM27.383 21.961c0 0.389-0.211 0.73-0.526 0.914l-0.004 0.002-10.324 5.961c-0.152 0.088-0.334 0.142-0.53 0.142s-0.377-0.053-0.535-0.145l0.005 0.002-10.324-5.961c-0.319-0.186-0.529-0.527-0.529-0.916v-11.922c0-0.389 0.211-0.73 0.526-0.914l0.004-0.002 10.324-5.961c0.152-0.090 0.334-0.143 0.53-0.143s0.377 0.053 0.535 0.144l-0.006-0.002 10.324 5.961c0.319 0.185 0.529 0.527 0.529 0.916z"></path><path d="M22.094 19.451h-0.758c-0.188 0-0.363 0.049-0.515 0.135l0.006-0.004-4.574 2.512-5.282-3.049v-6.082l5.282-3.051 4.576 2.504c0.146 0.082 0.323 0.131 0.508 0.131h0.758c0.293 0 0.529-0.239 0.529-0.531v-0.716c0-0.2-0.11-0.373-0.271-0.463l-0.004-0.002-5.078-2.777c-0.293-0.164-0.645-0.26-1.015-0.26-0.39 0-0.756 0.106-1.070 0.289l0.010-0.006-5.281 3.049c-0.636 0.375-1.056 1.055-1.059 1.834v6.082c0 0.779 0.422 1.461 1.049 1.828l0.009 0.006 5.281 3.049c0.305 0.178 0.67 0.284 1.061 0.284 0.373 0 0.723-0.098 1.027-0.265l-0.012 0.006 5.080-2.787c0.166-0.091 0.276-0.265 0.276-0.465v-0.716c0-0.293-0.238-0.529-0.529-0.529z"></path>
-  </svg>
-</CAvatar>
-<CAvatar color="danger" textColor="white">
-  <svg id="cib-coreui-c" class="icon" viewBox="0 0 32 32">
-    <path d="M27.912 7.289l-10.324-5.961c-0.455-0.268-1.002-0.425-1.588-0.425s-1.133 0.158-1.604 0.433l0.015-0.008-10.324 5.961c-0.955 0.561-1.586 1.582-1.588 2.75v11.922c0.002 1.168 0.635 2.189 1.574 2.742l0.016 0.008 10.322 5.961c0.455 0.267 1.004 0.425 1.59 0.425 0.584 0 1.131-0.158 1.602-0.433l-0.014 0.008 10.322-5.961c0.955-0.561 1.586-1.582 1.588-2.75v-11.922c-0.002-1.168-0.633-2.189-1.573-2.742zM27.383 21.961c0 0.389-0.211 0.73-0.526 0.914l-0.004 0.002-10.324 5.961c-0.152 0.088-0.334 0.142-0.53 0.142s-0.377-0.053-0.535-0.145l0.005 0.002-10.324-5.961c-0.319-0.186-0.529-0.527-0.529-0.916v-11.922c0-0.389 0.211-0.73 0.526-0.914l0.004-0.002 10.324-5.961c0.152-0.090 0.334-0.143 0.53-0.143s0.377 0.053 0.535 0.144l-0.006-0.002 10.324 5.961c0.319 0.185 0.529 0.527 0.529 0.916z"></path><path d="M22.094 19.451h-0.758c-0.188 0-0.363 0.049-0.515 0.135l0.006-0.004-4.574 2.512-5.282-3.049v-6.082l5.282-3.051 4.576 2.504c0.146 0.082 0.323 0.131 0.508 0.131h0.758c0.293 0 0.529-0.239 0.529-0.531v-0.716c0-0.2-0.11-0.373-0.271-0.463l-0.004-0.002-5.078-2.777c-0.293-0.164-0.645-0.26-1.015-0.26-0.39 0-0.756 0.106-1.070 0.289l0.010-0.006-5.281 3.049c-0.636 0.375-1.056 1.055-1.059 1.834v6.082c0 0.779 0.422 1.461 1.049 1.828l0.009 0.006 5.281 3.049c0.305 0.178 0.67 0.284 1.061 0.284 0.373 0 0.723-0.098 1.027-0.265l-0.012 0.006 5.080-2.787c0.166-0.091 0.276-0.265 0.276-0.465v-0.716c0-0.293-0.238-0.529-0.529-0.529z"></path>
-  </svg>
-</CAvatar>
-:::
-```vue
-<CAvatar color="info" textColor="white">
-  <svg id="cib-coreui-c" class="icon" viewBox="0 0 32 32">
-    <path d="M27.912 7.289l-10.324-5.961c-0.455-0.268-1.002-0.425-1.588-0.425s-1.133 0.158-1.604 0.433l0.015-0.008-10.324 5.961c-0.955 0.561-1.586 1.582-1.588 2.75v11.922c0.002 1.168 0.635 2.189 1.574 2.742l0.016 0.008 10.322 5.961c0.455 0.267 1.004 0.425 1.59 0.425 0.584 0 1.131-0.158 1.602-0.433l-0.014 0.008 10.322-5.961c0.955-0.561 1.586-1.582 1.588-2.75v-11.922c-0.002-1.168-0.633-2.189-1.573-2.742zM27.383 21.961c0 0.389-0.211 0.73-0.526 0.914l-0.004 0.002-10.324 5.961c-0.152 0.088-0.334 0.142-0.53 0.142s-0.377-0.053-0.535-0.145l0.005 0.002-10.324-5.961c-0.319-0.186-0.529-0.527-0.529-0.916v-11.922c0-0.389 0.211-0.73 0.526-0.914l0.004-0.002 10.324-5.961c0.152-0.090 0.334-0.143 0.53-0.143s0.377 0.053 0.535 0.144l-0.006-0.002 10.324 5.961c0.319 0.185 0.529 0.527 0.529 0.916z"></path><path d="M22.094 19.451h-0.758c-0.188 0-0.363 0.049-0.515 0.135l0.006-0.004-4.574 2.512-5.282-3.049v-6.082l5.282-3.051 4.576 2.504c0.146 0.082 0.323 0.131 0.508 0.131h0.758c0.293 0 0.529-0.239 0.529-0.531v-0.716c0-0.2-0.11-0.373-0.271-0.463l-0.004-0.002-5.078-2.777c-0.293-0.164-0.645-0.26-1.015-0.26-0.39 0-0.756 0.106-1.070 0.289l0.010-0.006-5.281 3.049c-0.636 0.375-1.056 1.055-1.059 1.834v6.082c0 0.779 0.422 1.461 1.049 1.828l0.009 0.006 5.281 3.049c0.305 0.178 0.67 0.284 1.061 0.284 0.373 0 0.723-0.098 1.027-0.265l-0.012 0.006 5.080-2.787c0.166-0.091 0.276-0.265 0.276-0.465v-0.716c0-0.293-0.238-0.529-0.529-0.529z"></path>
-  </svg>
-</CAvatar>
-<CAvatar color="success" textColor="white">
-  <svg id="cib-coreui-c" class="icon" viewBox="0 0 32 32">
-    <path d="M27.912 7.289l-10.324-5.961c-0.455-0.268-1.002-0.425-1.588-0.425s-1.133 0.158-1.604 0.433l0.015-0.008-10.324 5.961c-0.955 0.561-1.586 1.582-1.588 2.75v11.922c0.002 1.168 0.635 2.189 1.574 2.742l0.016 0.008 10.322 5.961c0.455 0.267 1.004 0.425 1.59 0.425 0.584 0 1.131-0.158 1.602-0.433l-0.014 0.008 10.322-5.961c0.955-0.561 1.586-1.582 1.588-2.75v-11.922c-0.002-1.168-0.633-2.189-1.573-2.742zM27.383 21.961c0 0.389-0.211 0.73-0.526 0.914l-0.004 0.002-10.324 5.961c-0.152 0.088-0.334 0.142-0.53 0.142s-0.377-0.053-0.535-0.145l0.005 0.002-10.324-5.961c-0.319-0.186-0.529-0.527-0.529-0.916v-11.922c0-0.389 0.211-0.73 0.526-0.914l0.004-0.002 10.324-5.961c0.152-0.090 0.334-0.143 0.53-0.143s0.377 0.053 0.535 0.144l-0.006-0.002 10.324 5.961c0.319 0.185 0.529 0.527 0.529 0.916z"></path><path d="M22.094 19.451h-0.758c-0.188 0-0.363 0.049-0.515 0.135l0.006-0.004-4.574 2.512-5.282-3.049v-6.082l5.282-3.051 4.576 2.504c0.146 0.082 0.323 0.131 0.508 0.131h0.758c0.293 0 0.529-0.239 0.529-0.531v-0.716c0-0.2-0.11-0.373-0.271-0.463l-0.004-0.002-5.078-2.777c-0.293-0.164-0.645-0.26-1.015-0.26-0.39 0-0.756 0.106-1.070 0.289l0.010-0.006-5.281 3.049c-0.636 0.375-1.056 1.055-1.059 1.834v6.082c0 0.779 0.422 1.461 1.049 1.828l0.009 0.006 5.281 3.049c0.305 0.178 0.67 0.284 1.061 0.284 0.373 0 0.723-0.098 1.027-0.265l-0.012 0.006 5.080-2.787c0.166-0.091 0.276-0.265 0.276-0.465v-0.716c0-0.293-0.238-0.529-0.529-0.529z"></path>
-  </svg>
-</CAvatar>
-<CAvatar color="danger" textColor="white">
-  <svg id="cib-coreui-c" class="icon" viewBox="0 0 32 32">
-    <path d="M27.912 7.289l-10.324-5.961c-0.455-0.268-1.002-0.425-1.588-0.425s-1.133 0.158-1.604 0.433l0.015-0.008-10.324 5.961c-0.955 0.561-1.586 1.582-1.588 2.75v11.922c0.002 1.168 0.635 2.189 1.574 2.742l0.016 0.008 10.322 5.961c0.455 0.267 1.004 0.425 1.59 0.425 0.584 0 1.131-0.158 1.602-0.433l-0.014 0.008 10.322-5.961c0.955-0.561 1.586-1.582 1.588-2.75v-11.922c-0.002-1.168-0.633-2.189-1.573-2.742zM27.383 21.961c0 0.389-0.211 0.73-0.526 0.914l-0.004 0.002-10.324 5.961c-0.152 0.088-0.334 0.142-0.53 0.142s-0.377-0.053-0.535-0.145l0.005 0.002-10.324-5.961c-0.319-0.186-0.529-0.527-0.529-0.916v-11.922c0-0.389 0.211-0.73 0.526-0.914l0.004-0.002 10.324-5.961c0.152-0.090 0.334-0.143 0.53-0.143s0.377 0.053 0.535 0.144l-0.006-0.002 10.324 5.961c0.319 0.185 0.529 0.527 0.529 0.916z"></path><path d="M22.094 19.451h-0.758c-0.188 0-0.363 0.049-0.515 0.135l0.006-0.004-4.574 2.512-5.282-3.049v-6.082l5.282-3.051 4.576 2.504c0.146 0.082 0.323 0.131 0.508 0.131h0.758c0.293 0 0.529-0.239 0.529-0.531v-0.716c0-0.2-0.11-0.373-0.271-0.463l-0.004-0.002-5.078-2.777c-0.293-0.164-0.645-0.26-1.015-0.26-0.39 0-0.756 0.106-1.070 0.289l0.010-0.006-5.281 3.049c-0.636 0.375-1.056 1.055-1.059 1.834v6.082c0 0.779 0.422 1.461 1.049 1.828l0.009 0.006 5.281 3.049c0.305 0.178 0.67 0.284 1.061 0.284 0.373 0 0.723-0.098 1.027-0.265l-0.012 0.006 5.080-2.787c0.166-0.091 0.276-0.265 0.276-0.465v-0.716c0-0.293-0.238-0.529-0.529-0.529z"></path>
-  </svg>
-</CAvatar>
-```
-
-## Rounded avatars
-
-Use the `shape="rounded"` prop to make avatars squared with rounded corners.
-
-::: demo
-<CAvatar color="primary" text-color="white" shape="rounded">CUI</CAvatar>
-<CAvatar color="secondary" shape="rounded">CUI</CAvatar>
-<CAvatar color="warning" text-color="white" shape="rounded">CUI</CAvatar>
-:::
-```vue
-<CAvatar color="primary" text-color="white" shape="rounded">CUI</CAvatar>
-<CAvatar color="secondary" shape="rounded">CUI</CAvatar>
-<CAvatar color="warning" text-color="white" shape="rounded">CUI</CAvatar>
-```
-## Square avatars
-
-Use the `shape="rounded-0"` prop to make avatars squared.
-
-::: demo
-<CAvatar color="primary" text-color="white" shape="rounded-0">CUI</CAvatar>
-<CAvatar color="secondary" shape="rounded-0">CUI</CAvatar>
-<CAvatar color="warning" text-color="white" shape="rounded-0">CUI</CAvatar>
-:::
-```vue
-<CAvatar color="primary" text-color="white" shape="rounded-0">CUI</CAvatar>
-<CAvatar color="secondary" shape="rounded-0">CUI</CAvatar>
-<CAvatar color="warning" text-color="white" shape="rounded-0">CUI</CAvatar>
-```
-
-## Sizes
-
-Fancy larger or smaller avatar? Add `size="xl"`, `size="lg"` or `size="sm"` for additional sizes.
-
-::: demo
-<CAvatar color="secondary" size="xl">CUI</CAvatar>
-<CAvatar color="secondary" size="lg">CUI</CAvatar>
-<CAvatar color="secondary" size="md">CUI</CAvatar>
-<CAvatar color="secondary">CUI</CAvatar>
-<CAvatar color="secondary" size="sm">CUI</CAvatar>
-:::
-```vue
-<CAvatar color="secondary" size="xl">CUI</CAvatar>
-<CAvatar color="secondary" size="lg">CUI</CAvatar>
-<CAvatar color="secondary" size="md">CUI</CAvatar>
-<CAvatar color="secondary">CUI</CAvatar>
-<CAvatar color="secondary" size="sm">CUI</CAvatar>
-```
-
-## Avatars with status
-
-Add a status indicator to avatars using the `status` property to show online or offline status.
-
-::: demo
-<CAvatar :src="$withBase('/images/avatars/1.jpg')" status="success"/>
-<CAvatar color="secondary" status="danger">CUI</CAvatar>
-:::
-```vue
-<CAvatar src="/images/avatars/1.jpg" status="success"/>
-<CAvatar color="secondary" status="danger">CUI</CAvatar>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue avatars use local CSS variables on `.avatar` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="_avatar.scss" capture="avatar-css-vars"/>
-
-#### How to use CSS variables
-
-```jsx
-const vars = {
-  '--my-css-var': 10,
-  '--my-another-css-var': 'red',
-}
-return <CAvatar style={vars}>...</CAvatar>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="avatar-variables"/>
-
-## API
-
-!!!include(./api/avatar/CAvatar.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/badge.md b/packages/docs/components/badge.md
deleted file mode 100644
index 6d46e501..00000000
--- a/packages/docs/components/badge.md
+++ /dev/null
@@ -1,230 +0,0 @@
----
-title: Vue Badge Component
-name: Badge
-description: Vue badge component is small count and labeling component.
-other_frameworks: badge
----
-
-## Example
-
-Badge component scales to suit the size of the parent element by using relative font sizing and `em` units.
-
-### Basic usage
-
-::: demo
-<h1>Example heading <CBadge color="secondary">New</CBadge></h1>
-<h2>Example heading <CBadge color="secondary">New</CBadge></h2>
-<h3>Example heading <CBadge color="secondary">New</CBadge></h3>
-<h4>Example heading <CBadge color="secondary">New</CBadge></h4>
-<h5>Example heading <CBadge color="secondary">New</CBadge></h5>
-<h6>Example heading <CBadge color="secondary">New</CBadge></h6>
-:::
-```vue
-<h1>Example heading <CBadge color="secondary">New</CBadge></h1>
-<h2>Example heading <CBadge color="secondary">New</CBadge></h2>
-<h3>Example heading <CBadge color="secondary">New</CBadge></h3>
-<h4>Example heading <CBadge color="secondary">New</CBadge></h4>
-<h5>Example heading <CBadge color="secondary">New</CBadge></h5>
-<h6>Example heading <CBadge color="secondary">New</CBadge></h6>
-```
-
-Badges can be used as part of links or buttons to provide a counter.
-
-::: demo
-<CButton color="primary">
-  Notifications <CBadge color="secondary">4</CBadge>
-</CButton>
-:::
-```vue
-<CButton color="primary">
-  Notifications <CBadge color="secondary">4</CBadge>
-</CButton>
-```
-
-Remark that depending on how you use them, badges may be complicated for users of screen readers and related assistive technologies.
-
-Unless the context is clear, consider including additional context with a visually hidden piece of additional text.
-
-::: demo
-<CButton color="primary">
-  Profile <CBadge color="secondary">9</CBadge>
-  <span class="visually-hidden">unread messages</span>
-</CButton>
-:::
-```vue
-<CButton color="primary">
-  Profile <CBadge color="secondary">9</CBadge>
-  <span class="visually-hidden">unread messages</span>
-</CButton>
-```
-
-### Positioned
-
-Use `position` prop to modify a component and position it in the corner of a link or button.
-
-::: demo
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge color="danger" position="top-start" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-<CButton color="primary" class="position-relative ms-1">
-  Profile
-  <CBadge color="danger" position="top-end" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-<br/>
-<CButton color="primary" class="position-relative ">
-  Profile
-  <CBadge color="danger" position="bottom-start" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-<CButton color="primary" class="position-relative ms-1">
-  Profile
-  <CBadge color="danger" position="bottom-end" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-:::
-```vue
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge color="danger" position="top-start" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge color="danger" position="top-end" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge color="danger" position="bottom-start" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge color="danger" position="bottom-end" shape="rounded-pill">
-    99+ <span class="visually-hidden">unread messages</span>
-  </CBadge>
-</CButton>
-```
-
-You can also create more generic indicators without a counter using a few more utilities.
-
-::: demo
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge class="border border-light p-2" color="danger" position="top-end" shape="rounded-circle">
-    <span class="visually-hidden">New alerts</span>
-  </CBadge>
-</CButton>
-:::
-```vue
-<CButton color="primary" class="position-relative">
-  Profile
-  <CBadge class="border border-light p-2" color="danger" position="top-end" shape="rounded-circle">
-    <span class="visually-hidden">New alerts</span>
-  </CBadge>
-</CButton>
-```
-
-## Contextual variations
-
-Add any of the below-mentioned `color` props to modify the presentation of a badge.
-
-::: demo
-<CBadge color="primary">primary</CBadge>
-<CBadge color="success">success</CBadge>
-<CBadge color="danger">danger</CBadge>
-<CBadge color="warning">warning</CBadge>
-<CBadge color="info">info</CBadge>
-<CBadge textBgColor="light">light</CBadge>
-<CBadge color="dark">dark</CBadge>
-:::
-```vue
-<CBadge color="primary">primary</CBadge>
-<CBadge color="success">success</CBadge>
-<CBadge color="danger">danger</CBadge>
-<CBadge color="warning">warning</CBadge>
-<CBadge color="info">info</CBadge>
-<CBadge textBgColor="light">light</CBadge>
-<CBadge color="dark">dark</CBadge>
-```
-
-You can also apply contextual variations with the `textBgColor` property, which automatically sets the text color to ensure compliance with the WCAG 4.5:1 contrast ratio standard for enhanced accessibility.
-
-::: demo
-<CBadge textBgColor="primary">primary</CBadge>
-<CBadge textBgColor="success">success</CBadge>
-<CBadge textBgColor="danger">danger</CBadge>
-<CBadge textBgColor="warning">warning</CBadge>
-<CBadge textBgColor="info">info</CBadge>
-<CBadge textBgColor="light">light</CBadge>
-<CBadge textBgColor="dark">dark</CBadge>
-:::
-```vue
-<CBadge textBgColor="primary">primary</CBadge>
-<CBadge textBgColor="success">success</CBadge>
-<CBadge textBgColor="danger">danger</CBadge>
-<CBadge textBgColor="warning">warning</CBadge>
-<CBadge textBgColor="info">info</CBadge>
-<CBadge textBgColor="light">light</CBadge>
-<CBadge textBgColor="dark">dark</CBadge>
-```
-
-
-## Pill badges
-
-Apply the `shape="rounded-pill"` prop to make badges rounded.
-
-::: demo
-<CBadge color="primary" shape="rounded-pill">primary</CBadge>
-<CBadge color="success" shape="rounded-pill">success</CBadge>
-<CBadge color="danger" shape="rounded-pill">danger</CBadge>
-<CBadge color="warning" shape="rounded-pill">warning</CBadge>
-<CBadge color="info" shape="rounded-pill">info</CBadge>
-<CBadge textBgColor="light" shape="rounded-pill">light</CBadge>
-<CBadge color="dark" shape="rounded-pill">dark</CBadge>
-:::
-```vue
-<CBadge color="primary" shape="rounded-pill">primary</CBadge>
-<CBadge color="success" shape="rounded-pill">success</CBadge>
-<CBadge color="danger" shape="rounded-pill">danger</CBadge>
-<CBadge color="warning" shape="rounded-pill">warning</CBadge>
-<CBadge color="info" shape="rounded-pill">info</CBadge>
-<CBadge textBgColor="light" shape="rounded-pill">light</CBadge>
-<CBadge color="dark" shape="rounded-pill">dark</CBadge>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue badges use local CSS variables on `.badges` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="_badge.scss" capture="badge-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CBadge :style="vars">...</CBadge>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="badge-variables" />
-
-## API
-
-!!!include(./api/badge/CBadge.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/breadcrumb.md b/packages/docs/components/breadcrumb.md
deleted file mode 100644
index 02f50c53..00000000
--- a/packages/docs/components/breadcrumb.md
+++ /dev/null
@@ -1,134 +0,0 @@
----
-title: Vue Breadcrumb Component
-name: Breadcrumb
-description: Vue breadcrumb navigation component which indicates the current location within a navigational hierarchy that automatically adds separators.
-other_frameworks: breadcrumb
----
-
-
-## Example
-
-The breadcrumb navigation provides links back to each previous page the user navigated through and shows the current location in a website or an application. You don’t have to add separators, because they automatically added in CSS through ::before and content.
-
-::: demo
-<CBreadcrumb>
-  <CBreadcrumbItem active>Home</CBreadcrumbItem>
-</CBreadcrumb>
-<CBreadcrumb>
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-<CBreadcrumb>
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem href="#">Library</CBreadcrumbItem>
-  <CBreadcrumbItem active>Data</CBreadcrumbItem>
-</CBreadcrumb>
-:::
-```vue
-<CBreadcrumb>
-  <CBreadcrumbItem active>Home</CBreadcrumbItem>
-</CBreadcrumb>
-<CBreadcrumb>
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-<CBreadcrumb>
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem href="#">Library</CBreadcrumbItem>
-  <CBreadcrumbItem active>Data</CBreadcrumbItem>
-</CBreadcrumb>
-```
-
-## Dividers
-
-Dividers 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 `--coreui-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.
-
-::: demo
-<CBreadcrumb style="--cui-breadcrumb-divider: '>'">
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-:::
-```vue
-<CBreadcrumb style="--cui-breadcrumb-divider: '>'">
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-```
-
-When 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:
-
-```scss
-$breadcrumb-divider: quote(">");
-```
-
-It's also possible to use an **embedded SVG icon**. Apply it via our CSS custom property, or use the Sass variable.
-
-::: demo
-<CBreadcrumb style="--cui-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='currentColor'/%3E%3C/svg%3E&#34;);">
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-:::
-```vue
-<CBreadcrumb style="--cui-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='currentColor'/%3E%3C/svg%3E&#34;);">
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-```
-
-```scss
-$breadcrumb-divider: url("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='currentColor'/%3E%3C/svg%3E");
-```
-
-You can also remove the divider setting `--cui-breadcrumb-divider: '';` (empty strings in CSS custom properties counts as a value), or setting the Sass variable to `$breadcrumb-divider: none;`.
-
-::: demo
-<CBreadcrumb style="--cui-breadcrumb-divider: '';">
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-:::
-```vue
-<CBreadcrumb style="--cui-breadcrumb-divider: '';">
-  <CBreadcrumbItem href="#">Home</CBreadcrumbItem>
-  <CBreadcrumbItem active>Library</CBreadcrumbItem>
-</CBreadcrumb>
-```
-
-```scss
-$breadcrumb-divider: none;
-```
-
-## Accessibility
-
-Since breadcrumbs provide navigation, it's useful to add a significant label such as `aria-label="breadcrumb"` to explain the type of navigation implemented in the `<nav>` element. You should also add an `aria-current="page"` to the last item of the set to show that it represents the current page. **CoreUI for Vue.js automatically add all of this labels to breadcrumb's components.** 
-
-For more information, see the [WAI-ARIA Authoring Practices for the breadcrumb pattern](https://www.w3.org/TR/wai-aria-practices/#breadcrumb).
-
-## Customizing
-
-### CSS variables
-
-Vue breadcrumbs 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.
-
-<ScssDocs file="_breadcrumb.scss" capture="breadcrumb-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CBreadcrumb :style="vars">...</CBreadcrumb>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="breadcrumb-variables" />
-
-## API
-
-!!!include(./api/breadcrumb/CBreadcrumbItem.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/button-group.md b/packages/docs/components/button-group.md
deleted file mode 100644
index 64d66009..00000000
--- a/packages/docs/components/button-group.md
+++ /dev/null
@@ -1,435 +0,0 @@
----
-title: Vue Button Group Component
-name: Button group
-description: Vue button group component allows to group a series of buttons and power them with JavaScript.
-other_frameworks: button-group
----
-
-## Basic example
-
-Wrap a series of `<CButton>` components in `<CButtonGroup>`. 
-
-::: demo
-<CButtonGroup role="group" aria-label="Basic example">
-  <CButton color="primary">Left</CButton>
-  <CButton color="primary">Middle</CButton>
-  <CButton color="primary">Right</CButton>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup role="group" aria-label="Basic example">
-  <CButton color="primary">Left</CButton>
-  <CButton color="primary">Middle</CButton>
-  <CButton color="primary">Right</CButton>
-</CButtonGroup>
-```
-
-##### Ensure the correct `role` and provide a label
-
-For assistive technologies (ex. screen readers) to communicate that a series of buttons are grouped, a proper `role` attribute has to be provided. For button groups, this should be `role="group"`, while toolbars should have a `role="toolbar"`.
-
-Besides, groups and toolbars should be provided an understandable label, as most assistive technologies will otherwise not declare them, despite the appearance of the specific role attribute. In the following examples provided here, we apply `aria-label`, but options such as `aria-labelledby` can also be used.
-
-These classes can also be added to groups of links, as an alternative to the `<CNav>` components.
-
-::: demo
-<CButtonGroup>
-  <CButton href="#" color="primary" active>Active link</CButton>
-  <CButton href="#" color="primary">Link</CButton>
-  <CButton href="#" color="primary">Link</CButton>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup>
-  <CButton href="#" color="primary" active>Active link</CButton>
-  <CButton href="#" color="primary">Link</CButton>
-  <CButton href="#" color="primary">Link</CButton>
-</CButtonGroup>
-```
-
-## Mixed styles
-
-::: demo
-<CButtonGroup role="group" aria-label="Basic mixed styles example">
-  <CButton color="danger">Left</CButton>
-  <CButton color="warning">Middle</CButton>
-  <CButton color="success">Right</CButton>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup role="group" aria-label="Basic mixed styles example">
-  <CButton color="danger">Left</CButton>
-  <CButton color="warning">Middle</CButton>
-  <CButton color="success">Right</CButton>
-</CButtonGroup>
-```
-
-## Outlined styles
-
-::: demo
-<CButtonGroup role="group" aria-label="Basic outlined example">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup role="group" aria-label="Basic outlined example">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-```
-
-## Checkbox and radio button groups
-
-Combine button-like checkbox and radio toggle buttons into a seamless looking button group.
-
-::: demo
-<CButtonGroup role="group" aria-label="Basic checkbox toggle button group">
-  <CFormCheck :button="{color: 'primary', variant: 'outline'}" id="btncheck1" autocomplete="off" label="Checkbox 1"/>
-  <CFormCheck :button="{color: 'primary', variant: 'outline'}" id="btncheck2" autocomplete="off" label="Checkbox 2"/>
-  <CFormCheck :button="{color: 'primary', variant: 'outline'}" id="btncheck3" autocomplete="off" label="Checkbox 3"/>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup role="group" aria-label="Basic checkbox toggle button group">
-  <CFormCheck :button="{color: 'primary', variant: 'outline'}" id="btncheck1" autocomplete="off" label="Checkbox 1"/>
-  <CFormCheck :button="{color: 'primary', variant: 'outline'}" id="btncheck2" autocomplete="off" label="Checkbox 2"/>
-  <CFormCheck :button="{color: 'primary', variant: 'outline'}" id="btncheck3" autocomplete="off" label="Checkbox 3"/>
-</CButtonGroup>
-```
-
-::: demo
-<CButtonGroup role="group" aria-label="Basic checkbox toggle button group">
-  <CFormCheck type="radio" :button="{color: 'primary', variant: 'outline'}" name="btnradio" id="btnradio1" autocomplete="off" label="Radio 1" checked/>
-  <CFormCheck type="radio" :button="{color: 'primary', variant: 'outline'}" name="btnradio" id="btnradio2" autocomplete="off" label="Radio 2"/>
-  <CFormCheck type="radio" :button="{color: 'primary', variant: 'outline'}" name="btnradio" id="btnradio3" autocomplete="off" label="Radio 3"/>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup role="group" aria-label="Basic checkbox toggle button group">
-  <CFormCheck type="radio" :button="{color: 'primary', variant: 'outline'}" name="btnradio" id="btnradio1" autocomplete="off" label="Radio 1" checked/>
-  <CFormCheck type="radio" :button="{color: 'primary', variant: 'outline'}" name="btnradio" id="btnradio2" autocomplete="off" label="Radio 2"/>
-  <CFormCheck type="radio" :button="{color: 'primary', variant: 'outline'}" name="btnradio" id="btnradio3" autocomplete="off" label="Radio 3"/>
-</CButtonGroup>
-```
-
-## Button toolbar
-
-Join sets of button groups into button toolbars for more complicated components. Use utility classes as needed to space out groups, buttons, and more.
-
-::: demo
-<CButtonToolbar role="group" aria-label="Toolbar with button groups">
-  <CButtonGroup class="me-2" role="group" aria-label="First group">
-    <CButton color="primary">1</CButton>
-    <CButton color="primary">2</CButton>
-    <CButton color="primary">3</CButton>
-    <CButton color="primary">4</CButton>
-  </CButtonGroup>
-  <CButtonGroup class="me-2" role="group" aria-label="Second group">
-    <CButton color="secondary">5</CButton>
-    <CButton color="secondary">6</CButton>
-    <CButton color="secondary">7</CButton>
-  </CButtonGroup>
-  <CButtonGroup class="me-2" role="group" aria-label="Third group">
-    <CButton color="info">8</CButton>
-  </CButtonGroup>
-</CButtonToolbar>
-:::
-```vue
-<CButtonToolbar role="group" aria-label="Toolbar with button groups">
-  <CButtonGroup class="me-2" role="group" aria-label="First group">
-    <CButton color="primary">1</CButton>
-    <CButton color="primary">2</CButton>
-    <CButton color="primary">3</CButton>
-    <CButton color="primary">4</CButton>
-  </CButtonGroup>
-  <CButtonGroup class="me-2" role="group" aria-label="Second group">
-    <CButton color="secondary">5</CButton>
-    <CButton color="secondary">6</CButton>
-    <CButton color="secondary">7</CButton>
-  </CButtonGroup>
-  <CButtonGroup class="me-2" role="group" aria-label="Third group">
-    <CButton color="info">8</CButton>
-  </CButtonGroup>
-</CButtonToolbar>
-```
-
-Feel free to combine input groups with button groups in your toolbars. Similar to the example above, you’ll likely need some utilities through to space items correctly.
-
-::: demo
-<CButtonToolbar class="mb-3" role="group" aria-label="Toolbar with button groups">
-  <CButtonGroup class="me-2" role="group" aria-label="First group">
-    <CButton color="secondary" variant="outline">1</CButton>
-    <CButton color="secondary" variant="outline">2</CButton>
-    <CButton color="secondary" variant="outline">3</CButton>
-    <CButton color="secondary" variant="outline">4</CButton>
-  </CButtonGroup>
-  <CInputGroup>
-    <CInputGroupText>@</CInputGroupText>
-    <CFormInput placeholder="Input group example" aria-label="Input group example" aria-describedby="btnGroupAddon"/>
-  </CInputGroup>
-</CButtonToolbar>
-<CButtonToolbar class="justify-content-between" role="group" aria-label="Toolbar with button groups">
-  <CButtonGroup class="me-2" role="group" aria-label="First group">
-    <CButton color="secondary" variant="outline">1</CButton>
-    <CButton color="secondary" variant="outline">2</CButton>
-    <CButton color="secondary" variant="outline">3</CButton>
-    <CButton color="secondary" variant="outline">4</CButton>
-  </CButtonGroup>
-  <CInputGroup>
-    <CInputGroupText>@</CInputGroupText>
-    <CFormInput placeholder="Input group example" aria-label="Input group example" aria-describedby="btnGroupAddon"/>
-  </CInputGroup>
-</CButtonToolbar>
-:::
-```vue
-<CButtonToolbar class="mb-3" role="group" aria-label="Toolbar with button groups">
-  <CButtonGroup class="me-2" role="group" aria-label="First group">
-    <CButton color="secondary" variant="outline">1</CButton>
-    <CButton color="secondary" variant="outline">2</CButton>
-    <CButton color="secondary" variant="outline">3</CButton>
-    <CButton color="secondary" variant="outline">4</CButton>
-  </CButtonGroup>
-  <CInputGroup>
-    <CInputGroupText>@</CInputGroupText>
-    <CFormInput placeholder="Input group example" aria-label="Input group example" aria-describedby="btnGroupAddon"/>
-  </CInputGroup>
-</CButtonToolbar>
-<CButtonToolbar class="justify-content-between" role="group" aria-label="Toolbar with button groups">
-  <CButtonGroup class="me-2" role="group" aria-label="First group">
-    <CButton color="secondary" variant="outline">1</CButton>
-    <CButton color="secondary" variant="outline">2</CButton>
-    <CButton color="secondary" variant="outline">3</CButton>
-    <CButton color="secondary" variant="outline">4</CButton>
-  </CButtonGroup>
-  <CInputGroup>
-    <CInputGroupText>@</CInputGroupText>
-    <CFormInput placeholder="Input group example" aria-label="Input group example" aria-describedby="btnGroupAddon"/>
-  </CInputGroup>
-</CButtonToolbar>
-```
-
-## Sizing
-
-Alternatively, of implementing button sizing classes to each button in a group, set `size` property to all `<CButtonGroup>`'s, including each one when nesting multiple groups.
-
-::: demo
-<CButtonGroup size="lg" role="group" aria-label="Large button group">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-<br/>
-<CButtonGroup role="group" aria-label="Default button group">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-<br/>
-<CButtonGroup size="sm" role="group" aria-label="Small button group">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup size="lg" role="group" aria-label="Large button group">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-<br/>
-<CButtonGroup role="group" aria-label="Default button group">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-<br/>
-<CButtonGroup size="sm" role="group" aria-label="Small button group">
-  <CButton color="primary" variant="outline">Left</CButton>
-  <CButton color="primary" variant="outline">Middle</CButton>
-  <CButton color="primary" variant="outline">Right</CButton>
-</CButtonGroup>
-```
-
-## Nesting
-
-Put a `<CDropdown>` inside `<CButtonGroup>` when you need dropdown menus combined with a series of buttons.
-
-::: demo
-<CButtonGroup role="group" aria-label="Button group with nested dropdown">
-  <CButton color="primary">1</CButton>
-  <CButton color="primary">2</CButton>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup role="group" aria-label="Button group with nested dropdown">
-  <CButton color="primary">1</CButton>
-  <CButton color="primary">2</CButton>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CButtonGroup>
-```
-
-## Vertical variation
-
-Create a set of buttons that appear vertically stacked rather than horizontally. **Split button dropdowns are not supported here.**
-
-::: demo
-<CButtonGroup vertical role="group" aria-label="Vertical button group">
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup vertical role="group" aria-label="Vertical button group">
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-  <CButton color="dark">Button</CButton>
-</CButtonGroup>
-```
-
-::: demo
-<CButtonGroup vertical role="group" aria-label="Vertical button group">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CButtonGroup>
-:::
-```vue
-<CButtonGroup vertical role="group" aria-label="Vertical button group">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CDropdown variant="btn-group">
-    <CDropdownToggle color="primary">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CButtonGroup>
-```
-
-::: demo
-<CButtonGroup vertical role="group" aria-label="Vertical button group">
-  <CFormCheck type="radio" :button="{ color: 'danger', variant: 'outline' }" name="vbtnradio" id="vbtnradio1" autocomplete="off" label="Radio 1" checked/>
-  <CFormCheck type="radio" :button="{ color: 'danger', variant: 'outline' }" name="vbtnradio" id="vbtnradio2" autocomplete="off" label="Radio 2"/>
-  <CFormCheck type="radio" :button="{ color: 'danger', variant: 'outline' }" name="vbtnradio" id="vbtnradio3" autocomplete="off" label="Radio 3"/>
-</CButtonGroup> 
-:::
-```vue
-<CButtonGroup vertical role="group" aria-label="Vertical button group">
-  <CFormCheck type="radio" :button="{ color: 'danger', variant: 'outline' }" name="vbtnradio" id="vbtnradio1" autocomplete="off" label="Radio 1" checked/>
-  <CFormCheck type="radio" :button="{ color: 'danger', variant: 'outline' }" name="vbtnradio" id="vbtnradio2" autocomplete="off" label="Radio 2"/>
-  <CFormCheck type="radio" :button="{ color: 'danger', variant: 'outline' }" name="vbtnradio" id="vbtnradio3" autocomplete="off" label="Radio 3"/>
-</CButtonGroup>
-```
-
-## API
-
-!!!include(./api/button-group/CButtonGroup.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/button.md b/packages/docs/components/button.md
deleted file mode 100644
index fe592e77..00000000
--- a/packages/docs/components/button.md
+++ /dev/null
@@ -1,338 +0,0 @@
----
-title: Vue Buttons Component
-name: Buttons
-description: Vue button component for actions in tables, forms, cards, and more. CoreUI for Vue.js provides various styles, states, and size. Ready to use and easy to customize.
-other_frameworks: button
----
-
-## Examples
-
-CoreUI includes a bunch of predefined buttons components, each serving its own semantic purpose. Buttons show what action will happen when the user clicks or touches it. CoreUI buttons are used to initialize operations, both in the background or foreground of an experience.
-
-::: demo
-<CButton color="primary" disabled>Primary</CButton>
-<CButton color="secondary">Secondary</CButton>
-<CButton color="success">Success</CButton>
-<CButton color="danger">Danger</CButton>
-<CButton color="warning">Warning</CButton>
-<CButton color="info">Info</CButton>
-<CButton color="light">Light</CButton>
-<CButton color="dark">Dark</CButton>
-<CButton color="link">Link</CButton>
-:::
-```vue
-<CButton color="primary" disabled>Primary</CButton>
-<CButton color="secondary">Secondary</CButton>
-<CButton color="success">Success</CButton>
-<CButton color="danger">Danger</CButton>
-<CButton color="warning">Warning</CButton>
-<CButton color="info">Info</CButton>
-<CButton color="light">Light</CButton>
-<CButton color="dark">Dark</CButton>
-<CButton color="link">Link</CButton>
-```
-
-<Callout color="info" title="Conveying meaning to assistive technologies">
-  Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (e.g. the visible text), or is included through alternative means, such as additional text hidden with the <code>.visually-hidden</code> class.
-</Callout>
-
-## Disable text wrapping
-
-If you don't want the button text to wrap, you can add the `.text-nowrap` class to the `<CButton>`. In Sass, you can set `$btn-white-space: nowrap` to disable text wrapping for each button.
-
-## Button components
-
-The `<CButton>` component are designed for `<button>` ,  `<a>`  or  `<input>` elements (though some browsers may apply a slightly different rendering).
-
-If you're using `<CButton>` component as `<a>` elements that are used to trigger functionality ex. collapsing content, these links should be given a `role="button"` to adequately communicate their meaning to assistive technologies such as screen readers.
-
-::: demo
-<CButton as="a" color="primary" href="#" role="button">Link</CButton>
-<CButton type="submit" color="primary">Button</CButton>
-<CButton as="input" type="button" color="primary" value="Input"/>
-<CButton as="input" type="submit" color="primary" value="Submit"/>
-<CButton as="input" type="reset" color="primary" value="Reset"/>
-:::
-```vue
-<CButton as="a" color="primary" href="#" role="button">Link</CButton>
-<CButton type="submit" color="primary">Button</CButton>
-<CButton as="input" type="button" color="primary" value="Input"/>
-<CButton as="input" type="submit" color="primary" value="Submit"/>
-<CButton as="input" type="reset" color="primary" value="Reset"/>
-```
-
-## Outline buttons
-
-### Base outline style
-
-The `variant="outline` property provides a neutral outline button style without any color modifiers. It’s useful as a foundation for minimal buttons without background color or strong visual emphasis.
-
-::: demo
-<CButton variant="outline">Base outline button</CButton>
-<CButton variant="outline" active>Active state</CButton>
-<CButton variant="outline" disabled>Disabled state</CButton>
-:::
-```vue
-<CButton variant="outline">Base outline button</CButton>
-<CButton variant="outline" active>Active state</CButton>
-<CButton variant="outline" disabled>Disabled state</CButton>
-```
-
-These Vue buttons use a transparent background, subtle border, and inherit text color from the parent context. They’re best suited for minimalist UI elements like modals, toolbars, or secondary actions.
-
-
-### Themed outline variants
-
-If you need a button, but without the strong background colors, set `color` and `variant=" outline"` props to remove all background colors.
-
-::: demo
-<CButton color="primary" variant="outline">Primary</CButton>
-<CButton color="secondary" variant="outline">Secondary</CButton>
-<CButton color="success" variant="outline">Success</CButton>
-<CButton color="danger" variant="outline">Danger</CButton>
-<CButton color="warning" variant="outline">Warning</CButton>
-<CButton color="info" variant="outline">Info</CButton>
-<CButton color="light" variant="outline">Light</CButton>
-<CButton color="dark" variant="outline">Dark</CButton>
-:::
-```vue
-<CButton color="primary" variant="outline">Primary</CButton>
-<CButton color="secondary" variant="outline">Secondary</CButton>
-<CButton color="success" variant="outline">Success</CButton>
-<CButton color="danger" variant="outline">Danger</CButton>
-<CButton color="warning" variant="outline">Warning</CButton>
-<CButton color="info" variant="outline">Info</CButton>
-<CButton color="light" variant="outline">Light</CButton>
-<CButton color="dark" variant="outline">Dark</CButton>
-```
-
-These outline variants of our Vue.js buttons retain transparent backgrounds by default, but display a background tint on hover or focus to indicate interactivity. They’re ideal for secondary actions when you want to differentiate from the standard buttons visually.
-
-## Ghost buttons
-
-### Base ghost style
-
-Use the `variant="ghost"` property to create ultra-minimalist buttons with no borders and a fully transparent background. These Vue buttons rely solely on text color for visibility and apply a background highlight when hovered over or in an active state.
-
-They’re perfect for interfaces where you want buttons to be present but visually unobtrusive—such as action buttons in modals, cards, or toolbars.
-
-If you need a ghost variant of button, set `variant="ghost"` prop to remove all background colors.
-
-::: demo
-<CButton variant="ghost">Base ghost button</CButton>
-<CButton variant="ghost" active>Active state</CButton>
-<CButton variant="ghost" disabled>Disabled state</CButton>
-:::
-```vue
-<CButton variant="ghost">Base ghost button</CButton>
-<CButton variant="ghost" active>Active state</CButton>
-<CButton variant="ghost" disabled>Disabled state</CButton>
-```
-
-To apply theme colors to Vue ghost buttons, use the `color` and `variant="ghost"` properties. By default, these variants color only the text. On hover or focus, they add a background that corresponds to the theme color.
-
-::: demo
-<CButton color="primary" variant="ghost">Primary</CButton>
-<CButton color="secondary" variant="ghost">Secondary</CButton>
-<CButton color="success" variant="ghost">Success</CButton>
-<CButton color="danger" variant="ghost">Danger</CButton>
-<CButton color="warning" variant="ghost">Warning</CButton>
-<CButton color="info" variant="ghost">Info</CButton>
-<CButton color="light" variant="ghost">Light</CButton>
-<CButton color="dark" variant="ghost">Dark</CButton>
-:::
-```vue
-<CButton color="primary" variant="ghost">Primary</CButton>
-<CButton color="secondary" variant="ghost">Secondary</CButton>
-<CButton color="success" variant="ghost">Success</CButton>
-<CButton color="danger" variant="ghost">Danger</CButton>
-<CButton color="warning" variant="ghost">Warning</CButton>
-<CButton color="info" variant="ghost">Info</CButton>
-<CButton color="light" variant="ghost">Light</CButton>
-<CButton color="dark" variant="ghost">Dark</CButton>
-```
-
-
-<Callout color="info">Some 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.</Callout>
-
-## Sizes
-
-Larger or smaller buttons? Add `size="lg"` or `size="sm"` for additional sizes.
-
-::: demo
-<CButton color="primary" size="lg">Large button</CButton>
-<CButton color="secondary" size="lg">Large button</CButton>
-:::
-```vue
-<CButton color="primary" size="lg">Large button</CButton>
-<CButton color="secondary" size="lg">Large button</CButton>
-```
-
-## Shapes
-
-### Pill buttons
-
-::: demo
-<CButton color="primary" shape="rounded-pill">Primary</CButton>
-<CButton color="secondary" shape="rounded-pill">Secondary</CButton>
-<CButton color="success" shape="rounded-pill">Success</CButton>
-<CButton color="danger" shape="rounded-pill">Danger</CButton>
-<CButton color="warning" shape="rounded-pill">Warning</CButton>
-<CButton color="info" shape="rounded-pill">Info</CButton>
-<CButton color="light" shape="rounded-pill">Light</CButton>
-<CButton color="dark" shape="rounded-pill">Dark</CButton>
-<CButton color="link" shape="rounded-pill">Link</CButton>
-:::
-```vue
-<CButton color="primary" shape="rounded-pill">Primary</CButton>
-<CButton color="secondary" shape="rounded-pill">Secondary</CButton>
-<CButton color="success" shape="rounded-pill">Success</CButton>
-<CButton color="danger" shape="rounded-pill">Danger</CButton>
-<CButton color="warning" shape="rounded-pill">Warning</CButton>
-<CButton color="info" shape="rounded-pill">Info</CButton>
-<CButton color="light" shape="rounded-pill">Light</CButton>
-<CButton color="dark" shape="rounded-pill">Dark</CButton>
-<CButton color="link" shape="rounded-pill">Link</CButton>
-```
-
-### Square buttons
-
-::: demo
-<CButton color="primary" shape="rounded-0">Primary</CButton>
-<CButton color="secondary" shape="rounded-0">Secondary</CButton>
-<CButton color="success" shape="rounded-0">Success</CButton>
-<CButton color="danger" shape="rounded-0">Danger</CButton>
-<CButton color="warning" shape="rounded-0">Warning</CButton>
-<CButton color="info" shape="rounded-0">Info</CButton>
-<CButton color="light" shape="rounded-0">Light</CButton>
-<CButton color="dark" shape="rounded-0">Dark</CButton>
-<CButton color="link" shape="rounded-0">Link</CButton>
-:::
-```vue
-<CButton color="primary" shape="rounded-0">Primary</CButton>
-<CButton color="secondary" shape="rounded-0">Secondary</CButton>
-<CButton color="success" shape="rounded-0">Success</CButton>
-<CButton color="danger" shape="rounded-0">Danger</CButton>
-<CButton color="warning" shape="rounded-0">Warning</CButton>
-<CButton color="info" shape="rounded-0">Info</CButton>
-<CButton color="light" shape="rounded-0">Light</CButton>
-<CButton color="dark" shape="rounded-0">Dark</CButton>
-<CButton color="link" shape="rounded-0">Link</CButton>
-```
-
-## Disabled state
-
-Add the `disabled` boolean prop to any `<CButton>` component to make buttons look inactive. Disabled button has `pointer-events: none` applied to, disabling hover and active states from triggering.
-
-::: demo
-<CButton color="primary" size="lg" disabled>Primary button</CButton>
-<CButton color="secondary" size="lg" disabled>Button</CButton>
-:::
-```vue
-<CButton color="primary" size="lg" disabled>Primary button</CButton>
-<CButton color="secondary" size="lg" disabled>Button</CButton>
-```
-
-Disabled buttons using the `<a>` component act a little different:
-
-`<a>`s don't support the `disabled` attribute, so CoreUI has to add `.disabled` class to make buttons look inactive. CoreUI also has to add to the disabled button component `aria-disabled="true"` attribute to show the state of the component to assistive technologies.
-
-::: demo
-<CButton as="a" href="#" color="primary" size="lg" disabled>Primary link</CButton>
-<CButton as="a" href="#" color="secondary" size="lg" disabled>Link</CButton>
-:::
-```vue
-<CButton as="a" href="#" color="primary" size="lg" disabled>Primary link</CButton>
-<CButton as="a" href="#" color="secondary" size="lg" disabled>Link</CButton>
-```
-
-The `.disabled` class uses `pointer-events: none` to try to disable the link functionality of `<a>`s, but that CSS property is not yet standardized. Besides, 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, we automatically add a `tabindex="-1"` attribute on disabled links (to prevent them from receiving keyboard focus) and use custom JavaScript to disable their functionality.
-
-## Block buttons
-
-Create buttons that span the full width of a parent—by using utilities.
-
-::: demo
-<div class="d-grid gap-2">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-:::
-```vue
-<div class="d-grid gap-2">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-```
-
-Here 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.
-
-::: demo
-<div class="d-grid gap-2 d-md-block">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-:::
-```vue
-<div class="d-grid gap-2 d-md-block">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-```
-
-You 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.
-
-::: demo
-<div class="d-grid gap-2 col-6 mx-auto">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-:::
-```vue
-<div class="d-grid gap-2 col-6 mx-auto">
-  <CButton color="primary">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-```
-
-Additional 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.
-
-::: demo
-<div class="d-grid gap-2 d-md-flex justify-content-md-end">
-  <CButton color="primary" class="me-md-2">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-:::
-```vue
-<div class="d-grid gap-2 d-md-flex justify-content-md-end">
-  <CButton color="primary" class="me-md-2">Button</CButton>
-  <CButton color="primary">Button</CButton>
-</div>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue buttons 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.
-
-
-<ScssDocs file="_buttons.scss" capture="btn-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CButton :style="vars">...</CButton>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="btn-variables"/>
-
-## API
-
-!!!include(./api/button/CButton.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/callout.md b/packages/docs/components/callout.md
deleted file mode 100644
index 5066f13f..00000000
--- a/packages/docs/components/callout.md
+++ /dev/null
@@ -1,96 +0,0 @@
----
-title: Vue Callout Component
-name: Callout
-description: Vue callout component provides presentation of content in a visually distinct manner. Includes a heading, icon and typically text-based content.
-other_frameworks: callout
----
-
-## Examples
-
-Callout component is prepared for any length of text, as well as an optional elements like icons, headings, etc. For a styling, use one of the **required** contextual props (e.g., `color="success"`).
-
-::: demo
-<CCallout color="primary">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="secondary">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="success">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="danger">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="warning">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="info">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="light">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="dark">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-:::
-```vue
-<CCallout color="primary">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="secondary">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="success">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="danger">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="warning">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="info">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="light">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-<CCallout color="dark">
-  New to or unfamiliar with flexbox? Read this CSS Tricks flexbox guide for background, terminology, guidelines, and code snippets.
-</CCallout>
-```
-
-<CCallout color="info">
-  <h5>Conveying meaning to assistive technologies</h5>
-  <p>
-    Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (e.g. the visible text), or is included through alternative means, such as additional text hidden with the `.visually-hidden` class.
-  </p>
-</CCallout>
-
-## Customizing
-
-### CSS variables
-
-Vue callouts use local CSS variables on `.callout` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="_callout.scss" capture="callout-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CCallout :style="vars">...</CCallout>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="callout-variables"/>
-
-## API
-
-!!!include(./api/callout/CCallout.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/card.md b/packages/docs/components/card.md
deleted file mode 100644
index 57562d86..00000000
--- a/packages/docs/components/card.md
+++ /dev/null
@@ -1,1414 +0,0 @@
----
-title: Vue Card Component
-name: Card
-description: Vue card component provides a flexible and extensible container for displaying content. Card is delivered with a bunch of variants and options.
-other_frameworks: card
----
-
-## Examples
-
-  
-## About
-
-A Vue card component is a content container. It incorporates options for images, headers, and footers, a wide variety of content, contextual background colors, and excellent display options.
-
-## Example
-
-Cards are built with as little markup and styles as possible but still manage to deliver a bunch of control and customization. Built with flexbox, they offer easy alignment and mix well with other CoreUI components. Cards have no top, left, and right margins by default, so use [spacing utilities](https://coreui.io/docs/utilities/spacing) as needed. They have no fixed width to start, so they'll fill the full width of its parent.
-
-Below 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.
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" src="/images/vue.jpg" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-## Content types
-
-CoreUI card supports a wide variety of content, including images, text, list groups, links, and more. Below are examples of those elements.
-
-### Body
-
-The main block of a card is the `<CCardBody>`. Use it whenever you need a padded section within a card.
-
-::: demo
-<CCard>
-  <CCardBody>
-    This is some text within a card body.
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard>
-  <CCardBody>
-    This is some text within a card body.
-  </CCardBody>
-</CCard>
-```
-### Titles, text, and links
-
-Card titles are managed by `<CCardTitle>` component. Identically, links are attached and collected next to each other by `<CCardLink>` component.
-
-Subtitles are managed by `<CCardSubtitle>` component. If the `<CCardTitle>` also, the `<CCardSubtitle>` items are stored in a `<CCardBody>` item, the card title, and subtitle are arranged rightly.
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardSubtitle class="mb-2 text-body-secondary">Card subtitle</CCardSubtitle>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    <CCardLink href="#">Card link</CCardLink>
-    <CCardLink href="#">Another link</CCardLink>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardSubtitle class="mb-2 text-body-secondary">Card subtitle</CCardSubtitle>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    <CCardLink href="#">Card link</CCardLink>
-    <CCardLink href="#">Another link</CCardLink>
-  </CCardBody>
-</CCard>
-```
-
-### Images
-
-`.card-img-top` places a picture to the top of the card. With `.card-text`, text can be added to the card. Text within `.card-text` can additionally be styled with the regular HTML tags.
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-  <CCardBody>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" src="/images/vue.jpg" />
-  <CCardBody>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-  </CCardBody>
-</CCard>
-```
-
-### List groups
-
-Create lists of content in a card with a flush list group.
-
-::: demo
-<CCard style="width: 18rem">
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-</CCard>
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardHeader>Header</CCardHeader>
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardHeader>Header</CCardHeader>
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-</CCard>
-```
-
-::: demo
-<CCard style="width: 18rem">
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-  <CCardFooter>Footer</CCardFooter>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-  <CCardFooter>Footer</CCardFooter>
-</CCard>
-```
-
-### Kitchen sink
-
-Combine and match many content types to build 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.
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-  </CCardBody>
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-  <CCardBody>
-    <CCardLink href="#">Card link</CCardLink>
-    <CCardLink href="#">Another link</CCardLink>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" src="/images/vue.jpg" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-  </CCardBody>
-  <CListGroup flush>
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Vestibulum at eros</CListGroupItem>
-  </CListGroup>
-  <CCardBody>
-    <CCardLink href="#">Card link</CCardLink>
-    <CCardLink href="#">Another link</CCardLink>
-  </CCardBody>
-</CCard>
-```
-
-### Header and footer
-
-Add an optional header and/or footer within a card.
-
-::: demo
-<CCard>
-  <CCardHeader>Header</CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard>
-  <CCardHeader>Header</CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-Card headers can be styled by adding ex. `as="h5"`.
-
-::: demo
-<CCard>
-  <CCardHeader as="h5">Header</CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard>
-  <CCardHeader as="h5">Header</CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-::: demo
-<CCard>
-  <CCardHeader>Quote</CCardHeader>
-  <CCardBody>
-    <blockquote class="blockquote mb-0">
-      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
-      <footer class="blockquote-footer">Someone famous in <cite title="Source Title">Source Title</cite></footer>
-    </blockquote>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard>
-  <CCardHeader>Quote</CCardHeader>
-  <CCardBody>
-    <blockquote class="blockquote mb-0">
-      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
-      <footer class="blockquote-footer">Someone famous in <cite title="Source Title">Source Title</cite></footer>
-    </blockquote>
-  </CCardBody>
-</CCard>
-```
-
-::: demo
-<CCard class="text-center">
-  <CCardHeader>Header</CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-  <CCardFooter class="text-body-secondary">2 days ago</CCardFooter>
-</CCard>
-:::
-```vue
-<CCard class="text-center">
-  <CCardHeader>Header</CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-  <CCardFooter class="text-body-secondary">2 days ago</CCardFooter>
-</CCard>
-```
-
-## Sizing
-
-Cards assume no specific `width` to start, so they'll be 100% wide unless otherwise stated. You can adjust this as required with custom CSS, grid classes, grid Sass mixins, or services.
-
-### Using grid markup
-
-Using the grid, wrap cards in columns and rows as needed.
-
-::: demo
-<CRow>
-  <CCol :sm="6">
-    <CCard>
-      <CCardBody>
-        <CCardTitle>Special title treatment</CCardTitle>
-        <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-        <CButton color="primary" href="#">Go somewhere</CButton>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :sm="6">
-    <CCard>
-      <CCardBody>
-        <CCardTitle>Special title treatment</CCardTitle>
-        <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-        <CButton color="primary" href="#">Go somewhere</CButton>
-      </CCardBody>
-    </CCard>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CCard>
-      <CCardBody>
-        <CCardTitle>Special title treatment</CCardTitle>
-        <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-        <CButton color="primary" href="#">Go somewhere</CButton>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :sm="6">
-    <CCard>
-      <CCardBody>
-        <CCardTitle>Special title treatment</CCardTitle>
-        <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-        <CButton color="primary" href="#">Go somewhere</CButton>
-      </CCardBody>
-    </CCard>
-  </CCol>
-</CRow>
-```
-
-### Using utilities
-
-Use some of [available sizing utilities](https://coreui.io/docs/utilities/sizing/) to rapidly set a card's width.
-
-::: demo
-<CCard class="w-75">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard class="w-50">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard class="w-75">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard class="w-50">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-### Using custom CSS
-
-Use custom CSS in your stylesheets or as inline styles to set a width.
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-## Text alignment
-
-You can instantly change the text arrangement of any card—in its whole or specific parts—with [text align classes](https://coreui.io/docs/utilities/text/#text-alignment).
-
-::: demo
-<CCard style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard class="text-center" style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard class="text-end" style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard class="text-center" style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard class="text-end" style="width: 18rem">
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-## Navigation
-
-Add some navigation to a `<CCardHeader>` with our `<CNav>` component.
-
-::: demo
-<CCard class="text-center">
-  <CCardHeader>
-    <CNav variant="tabs" class="card-header-tabs">
-      <CNavItem>
-        <CNavLink
-          href="#"
-          active
-        >
-          Active
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-        >
-          Link
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-          disabled
-        >
-          Disabled
-        </CNavLink>
-      </CNavItem>
-    </CNav>
-  </CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard class="text-center">
-  <CCardHeader>
-    <CNav variant="tabs" class="card-header-tabs">
-      <CNavItem>
-        <CNavLink
-          href="#"
-          active
-        >
-          Active
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-        >
-          Link
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-          disabled
-        >
-          Disabled
-        </CNavLink>
-      </CNavItem>
-    </CNav>
-  </CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-::: demo
-<CCard class="text-center">
-  <CCardHeader>
-    <CNav variant="pills" class="card-header-pills">
-      <CNavItem>
-        <CNavLink
-          href="#"
-          active
-        >
-          Active
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-        >
-          Link
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-          disabled
-        >
-          Disabled
-        </CNavLink>
-      </CNavItem>
-    </CNav>
-  </CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-:::
-```vue
-<CCard class="text-center">
-  <CCardHeader>
-    <CNav variant="pills" class="card-header-pills">
-      <CNavItem>
-        <CNavLink
-          href="#"
-          active
-        >
-          Active
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-        >
-          Link
-        </CNavLink>
-      </CNavItem>
-      <CNavItem>
-        <CNavLink
-          href="#"
-          disabled
-        >
-          Disabled
-        </CNavLink>
-      </CNavItem>
-    </CNav>
-  </CCardHeader>
-  <CCardBody>
-    <CCardTitle>Special title treatment</CCardTitle>
-    <CCardText>With supporting text below as a natural lead-in to additional content.</CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-```
-
-## Images
-
-Cards introduce several options for acting with images. Pick from appending "image caps" at either end of a card, overlaying images with content, or just inserting the image in a card.
-
-### Image caps
-
-Similar to headers and footers, cards can include top and bottom "image caps"—images at the top or bottom of a card.
-
-::: demo
-<CCard class="mb-3">
-  <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-  </CCardBody>
-</CCard>
-<CCard class="mb-3">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-  </CCardBody>
-    <CCardImage orientation="bottom" :src="$withBase('/images/vue.jpg')" />
-</CCard>
-:::
-```vue
-<CCard class="mb-3">
-  <CCardImage orientation="top" src="/images/vue.jpg" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-  </CCardBody>
-</CCard>
-<CCard class="mb-3">
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-  </CCardBody>
-    <CCardImage orientation="bottom" src="/images/vue.jpg" />
-</CCard>
-```
-
-### Image overlays
-
-Adapt an image into a background and overlay your text. Depending on the image, you may need additional styles or utilities.
-
-::: demo
-<CCard class="mb-3 bg-dark text-white">
-  <CCardImage :src="$withBase('/images/vue.jpg')" />
-  <CCardImageOverlay>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    <CCardText>Last updated 3 mins ago</CCardText>
-  </CCardImageOverlay>
-</CCard>
-:::
-```vue
-<CCard class="mb-3 bg-dark text-white">
-  <CCardImage src="/images/vue.jpg" />
-  <CCardImageOverlay>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    <CCardText>Last updated 3 mins ago</CCardText>
-  </CCardImageOverlay>
-</CCard>
-```
-
-## Horizontal
-
-Using 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.
-
-::: demo
-<CCard class="mb-3" style="max=width: 540px">
-  <CRow class="g-0">
-    <CCol :md="4">
-      <CImage class="rounded-start" fluid :src="$withBase('/images/vue.jpg')" />
-    </CCol>
-    <CCol :md="8">
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-        <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-      </CCardBody>
-    </CCol>
-  </CRow>
-</CCard>
-:::
-```vue
-<CCard class="mb-3" style="max=width: 540px">
-  <CRow class="g-0">
-    <CCol :md="4">
-      <CCardImage class="rounded-0" src="/images/vue.jpg" />
-    </CCol>
-    <CCol :md="8">
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-        <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-      </CCardBody>
-    </CCol>
-  </CRow>
-</CCard>
-```
-
-## Card styles
-
-Cards include various options for customizing their backgrounds, borders, and color.
-
-### Background and color
-
-Use `color` property to change the appearance of a card.
-
-::: demo
-<template v-for="(item) in [
-  { color: 'primary', textColor: 'white' },
-  { color: 'secondary', textColor: 'white' },
-  { color: 'success', textColor: 'white' },
-  { color: 'danger', textColor: 'white' },
-  { color: 'warning' },
-  { color: 'info', textColor: 'white' },
-  { color: 'light' },
-  { color: 'dark', textColor: 'white' }
-]">
-  <CCard :color="item.color" :text-color="item.textColor" class="mb-3" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-:::
-```vue
-<template v-for="(item) in [
-  { color: 'primary', textColor: 'white' },
-  { color: 'secondary', textColor: 'white' },
-  { color: 'success', textColor: 'white' },
-  { color: 'danger', textColor: 'white' },
-  { color: 'warning' },
-  { color: 'info', textColor: 'white' },
-  { color: 'light' },
-  { color: 'dark', textColor: 'white' }
-]">
-  <CCard :color="item.color" :text-color="item.textColor" class="mb-3" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-```
-
-You can also apply contextual variations with the `textBgColor` property, which automatically sets the text color to ensure compliance with the WCAG 4.5:1 contrast ratio standard for enhanced accessibility.
-
-::: demo
-<template v-for="(item) in [
-  { color: 'primary' },
-  { color: 'secondary' },
-  { color: 'success' },
-  { color: 'danger' },
-  { color: 'warning' },
-  { color: 'info' },
-  { color: 'light' },
-  { color: 'dark' }
-]">
-  <CCard :textBgColor="item.color" class="mb-3" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-:::
-```vue
-<template v-for="(item) in [
-  { color: 'primary' },
-  { color: 'secondary' },
-  { color: 'success' },
-  { color: 'danger' },
-  { color: 'warning' },
-  { color: 'info' },
-  { color: 'light' },
-  { color: 'dark' }
-]">
-  <CCard :textBgColor="item.color" class="mb-3" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-```
-
-<Callout color="info" title="Conveying meaning to assistive technologies">
-  Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (e.g. the visible text), or is included through alternative means, such as additional text hidden with the <code>.visually-hidden</code> class.
-</Callout>
-
-### Border
-
-Use [border utilities](https://coreui.io/docs/utilities/borders/) to change just the `border-color` of a card. Note that you can set `text-color` property on the `<CCard>` or a subset of the card's contents as shown below.
-
-::: demo
-<template v-for="(item) in [
-  { color: 'primary', textColor: 'primary' },
-  { color: 'secondary', textColor: 'secondary' },
-  { color: 'success', textColor: 'success' },
-  { color: 'danger', textColor: 'danger' },
-  { color: 'warning', textColor: 'warning' },
-  { color: 'info', textColor: 'info' },
-  { color: 'light'},
-  { color: 'dark'}
-]">
-  <CCard :text-color="item.textColor" class="mb-3" :class="'border-' + item.color" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-:::
-```vue
-<template v-for="(item) in [
-  { color: 'primary', textColor: 'primary' },
-  { color: 'secondary', textColor: 'secondary' },
-  { color: 'success', textColor: 'success' },
-  { color: 'danger', textColor: 'danger' },
-  { color: 'warning', textColor: 'warning' },
-  { color: 'info', textColor: 'info' },
-  { color: 'light'},
-  { color: 'dark'}
-]">
-  <CCard :text-color="item.textColor" class="mb-3" :class="'border-' + item.color" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-```
-
-### Top border
-
-::: demo
-<template v-for="(item) in [
-  { color: 'primary', textColor: 'primary' },
-  { color: 'secondary', textColor: 'secondary' },
-  { color: 'success', textColor: 'success' },
-  { color: 'danger', textColor: 'danger' },
-  { color: 'warning', textColor: 'warning' },
-  { color: 'info', textColor: 'info' },
-  { color: 'light'},
-  { color: 'dark'}
-]">
-  <CCard :text-color="item.textColor" class="mb-3 border-top-3" :class="'border-top-' + item.color" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-:::
-```vue
-<template v-for="(item) in [
-  { color: 'primary', textColor: 'primary' },
-  { color: 'secondary', textColor: 'secondary' },
-  { color: 'success', textColor: 'success' },
-  { color: 'danger', textColor: 'danger' },
-  { color: 'warning', textColor: 'warning' },
-  { color: 'info', textColor: 'info' },
-  { color: 'light'},
-  { color: 'dark'}
-]">
-  <CCard :text-color="item.textColor" class="mb-3 border-top-3" :class="'border-top-' + item.color" style="max-width: 18rem">
-    <CCardHeader>Header</CCardHeader>
-    <CCardBody>
-      <CCardTitle>{{item.color}} card title</CCardTitle>
-      <CCardText>Some quick example text to build on the card title and make up the bulk of the card's content.</CCardText>
-    </CCardBody>
-  </CCard>
-</template>
-```
-
-## Card layout
-
-In addition to styling the content within cards, CoreUI includes a few options for laying out series of cards. For the time being, **these layout options are not yet responsive**.
-
-### Card groups
-
-Use 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.
-
-::: demo
-<CCardGroup>
-  <CCard>
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-    </CCardBody>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-      <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-    </CCardBody>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>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.</CCardText>
-      <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-    </CCardBody>
-  </CCard>
-</CCardGroup>
-:::
-```vue
-<CCardGroup>
-  <CCard>
-    <CCardImage orientation="top" src="/images/vue.jpg" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-    </CCardBody>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" src="/images/vue.jpg" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-      <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-    </CCardBody>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" src="/images/vue.jpg" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>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.</CCardText>
-      <CCardText><small class="text-body-secondary">Last updated 3 mins ago</small></CCardText>
-    </CCardBody>
-  </CCard>
-</CCardGroup>
-```
-
-When using card groups with footers, their content will automatically line up.
-
-::: demo
-<CCardGroup>
-  <CCard>
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    </CCardBody>
-    <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-    </CCardBody>
-    <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>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.</CCardText>
-    </CCardBody>
-    <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-  </CCard>
-</CCardGroup>
-:::
-```vue
-<CCardGroup>
-  <CCard>
-    <CCardImage orientation="top" src="/images/vue.jpg" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-    </CCardBody>
-    <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" src="/images/vue.jpg" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-    </CCardBody>
-    <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-  </CCard>
-  <CCard>
-    <CCardImage orientation="top" src="/images/vue.jpg" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>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.</CCardText>
-    </CCardBody>
-    <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-  </CCard>
-</CCardGroup>
-```
-
-### Grid cards
-
-Use the `CRow` component and set `:xs|sm|md|lg|xl|xxl="{ cols: * }"` property to control how many grid columns (wrapped around your cards) you show per row. For example, here's `:xs="{cols: 1}"` laying out the cards on one column, and `:md="{cols: 1}"` splitting four cards to equal width across multiple rows, from the medium breakpoint up.
-
-::: demo 
-<CRow :xs="{ cols: 1, gutter: 4}" :md="{ cols:2 }">
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow :xs="{ cols: 1, gutter: 4}" :md="{ cols:2 }">
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-</CRow>
-```
-
-Change it to `:md="{ cols: 3}"` and you'll see the fourth card wrap.
-
-::: demo
-<CRow :xs="{ cols: 1, gutter: 4 }" :md="{ cols: 3}">
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow :xs="{ cols: 1, gutter: 4 }" :md="{ cols: 3}">
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard>
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-</CRow>
-```
-
-When 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.
-
-::: demo
-<CRow :xs="{ cols: 1, gutter: 4 }" :md="{ cols: 3}">
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>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.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow :xs="{ cols: 1, gutter: 4 }" :md="{ cols: 3}">
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>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.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-    </CCard>
-  </CCol>
-</CRow>
-```
-
-Just like with card groups, card footers will automatically line up.
-
-::: demo
-<CRow :xs="{ cols: 1, gutter: 4 }" :md="{ cols: 3}">
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>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.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow :xs="{ cols: 1, gutter: 4 }" :md="{ cols: 3}">
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>This card has supporting text below as a natural lead-in to additional content.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-  <CCol xs>
-    <CCard class="h-100">
-      <CCardImage orientation="top" src="/images/vue.jpg" />
-      <CCardBody>
-        <CCardTitle>Card title</CCardTitle>
-        <CCardText>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.</CCardText>
-      </CCardBody>
-      <CCardFooter><small class="text-body-secondary">Last updated 3 mins ago</small></CCardFooter>
-    </CCard>
-  </CCol>
-</CRow>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue cards 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.
-
-<ScssDocs file="_card.scss" capture="card-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CCard :style="vars">...</CCard>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="card-variables"/>
-
-## API
-
-!!!include(./api/card/CCard.api.md)!!!
-
-!!!include(./api/card/CCardHeader.api.md)!!!
-
-!!!include(./api/card/CCardImage.api.md)!!!
-
-!!!include(./api/card/CCardSubtitle.api.md)!!!
-
-!!!include(./api/card/CCardText.api.md)!!!
-
-!!!include(./api/card/CCardTitle.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/carousel.md b/packages/docs/components/carousel.md
deleted file mode 100644
index 10b207e4..00000000
--- a/packages/docs/components/carousel.md
+++ /dev/null
@@ -1,237 +0,0 @@
----
-title: Vue Carousel Component
-name: Carousel
-description: Vue carousel is a slideshow component for cycling through elements—images or slides of text—like a carousel.
-other_frameworks: carousel
----
-
-## How it works
-
-The Vue carousel is a slideshow for cycling within a group of content. It runs with a group of images, text, or html elements. It also incorporates support for previous/next buttons.
-
-In browsers where the [Page Visibility API](https://www.w3.org/TR/page-visibility/) is supported, the carousel will avoid sliding when the webpage is not visible to the user (such as when the browser tab is inactive, the browser window is minimized, etc.).
-
-## Example
-
-Carousels don't automatically normalize slide dimensions. As such, you may want to use extra utilities or custom methods to properly size content. While carousels support previous/next controls and indicators, they're not explicitly expected. Add and customize as you see fit.
-
-### Slides only
-
-::: demo
-<CCarousel>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/vue.jpg')" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/react.jpg')" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/angular.jpg')" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-:::
-```vue
-<CCarousel>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/vue.jpg" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/react.jpg" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/angular.jpg" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-```
-
-### With controls
-
-Adding in the previous and next controls by `controls` property.
-
-::: demo
-<CCarousel controls>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/vue.jpg')" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/react.jpg')" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/angular.jpg')" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-:::
-```vue
-<CCarousel controls>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/vue.jpg" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/react.jpg" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/angular.jpg" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-```
-
-### With indicators
-
-You can attach the indicators to the carousel, lengthwise the controls, too.
-
-::: demo
-<CCarousel controls indicators>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/vue.jpg')" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/react.jpg')" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/angular.jpg')" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-:::
-```vue
-<CCarousel controls>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/vue.jpg" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/react.jpg" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/angular.jpg" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-```
-
-### With captions
-
-You can add captions to slides with the `<CCarouselCaption>` element within any `<CCarouselItem>`. They can be immediately hidden on smaller viewports, as shown below, with optional [display utilities](https://coreui.io/4.0/utilities/display). We hide them with `.d-none` and draw them back on medium-sized devices with `.d-md-block`.
-
-::: demo
-<CCarousel controls indicators>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/vue.jpg')" alt="slide 1"/>
-    <CCarouselCaption class="d-none d-md-block">
-      <h5>First slide label</h5>
-      <p>Some representative placeholder content for the first slide.</p>
-    </CCarouselCaption>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/react.jpg')" alt="slide 2"/>
-    <CCarouselCaption class="d-none d-md-block">
-      <h5>First slide label</h5>
-      <p>Some representative placeholder content for the first slide.</p>
-    </CCarouselCaption>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/angular.jpg')" alt="slide 3"/>
-    <CCarouselCaption class="d-none d-md-block">
-      <h5>First slide label</h5>
-      <p>Some representative placeholder content for the first slide.</p>
-    </CCarouselCaption>
-  </CCarouselItem>
-</CCarousel>
-:::
-```vue
-<CCarousel controls indicators>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/vue.jpg" alt="slide 1"/>
-    <CCarouselCaption class="d-none d-md-block">
-      <h5>First slide label</h5>
-      <p>Some representative placeholder content for the first slide.</p>
-    </CCarouselCaption>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/react.jpg" alt="slide 2"/>
-    <CCarouselCaption class="d-none d-md-block">
-      <h5>First slide label</h5>
-      <p>Some representative placeholder content for the first slide.</p>
-    </CCarouselCaption>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/angular.jpg" alt="slide 3"/>
-    <CCarouselCaption class="d-none d-md-block">
-      <h5>First slide label</h5>
-      <p>Some representative placeholder content for the first slide.</p>
-    </CCarouselCaption>
-  </CCarouselItem>
-</CCarousel>
-```
-
-### Crossfade
-
-Add `transition="crossfade"` to your carousel to animate slides with a fade transition instead of a slide.
-
-
-::: demo
-<CCarousel controls indicators transition="crossfade">
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/vue.jpg')" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/react.jpg')" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/angular.jpg')" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-:::
-```vue
-<CCarousel controls indicators transition="crossfade">
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/vue.jpg" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/react.jpg" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/angular.jpg" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-```
-
-## Dark variant
-
-Add `dark` property to the `CCarousel` for darker controls, indicators, and captions. Controls have been inverted from their default white fill with the `filter` CSS property. Captions and controls have additional Sass variables that customize the `color` and `background-color`.
-
-::: demo
-<CCarousel controls indicators dark>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/vue.jpg')" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/react.jpg')" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" :src="$withBase('/images/angular.jpg')" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-:::
-```vue
-<CCarousel controls indicators transition="crossfade">
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/vue.jpg" alt="slide 1"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/react.jpg" alt="slide 2"/>
-  </CCarouselItem>
-  <CCarouselItem>
-    <img class="d-block w-100" src="/images/angular.jpg" alt="slide 3"/>
-  </CCarouselItem>
-</CCarousel>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="carousel-variables"/>
-
-## API
-
-!!!include(./api/carousel/CCarousel.api.md)!!!
-
-!!!include(./api/carousel/CCarouselItem.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/chart.md b/packages/docs/components/chart.md
deleted file mode 100644
index d10a26d2..00000000
--- a/packages/docs/components/chart.md
+++ /dev/null
@@ -1,669 +0,0 @@
----
-title: Vue Chart.js Component
-name: Chart.js
-description: Vue wrapper for Chart.js 3.0, the most popular charting library.
----
-
-## Installation
-
-If you want to use our Chart.js Vue wrapper you have to install an additional package.
-
-### Npm
-
-```bash
-npm install @coreui/vue-chartjs
-```
-
-### Yarn
-
-```bash
-yarn add @coreui/vue-chartjs
-```
-
-## Chart Types
-
-### Line Chart
-
-A line chart is a way of plotting data points on a line. Often, it is used to show trend data, or the comparison of two data sets. 
-[Line Chart properties](https://www.chartjs.org/docs/latest/charts/line.html#dataset-properties)
-
-::: demo
-<CChart
-  type="line"
-  ref="chartLineRef"
-  :wrapper="false"
-  :data="{
-    labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
-    datasets: [
-      {
-        label: 'My First dataset',
-        backgroundColor: 'rgba(220, 220, 220, 0.2)',
-        borderColor: 'rgba(220, 220, 220, 1)',
-        pointBackgroundColor: 'rgba(220, 220, 220, 1)',
-        pointBorderColor: '#fff',
-        data: [40, 20, 12, 39, 10, 40, 39]
-      },
-      {
-        label: 'My Second dataset',
-        backgroundColor: 'rgba(151, 187, 205, 0.2)',
-        borderColor: 'rgba(151, 187, 205, 1)',
-        pointBackgroundColor: 'rgba(151, 187, 205, 1)',
-        pointBorderColor: '#fff',
-        data: [50, 12, 28, 29, 7, 25, 12]
-      }
-    ]
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      x: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-      y: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-    },
-  }"
-/>
-:::
-```vue
-<CChart
-  type="line"
-  :wrapper="false"
-  :data="{
-    labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
-    datasets: [
-      {
-        label: 'My First dataset',
-        backgroundColor: 'rgba(220, 220, 220, 0.2)',
-        borderColor: 'rgba(220, 220, 220, 1)',
-        pointBackgroundColor: 'rgba(220, 220, 220, 1)',
-        pointBorderColor: '#fff',
-        data: [40, 20, 12, 39, 10, 40, 39]
-      },
-      {
-        label: 'My Second dataset',
-        backgroundColor: 'rgba(151, 187, 205, 0.2)',
-        borderColor: 'rgba(151, 187, 205, 1)',
-        pointBackgroundColor: 'rgba(151, 187, 205, 1)',
-        pointBorderColor: '#fff',
-        data: [50, 12, 28, 29, 7, 25, 12]
-      }
-    ]
-  }"
-/>
-```
-
-### Bar Chart
-
-A bar chart provides a way of showing data values represented as vertical bars. It is sometimes used to show trend data, and the comparison of multiple data sets side by side. [Bar Chart properties](https://www.chartjs.org/docs/latest/charts/bar.html#dataset-properties)
-
-::: demo
-<CChart
-  type="bar"
-  ref="chartBarRef"
-  :data="{
-    labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
-    datasets: [
-      {
-        label: 'GitHub Commits',
-        backgroundColor: '#f87979',
-        data: [40, 20, 12, 39, 10, 40, 39, 80, 40],
-      },
-    ],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      x: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-      y: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-    },
-  }"
-  labels="months"
-/>
-:::
-```vue
-<CChart
-  type="bar"
-  :data="{
-    labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
-    datasets: [
-      {
-        label: 'GitHub Commits',
-        backgroundColor: '#f87979',
-        data: [40, 20, 12, 39, 10, 40, 39, 80, 40],
-      },
-    ],
-  }"
-  labels="months"
-/>
-```
-
-### Radar Chart
-
-A radar chart is a way of showing multiple data points and the variation between them. They are often useful for comparing the points of two or more different data sets. [Radar Chart properties](https://www.chartjs.org/docs/latest/charts/radar.html#dataset-properties)
-
-::: demo
-<CChart
-  type="radar"
-  ref="chartRadarRef"
-  :data="{
-    labels: [
-      'Eating',
-      'Drinking',
-      'Sleeping',
-      'Designing',
-      'Coding',
-      'Cycling',
-      'Running',
-    ],
-    datasets: [
-      {
-        label: 'My First dataset',
-        backgroundColor: 'rgba(220, 220, 220, 0.2)',
-        borderColor: 'rgba(220, 220, 220, 1)',
-        pointBackgroundColor: 'rgba(220, 220, 220, 1)',
-        pointBorderColor: '#fff',
-        pointHighlightFill: '#fff',
-        pointHighlightStroke: 'rgba(220, 220, 220, 1)',
-        data: [65, 59, 90, 81, 56, 55, 40],
-      },
-      {
-        label: 'My Second dataset',
-        backgroundColor: 'rgba(151, 187, 205, 0.2)',
-        borderColor: 'rgba(151, 187, 205, 1)',
-        pointBackgroundColor: 'rgba(151, 187, 205, 1)',
-        pointBorderColor: '#fff',
-        pointHighlightFill: '#fff',
-        pointHighlightStroke: 'rgba(151, 187, 205, 1)',
-        data: [28, 48, 40, 19, 96, 27, 100],
-      },
-    ],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      r: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-    },
-  }"
-/>
-:::
-```vue
-<CChart
-  type="radar"
-  :data="{
-    labels: [
-      'Eating',
-      'Drinking',
-      'Sleeping',
-      'Designing',
-      'Coding',
-      'Cycling',
-      'Running',
-    ],
-    datasets: [
-      {
-        label: 'My First dataset',
-        backgroundColor: 'rgba(220, 220, 220, 0.2)',
-        borderColor: 'rgba(220, 220, 220, 1)',
-        pointBackgroundColor: 'rgba(220, 220, 220, 1)',
-        pointBorderColor: '#fff',
-        pointHighlightFill: '#fff',
-        pointHighlightStroke: 'rgba(220, 220, 220, 1)',
-        data: [65, 59, 90, 81, 56, 55, 40],
-      },
-      {
-        label: 'My Second dataset',
-        backgroundColor: 'rgba(151, 187, 205, 0.2)',
-        borderColor: 'rgba(151, 187, 205, 1)',
-        pointBackgroundColor: 'rgba(151, 187, 205, 1)',
-        pointBorderColor: '#fff',
-        pointHighlightFill: '#fff',
-        pointHighlightStroke: 'rgba(151, 187, 205, 1)',
-        data: [28, 48, 40, 19, 96, 27, 100],
-      },
-    ],
-  }"
-/>
-```
-
-### Doughnut and Pie Charts
-
-Pie and doughnut charts are probably the most commonly used charts. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. [Doughnut and Pie Charts properties](https://www.chartjs.org/docs/latest/charts/doughnut.html#dataset-properties)
-
-::: demo
-<CChart
-  type="doughnut"
-  ref="chartDoughnutRef"
-  :data="{
-    labels: ['VueJs', 'EmberJs', 'ReactJs', 'AngularJs'],
-    datasets: [
-      {
-        backgroundColor: ['#41B883', '#E46651', '#00D8FF', '#DD1B16'],
-        data: [40, 20, 80, 10],
-      },
-    ],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-  }"
-/>
-:::
-```vue
-<CChart
-  type="doughnut"
-  :data="{
-    labels: ['VueJs', 'EmberJs', 'ReactJs', 'AngularJs'],
-    datasets: [
-      {
-        backgroundColor: ['#41B883', '#E46651', '#00D8FF', '#DD1B16'],
-        data: [40, 20, 80, 10],
-      },
-    ],
-  }"
-/>
-```
-
-::: demo
-<CChart
-  type="pie"
-  ref="chartPieRef"
-  :data="{
-    labels: ['VueJs', 'EmberJs', 'ReactJs', 'AngularJs'],
-    datasets: [
-      {
-        backgroundColor: ['#41B883', '#E46651', '#00D8FF', '#DD1B16'],
-        data: [40, 20, 80, 10],
-      },
-    ],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-  }"
-/>
-:::
-```vue
-<CChart
-  type="pie"
-  :data="{
-    labels: ['VueJs', 'EmberJs', 'ReactJs', 'AngularJs'],
-    datasets: [
-      {
-        backgroundColor: ['#41B883', '#E46651', '#00D8FF', '#DD1B16'],
-        data: [40, 20, 80, 10],
-      },
-    ],
-  }"
-/>
-```
-
-### Polar Area Chart
-
-Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. [Polar Area Chart properties](https://www.chartjs.org/docs/latest/charts/polar.html#dataset-properties)
-
-::: demo
-<CChart
-  type="polarArea"
-  ref="chartPolarAreaRef"
-  :data="{
-    labels: ['Red', 'Green', 'Yellow', 'Grey', 'Blue'],
-    datasets: [
-      {
-        data: [11, 16, 7, 3, 14],
-        backgroundColor: ['#FF6384', '#4BC0C0', '#FFCE56', '#E7E9ED', '#36A2EB'],
-      },
-    ],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      r: {
-        grid: {
-          color: getStyle('--cui-border-color'),
-        },
-      }
-    }
-  }"
-/>
-:::
-```vue
-<CChart
-  type="polarArea"
-  :data="{
-    labels: ['Red', 'Green', 'Yellow', 'Grey', 'Blue'],
-    datasets: [
-      {
-        data: [11, 16, 7, 3, 14],
-        backgroundColor: ['#FF6384', '#4BC0C0', '#FFCE56', '#E7E9ED', '#36A2EB'],
-      },
-    ],
-  }"
-/>
-```
-
-### Bubble Chart
-
-A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles. [Bubble Chart properties](https://www.chartjs.org/docs/latest/charts/bubble.html#dataset-properties)
-
-::: demo
-<CChart
-  type="bubble"
-  ref="chartBubbleRef"
-  :data="{
-    datasets: [{
-      label: 'First Dataset',
-      data: [{
-        x: 20,
-        y: 30,
-        r: 15
-      }, {
-        x: 40,
-        y: 10,
-        r: 10
-      }],
-      backgroundColor: 'rgb(255, 99, 132)'
-    }]
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      x: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-      y: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-    },
-  }"
-/>
-:::
-```vue
-<CChart
-  type="bubble"
-  :data="{
-    datasets: [{
-      label: 'First Dataset',
-      data: [{
-        x: 20,
-        y: 30,
-        r: 15
-      }, {
-        x: 40,
-        y: 10,
-        r: 10
-      }],
-      backgroundColor: 'rgb(255, 99, 132)'
-    }]
-  }"
-/>
-```
-
-
-### Scatter Chart
-
-A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles. [Scatter Chart properties](https://www.chartjs.org/docs/latest/charts/scatter.html#dataset-properties)
-
-::: demo
-<CChart
-  type="scatter"
-  ref="chartScatterRef"
-  :data="{
-    datasets: [{
-      label: 'Scatter Dataset',
-      data: [{
-        x: -10,
-        y: 0
-      }, {
-        x: 0,
-        y: 10
-      }, {
-        x: 10,
-        y: 5
-      }, {
-        x: 0.5,
-        y: 5.5
-      }],
-      backgroundColor: 'rgb(255, 99, 132)'
-    }],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      x: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        position: 'bottom',
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-        type: 'linear',
-      },
-      y: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-    },
-  }"
-/>
-:::
-```vue
-<!-- use <CChart type="scatter"> or <CChartScatter> component -->
-<CChart
-  type="scatter"
-  :data="{
-    datasets: [{
-      label: 'Scatter Dataset',
-      data: [{
-        x: -10,
-        y: 0
-      }, {
-        x: 0,
-        y: 10
-      }, {
-        x: 10,
-        y: 5
-      }, {
-        x: 0.5,
-        y: 5.5
-      }],
-      backgroundColor: 'rgb(255, 99, 132)'
-    }],
-  }"
-  :options="{
-    plugins: {
-      legend: {
-        labels: {
-          color: getStyle('--cui-body-color'),
-        }
-      }
-    },
-    scales: {
-      x: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        position: 'bottom',
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-        type: 'linear',
-      },
-      y: {
-        grid: {
-          color: getStyle('--cui-border-color-translucent'),
-        },
-        ticks: {
-          color: getStyle('--cui-body-color'),
-        },
-      },
-    },
-  }"
-/>
-```
-
-<script setup>
-  import { onMounted, ref, watch } from 'vue'
-  import { getStyle } from '@coreui/utils'
-  
-  const chartLineRef = ref()
-  const chartBarRef = ref()
-  const chartRadarRef = ref()
-  const chartDoughnutRef = ref()
-  const chartPieRef = ref()
-  const chartPolarAreaRef = ref()
-  const chartBubbleRef = ref()
-  const chartScatterRef = ref()
-
-  onMounted(() => {
-    document.documentElement.addEventListener('ColorSchemeChange', () => {
-      // chartLineRef
-      chartLineRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartLineRef.value.chart.options.scales.x.grid.color = getStyle('--cui-border-color-translucent')
-      chartLineRef.value.chart.options.scales.x.ticks.color = getStyle('--cui-body-color')
-      chartLineRef.value.chart.options.scales.y.grid.color = getStyle('--cui-border-color-translucent')
-      chartLineRef.value.chart.options.scales.y.ticks.color = getStyle('--cui-body-color')
-      chartLineRef.value.chart.update()
-
-      // chartBarRef
-      chartBarRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartBarRef.value.chart.options.scales.x.grid.color = getStyle('--cui-border-color-translucent')
-      chartBarRef.value.chart.options.scales.x.ticks.color = getStyle('--cui-body-color')
-      chartBarRef.value.chart.options.scales.y.grid.color = getStyle('--cui-border-color-translucent')
-      chartBarRef.value.chart.options.scales.y.ticks.color = getStyle('--cui-body-color')
-      chartBarRef.value.chart.update()
-
-      // chartRadarRef
-      chartRadarRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartRadarRef.value.chart.options.scales.r.grid.color = getStyle('--cui-border-color-translucent')
-      chartRadarRef.value.chart.options.scales.r.ticks.color = getStyle('--cui-body-color')
-      chartRadarRef.value.chart.update()
-
-      // chartDoughnutRef
-      chartDoughnutRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartDoughnutRef.value.chart.update()
-
-      // chartPieRef
-      chartPieRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartPieRef.value.chart.update()
-
-      // chartPolarAreaRef
-      chartPolarAreaRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartPolarAreaRef.value.chart.options.scales.r.grid.color = getStyle('--cui-border-color-translucent')
-      chartPolarAreaRef.value.chart.update()
-
-      // chartBubbleRef
-      chartBubbleRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartBubbleRef.value.chart.options.scales.x.grid.color = getStyle('--cui-border-color-translucent')
-      chartBubbleRef.value.chart.options.scales.x.ticks.color = getStyle('--cui-body-color')
-      chartBubbleRef.value.chart.options.scales.y.grid.color = getStyle('--cui-border-color-translucent')
-      chartBubbleRef.value.chart.options.scales.y.ticks.color = getStyle('--cui-body-color')
-      chartBubbleRef.value.chart.update()
-
-      // chartScatterRef
-      chartScatterRef.value.chart.options.plugins.legend.labels.color = getStyle('--cui-body-color')
-      chartScatterRef.value.chart.options.scales.x.grid.color = getStyle('--cui-border-color-translucent')
-      chartScatterRef.value.chart.options.scales.x.ticks.color = getStyle('--cui-body-color')
-      chartScatterRef.value.chart.options.scales.y.grid.color = getStyle('--cui-border-color-translucent')
-      chartScatterRef.value.chart.options.scales.y.ticks.color = getStyle('--cui-body-color')
-      chartScatterRef.value.chart.update()
-    })
-  })
-</script> 
-
-## API
-
-!!!include(./api/CChart.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/close-button.md b/packages/docs/components/close-button.md
deleted file mode 100644
index 3bc5b38a..00000000
--- a/packages/docs/components/close-button.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-title: Vue Close Button Component
-name: Close Button
-description: A generic close button component for dismissing content like modals and alerts.
-other_frameworks: close-button
----
-
-## Example
-
-Provide an option to dismiss or close a component with `<CCloseButton>`. Default styling is limited, but highly customizable. Modify the Sass variables to replace the default `background-image`.
-
-::: demo
-<CCloseButton/>
-:::
-```vue
-<CCloseButton/>
-```
-
-## Disabled state
-
-Disabled close buttons change their `opacity`. We've also applied `pointer-events: none` and `user-select: none` to preventing hover and active states from triggering.
-
-::: demo
-<CCloseButton disabled/>
-:::
-```vue
-<CCloseButton disabled/>
-```
-
-## Dark variant
-
-Add `dark` boolean property to the `<CCloseButton>`, to invert the close button. This uses the filter property to invert the background-image without overriding its value.
-
-::: demo-dark
-<CCloseButton dark/>
-<CCloseButton dark disabled/>
-:::
-```vue
-<CCloseButton dark/>
-<CCloseButton dark disabled/>
-```
-
-## API
-
-!!!include(./api/close-button/CCloseButton.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/collapse.md b/packages/docs/components/collapse.md
deleted file mode 100644
index 0dffb5d0..00000000
--- a/packages/docs/components/collapse.md
+++ /dev/null
@@ -1,177 +0,0 @@
----
-title: Vue Collapse Component
-name: Collapse
-description: Vue collapse component toggles the visibility of content across your project with a few classes and some scripts. Useful for a large amount of content.
-other_frameworks: collapse
----
-
-
-## How it works
-
-The collapse component 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.
-
-## Example
-
-You can use a link or a button component.
-
-::: demo
-<CButton color="primary" href="#" @click.prevent="visible = !visible">Link</CButton>
-<CButton color="primary" @click="visible = !visible">Button</CButton>
-<CCollapse :visible="visible">
-  <CCard class="mt-3">
-    <CCardBody>
-      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson
-      ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt
-      sapiente ea proident.
-    </CCardBody>
-  </CCard>
-</CCollapse>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(false)
-</script>
-<template>
-  <CButton color="primary" href="#" @click.prevent="visible = !visible">Link</CButton>
-  <CButton color="primary" @click="visible = !visible">Button</CButton>
-  <CCollapse :visible="visible">
-    <CCard class="mt-3">
-      <CCardBody>
-        Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson
-        ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt
-        sapiente ea proident.
-      </CCardBody>
-    </CCard>
-  </CCollapse>
-</template>
-```
-
-## Horizontal
-
-The collapse plugin also supports horizontal collapsing. Add the `horizontal` property to transition the `width` instead of `height` and set a `width` on the immediate child element.
-
-:::demo
-<CButton class="mb-3" color="primary" aria-expanded={visible} aria-controls="collapseWidthExample" @click="visibleHorizontal = !visibleHorizontal">Button</CButton>
-<div style="min-height: 120px">
-  <CCollapse horizontal :visible="visibleHorizontal">
-    <CCard style="width: 300px">
-      <CCardBody>
-        This is some placeholder content for a horizontal collapse. It's hidden by default and shown when triggered.
-      </CCardBody>
-    </CCard>
-  </CCollapse>
-</div>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleHorizontal = ref(false)
-</script>
-<template>
-  <CButton class="mb-3" color="primary" aria-expanded={visible} aria-controls="collapseWidthExample" @click="visibleHorizontal = !visibleHorizontal">Button</CButton>
-  <div style="min-height: 120px">
-    <CCollapse horizontal :visible="visibleHorizontal">
-      <CCard style="width: 300px">
-        <CCardBody>
-          This is some placeholder content for a horizontal collapse. It's hidden by default and shown when triggered.
-        </CCardBody>
-      </CCard>
-    </CCollapse>
-  </div>
-</template>
-```
-
-## Multiple targets
-
-A `<CButton>` can show and hide multiple elements.
-
-::: demo
-<CButton color="primary" @click="visibleA = !visibleA">Toggle first element</CButton>
-<CButton color="primary" @click="visibleB = !visibleB">Toggle second element</CButton>
-<CButton color="primary" @click="() => {
-  visibleA = !visibleA
-  visibleB = !visibleB
-}"
->
-  Toggle both elements
-</CButton>
-<CRow>
-  <CCol xs="6">
-    <CCollapse :visible="visibleA">
-      <CCard class="mt-3">
-        <CCardBody>
-          Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
-          richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson
-          cred nesciunt sapiente ea proident.
-        </CCardBody>
-      </CCard>
-    </CCollapse>
-  </CCol>
-  <CCol xs="6">
-    <CCollapse :visible="visibleB">
-      <CCard class="mt-3">
-        <CCardBody>
-          Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
-          richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson
-          cred nesciunt sapiente ea proident.
-        </CCardBody>
-      </CCard>
-    </CCollapse>
-  </CCol>
-</CRow>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleA = ref(false)
-  const visibleB = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="visibleA = !visibleA">Toggle first element</CButton>
-  <CButton color="primary" @click="visibleB = !visibleB">Toggle second element</CButton>
-  <CButton color="primary" @click="() => {
-    visibleA = !visibleA
-    visibleB = !visibleB
-  }"
-  >
-    Toggle both elements
-  </CButton>
-  <CRow>
-    <CCol xs="6">
-      <CCollapse :visible="visibleA">
-        <CCard class="mt-3">
-          <CCardBody>
-            Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
-            richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson
-            cred nesciunt sapiente ea proident.
-          </CCardBody>
-        </CCard>
-      </CCollapse>
-    </CCol>
-    <CCol xs="6">
-      <CCollapse :visible="visibleB">
-        <CCard class="mt-3">
-          <CCardBody>
-            Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
-            richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson
-            cred nesciunt sapiente ea proident.
-          </CCardBody>
-        </CCard>
-      </CCollapse>
-    </CCol>
-  </CRow>
-</template>
-```
-
-## API
-
-!!!include(./api/collapse/CCollapse.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(false)
-  const visibleHorizontal = ref(false)
-  const visibleA = ref(false)
-  const visibleB = ref(false)
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/dropdown.md b/packages/docs/components/dropdown.md
deleted file mode 100644
index cc321091..00000000
--- a/packages/docs/components/dropdown.md
+++ /dev/null
@@ -1,727 +0,0 @@
----
-title: Vue Dropdown Component
-name: Dropdown
-description: Vue dropdown component allows you to toggle contextual overlays for displaying lists, links, and more html elements.
-other_frameworks: dropdown
----
-
-## Overview
-
-Dropdowns are toggleable, contextual overlays for displaying lists of links and more.
-
-Dropdowns are built on a third party library, [Popper.js](https://popper.js.org/), which provides dynamic positioning and viewport detection. Popper.js isn't used to position dropdowns in navbars though as dynamic positioning isn't required.
-
-## Examples
-
-Bind the dropdown's toggle and the dropdown menu inside `<CDropdown>`, or different element that declares `position: relative;`. Dropdowns can be triggered from `<a>` or `<button>` elements to better fit your possible requirements.
-
-### Single button
-
-Here's how you can put them to work with either `<button>` elements:
-::: demo
-<CDropdown>
-  <CDropdownToggle color="primary">Dropdown Button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown>
-  <CDropdownToggle color="primary">Dropdown Button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-And with `<a>` elements:
-
-::: demo
-<CDropdown color="secondary" togglerText="Dropdown button">
-  <CDropdownToggle as="a" color="primary">Dropdown Button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-  </CDropdownMenu>  
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" togglerText="Dropdown button">
-  <CDropdownToggle as="a" color="primary">Dropdown Button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-  </CDropdownMenu>  
-</CDropdown>
-```
-
-The best part is you can do this with any button variant, too:
-
-::: demo
-<template v-for="(item) in ['primary', 'secondary', 'success', 'info', 'warning', 'danger']" :key="item">
-  <CDropdown :color="item" :togglerText="item" variant="btn-group">
-    <CDropdownToggle :color="item">{{item}}</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</template>
-:::
-```vue
-<template v-for="(item) in ['primary', 'secondary', 'success', 'info', 'warning', 'danger']" :key="item">
-  <CDropdown :color="item" :togglerText="item" variant="btn-group">
-    <CDropdownToggle :color="item">{{togglerText}}</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</template>
-```
-
-### Split button
-
-Similarly, create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of boolean prop `split` for proper spacing around the dropdown caret.
-
-We use this extra class to reduce the horizontal `padding` on either side of the caret by 25% and remove the `margin-left` that's attached for normal button dropdowns. Those additional changes hold the caret centered in the split button and implement a more properly sized hit area next to the main button.
-
-::: demo
-<template v-for="(item) in ['primary', 'secondary', 'success', 'info', 'warning', 'danger']" :key="item">
-  <CDropdown :color="item" :togglerText="item" variant="btn-group">
-    <CButton :color="item">{{ item }}</CButton>
-    <CDropdownToggle :color="item" split>{{item}}</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</template>
-:::
-```vue
-<template v-for="(item) in ['primary', 'secondary', 'success', 'info', 'warning', 'danger']" :key="item">
-  <CDropdown :color="item" :togglerText="item" variant="btn-group">
-    <CButton :color="item">{{ item }}</CButton>
-    <CDropdownToggle :color="item" split>{{item}}</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</template>
-```
-
-## Sizing
-
-Button dropdowns work with buttons of all sizes, including default and split dropdown buttons.
-
-::: demo
-<CDropdown variant="btn-group">
-  <CDropdownToggle color="secondary" size="lg">Large button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown variant="btn-group">
-  <CButton color="secondary" size="lg">Large split button</CButton>
-  <CDropdownToggle color="secondary" size="lg" split>Large button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown variant="btn-group">
-  <CDropdownToggle color="secondary" size="lg">Large button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown variant="btn-group">
-  <CButton color="secondary" size="lg">Large split button</CButton>
-  <CDropdownToggle color="secondary" size="lg" split>Large button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-::: demo
-<CDropdown variant="btn-group">
-  <CDropdownToggle color="secondary" size="sm">Small button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown variant="btn-group">
-  <CButton color="secondary" size="sm">Small split button</CButton>
-  <CDropdownToggle color="secondary" size="sm" split>Small button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown variant="btn-group">
-  <CDropdownToggle color="secondary" size="sm">Small button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown variant="btn-group">
-  <CButton color="secondary" size="sm">Small split button</CButton>
-  <CDropdownToggle color="secondary" size="sm" split>Small button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-## Dark dropdowns
-
-Opt into darker dropdowns to match a dark navbar or custom style by set `dark` property. No changes are required to the dropdown items.
-
-::: demo
-<CDropdown color="secondary" dark>
-  <CDropdownToggle color="primary">Dropdown Button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" dark>
-  <CDropdownToggle color="primary">Dropdown Button</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-And putting it to use in a navbar:
-
-::: demo
-<CNavbar expand="lg" color-scheme="dark" class="bg-dark">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarNav>
-      <CDropdown dark variant="nav-item">
-        <CDropdownToggle color="dark" :navLink="false">Dropdown Button</CDropdownToggle>
-        <CDropdownMenu>
-          <CDropdownItem href="#">Action</CDropdownItem>
-          <CDropdownItem href="#">Another action</CDropdownItem>
-          <CDropdownItem href="#">Something else here</CDropdownItem>
-          <CDropdownDivider/>
-          <CDropdownItem href="#">Separated link</CDropdownItem>
-        </CDropdownMenu>
-      </CDropdown>
-    </CNavbarNav>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="dark" class="bg-dark">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarNav>
-      <CDropdown dark variant="nav-item">
-        <CDropdownToggle color="dark" :navLink="false">Dropdown Button</CDropdownToggle>
-        <CDropdownMenu>
-          <CDropdownItem href="#">Action</CDropdownItem>
-          <CDropdownItem href="#">Another action</CDropdownItem>
-          <CDropdownItem href="#">Something else here</CDropdownItem>
-          <CDropdownDivider/>
-          <CDropdownItem href="#">Separated link</CDropdownItem>
-        </CDropdownMenu>
-      </CDropdown>
-    </CNavbarNav>
-  </CContainer>
-</CNavbar>
-```
-
-## Directions
-
-<Callout color="info" title="RTL">
-  Directions are mirrored when using CoreUI in RTL, meaning `.dropstart` will appear on the right side.
-</Callout>
-
-### Centered
-
-Make the dropdown menu centered below the toggle by adding `direction="center"` to the `<CDropdown>` component.
-
-::: demo
-<CDropdown color="secondary" direction="center">
-  <CDropdownToggle color="secondary">Centered dropdown</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" direction="center">
-  <CDropdownToggle color="secondary">Centered dropdown</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-### Dropup
-
-Trigger dropdown menus above elements by adding `direction="dropup"` to the `<CDropdown>` component.
-
-::: demo
-<CDropdown color="secondary" direction="dropup">
-  <CDropdownToggle color="secondary">Dropup</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown color="secondary" direction="dropup">
-  <CButton color="secondary">Split dropup</CButton>
-  <CDropdownToggle color="secondary" split/>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" direction="dropup">
-  <CDropdownToggle color="secondary">Dropup</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown color="secondary" direction="dropup">
-  <CButton color="secondary">Split dropup</CButton>
-  <CDropdownToggle color="secondary" split/>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-### Dropup centered
-
-Make the dropup menu centered above the toggle by adding `direction="dropup-center"` to the `<CDropdown>` component.
-
-::: demo
-<CDropdown color="secondary" direction="dropup-center">
-  <CDropdownToggle color="secondary">Centered dropup</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" direction="dropup-center">
-  <CDropdownToggle color="secondary">Centered dropup</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-### Dropend
-
-Trigger dropdown menus at the right of the elements by adding `direction="dropend"` to the `<CDropdown>` component.
-
-::: demo
-<CDropdown color="secondary" direction="dropend">
-  <CDropdownToggle color="secondary">Dropend</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown color="secondary" direction="dropend">
-  <CButton color="secondary">Split dropend</CButton>
-  <CDropdownToggle color="secondary" split/>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" direction="dropend">
-  <CDropdownToggle color="secondary">Dropend</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CDropdown color="secondary" direction="dropend">
-  <CButton color="secondary">Split dropend</CButton>
-  <CDropdownToggle color="secondary" split/>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-### Dropstart
-
-Trigger dropdown menus at the left of the elements by adding `direction="dropstart"` to the `<CDropdown>` component.
-
-::: demo
-<CDropdown color="secondary" direction="dropstart">
-  <CDropdownToggle color="secondary">Dropstart</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CButtonGroup>
-  <CDropdown color="secondary" direction="dropstart">
-    <CDropdownToggle color="secondary" split/>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CButton color="secondary">Split dropstart</CButton>
-</CButtonGroup>
-:::
-```vue
-<CDropdown color="secondary" direction="dropstart">
-  <CDropdownToggle color="secondary">Dropstart</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-<CButtonGroup>
-  <CDropdown color="secondary" direction="dropstart">
-    <CDropdownToggle color="secondary" split/>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CButton color="secondary">Split dropstart</CButton>
-</CButtonGroup>
-```
-
-### Responsive alignment
-
-If you use responsive alignment, dynamic positioning is disabled.
-
-To align **right** the dropdown menu with the given breakpoint or larger, add `aligment="xs|sm|md|lg|xl|xxl: end"`.
-
-::: demo
-<CDropdown color="secondary" :alignment="{ 'lg': 'end' }">
-  <CDropdownToggle color="secondary">Left-aligned but right aligned when large screen</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" :alignment="{ 'lg': 'end' }">
-  <CDropdownToggle color="secondary">Left-aligned but right aligned when large screen</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-To align **left** the dropdown menu with the given breakpoint or larger, add `aligment="xs|sm|md|lg|xl|xxl: start"`.
-
-::: demo
-<CDropdown color="secondary" :alignment="{ 'xs': 'end', 'lg': 'start' }">
-  <CDropdownToggle color="secondary">Right-aligned but left aligned when large screen</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-:::
-```vue
-<CDropdown color="secondary" :alignment="{ 'xs': 'end', 'lg': 'start' }">
-  <CDropdownToggle color="secondary">Right-aligned but left aligned when large screen</CDropdownToggle>
-  <CDropdownMenu>
-    <CDropdownItem href="#">Action</CDropdownItem>
-    <CDropdownItem href="#">Another action</CDropdownItem>
-    <CDropdownItem href="#">Something else here</CDropdownItem>
-    <CDropdownDivider/>
-    <CDropdownItem href="#">Separated link</CDropdownItem>
-  </CDropdownMenu>
-</CDropdown>
-```
-
-## Menu content
-
-### Headers
-
-Add a header to label sections of actions in any dropdown menu.
-
-In the following example we use `div` instead of `<CDropdownMenu>` to show `<CDropdownMenu>` content.
-
-::: demo
-<div class="dropdown-menu">
-  <CDropdownHeader>Dropdown header</CDropdownHeader>
-  <CDropdownItem href="#">Action</CDropdownItem>
-  <CDropdownItem href="#">Another action</CDropdownItem>
-</div>
-:::
-```vue
-<CDropdownHeader>Dropdown header</CDropdownHeader>
-<CDropdownItem href="#">Action</CDropdownItem>
-<CDropdownItem href="#">Another action</CDropdownItem>
-```
-
-### Dividers
-
-Separate groups of related menu items with a divider.
-
-In the following example we use `div` instead of `<CDropdownMenu>` to show `<CDropdownMenu>` content.
-
-::: demo
-<div class="dropdown-menu">
-  <CDropdownItem href="#">Action</CDropdownItem>
-  <CDropdownItem href="#">Another action</CDropdownItem>
-  <CDropdownItem href="#">Something else here</CDropdownItem>
-  <CDropdownDivider/>
-  <CDropdownItem href="#">Separated link</CDropdownItem>
-</div>
-:::
-```vue
-<CDropdownItem href="#">Action</CDropdownItem>
-<CDropdownItem href="#">Another action</CDropdownItem>
-<CDropdownItem href="#">Something else here</CDropdownItem>
-<CDropdownDivider/>
-<CDropdownItem href="#">Separated link</CDropdownItem>
-```
-### Text
-
-Place any freeform text within a dropdown menu with text. Note that you'll likely need additional sizing styles to constrain the menu width.
-
-::: demo
-<div class="border rounded p-4 text-body-secondary" style="max-width: 200px">
-  <p>
-    Some example text that's free-flowing within the dropdown menu.
-  </p>
-  <p class="mb-0">
-    And this is more example text.
-  </p>
-</div>
-:::
-```vue
-<p>
-  Some example text that's free-flowing within the dropdown menu.
-</p>
-<p class="mb-0">
-  And this is more example text.
-</p>
-```
-
-### Forms
-
-Put a form within a dropdown menu, or make it into a dropdown menu.
-
-::: demo
-<div class="dropdown-menu">
-  <CForm class="px-4 py-4">
-    <div class="mb-3">
-      <CFormLabel for="exampleDropdownFormEmail1">Email address</CFormLabel>
-      <CFormInput type="email" id="exampleDropdownFormEmail1" placeholder="email@example.com"/>
-    </div>
-    <div class="mb-3">
-      <CFormLabel for="exampleDropdownFormPassword1">Password</CFormLabel>
-      <CFormInput type="password" id="exampleDropdownFormPassword1" placeholder="Password"/>
-    </div>
-    <div class="mb-3">
-      <CFormCheck id="dropdownCheck" label="Remember me"/>
-    </div>
-    <CButton color="primary" type="submit">Sign in</CButton>
-  </CForm>
-  <CDropdownDivider/>
-  <CDropdownItem href="#">New around here? Sign up</CDropdownItem>
-  <CDropdownItem href="#">Forgot password?</CDropdownItem>
-</div>
-:::
-```vue
-<CForm class="px-4 py-4">
-  <div class="mb-3">
-    <CFormLabel for="exampleDropdownFormEmail1">Email address</CFormLabel>
-    <CFormInput type="email" id="exampleDropdownFormEmail1" placeholder="email@example.com"/>
-  </div>
-  <div class="mb-3">
-    <CFormLabel for="exampleDropdownFormPassword1">Password</CFormLabel>
-    <CFormInput type="password" id="exampleDropdownFormPassword1" placeholder="Password"/>
-  </div>
-  <div class="mb-3">
-    <CFormCheck id="dropdownCheck" label="Remember me"/>
-  </div>
-  <CButton color="primary" type="submit">Sign in</CButton>
-</CForm>
-<CDropdownDivider/>
-<CDropdownItem href="#">New around here? Sign up</CDropdownItem>
-<CDropdownItem href="#">Forgot password?</CDropdownItem>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue dropdowns use local CSS variables on `.dropdown` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="_dropdown.scss" capture="dropdown-css-vars"/>
-
-Customization through CSS variables can be seen on the `.dropdown-menu-dark` class where we override specific values without adding duplicate CSS selectors.
-
-<ScssDocs file="_dropdown.scss" capture="dropdown-dark-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CDropdown :style="vars">...</CDropdown>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="dropdown-variables"/>
-
-Variables for the dark dropdown:
-
-<ScssDocs file="_variables.scss" capture="dropdown-dark-variables"/>
-
-Variables for the CSS-based carets that indicate a dropdown's interactivity:
-
-<ScssDocs file="_variables.scss" capture="caret-variables"/>
-
-## API
-
-!!!include(./api/dropdown/CDropdown.api.md)!!!
-
-!!!include(./api/dropdown/CDropdownHeader.api.md)!!!
-
-!!!include(./api/dropdown/CDropdownItem.api.md)!!!
-
-!!!include(./api/dropdown/CDropdownMenu.api.md)!!!
-
-!!!include(./api/dropdown/CDropdownToggle.api.md)!!!
diff --git a/packages/docs/components/footer.md b/packages/docs/components/footer.md
deleted file mode 100644
index 85333743..00000000
--- a/packages/docs/components/footer.md
+++ /dev/null
@@ -1,59 +0,0 @@
----
-title: Vue Footer Component
-name: Footer
-description: Vue footer component is an additional navigation used for displaying general information that a user might want to access from any page within your site. It is a place to display boilerplate text about the site, company info, copyrights, links to a contact form, sitemap, FAQ and other such resources.
-other_frameworks: footer
----
-
-## Examples
-
-::: demo
-<CFooter>
-  <div>
-    <CLink href="https://coreui.io">CoreUI</CLink>
-    <span>&copy; 2021 creativeLabs.</span>
-  </div>
-  <div>
-    <span>Powered by</span>
-    <CLink href="https://coreui.io">CoreUI</CLink>
-  </div>
-</CFooter>
-:::
-```vue
-<CFooter>
-  <div>
-    <CLink href="https://coreui.io">CoreUI</CLink>
-    <span>&copy; 2021 creativeLabs.</span>
-  </div>
-  <div>
-    <span>Powered by</span>
-    <CLink href="https://coreui.io">CoreUI</CLink>
-  </div>
-</CFooter>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue footers use local CSS variables on `.footer` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="_footer.scss" capture="footer-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CFooter :style="vars">...</CFooter>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="footer-variables"/>
-
-## API
-
-!!!include(./api/footer/CFooter.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/header.md b/packages/docs/components/header.md
deleted file mode 100644
index 8c45d6a3..00000000
--- a/packages/docs/components/header.md
+++ /dev/null
@@ -1,140 +0,0 @@
----
-title: Vue Header Component
-name: Header
-description: Documentation and examples for the Header powerful, responsive navigation header. Includes support for branding, links, dropdowns, and more.
-other_frameworks: header
----
-
-## Example
-
-Here's what you need to know before getting started with the header:
-
-- Headers require a wrapping `.header` with `.header-expand{-sm|-md|-lg|-xl|-xxl}` for responsive collapsing and [color scheme](#color-schemes) classes.
-- Headers and their contents are fluid by default. Change the [container](#containers) to limit their horizontal width in different ways.
-- Use our [spacing](https://coreui.io/docs/utilities/spacing") and [flex](https://coreui.io/docs/4.0/utilities/flex) utility classes for controlling spacing and alignment within headers.
-- Headers are responsive by default, but you can easily modify them to change that. Responsive behavior depends on our Collapse JavaScript plugin.
-- Ensure accessibility by using a `<nav>` element or, if using a more generic element such as a `<div>`, add a `role="navigation"` to every header to explicitly identify it as a landmark region for users of assistive technologies.
-- Indicate the current item by using `aria-current="page"` for the current page or `aria-current="true"` for the current item in a set.
-
-## Supported content
-
-Headers come with built-in support for a handful of sub-components. Choose from the following as needed:
-
-- `<CHeaderBrand>` for your company, product, or project name.
-- `<CHeaderNav>` for a full-height and lightweight navigation (including support for dropdowns).
-- `<CHeaderToggler>` for use with our collapse plugin and other [navigation toggling](#responsive-behaviors) behaviors.
-- Flex and spacing utilities for any form controls and actions.
-- `<CHeaderText>` for adding vertically centered strings of text.
-- `<CCollapse class="header-collapse">` for grouping and hiding header contents by a parent breakpoint.
-
-Here's an example of all the sub-components included in a responsive light-themed header that automatically collapses at the `lg` (large) breakpoint.
-
-::: demo
-<CHeader>
-  <CContainer fluid>
-    <CHeaderBrand href="#">Header</CHeaderBrand>
-    <CHeaderToggler @click="visible = !visible" />
-    <CCollapse class="header-collapse" :visible="visible">
-      <CHeaderNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CHeaderNav>
-      <CForm class="d-flex">
-        <CFormInput class="me-2" type="search" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm> 
-    </CCollapse>
-  </CContainer>
-</CHeader>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(true)
-</script>
-<template>
-  <CHeader>
-    <CContainer fluid>
-      <CHeaderBrand href="#">Header</CHeaderBrand>
-      <CHeaderToggler @click="visible = !visible" />
-      <CCollapse class="header-collapse" :visible="visible">
-        <CHeaderNav>
-          <CNavItem>
-            <CNavLink href="#" active>
-              Home
-            </CNavLink>
-          </CNavItem>
-          <CNavItem>
-            <CNavLink href="#">Link</CNavLink>
-          </CNavItem>
-          <CDropdown togglerText="Dropdown" variant="nav-item">
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdown>
-          <CNavItem>
-            <CNavLink href="#" disabled>
-              Disabled
-            </CNavLink>
-          </CNavItem>
-        </CHeaderNav>
-      </CCollapse>
-    </CContainer>
-  </CHeader>
-</template>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue headers use local CSS variables on `.header` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="_header.scss" capture="header-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CHeader :style="vars">...</CHeader>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="header-variables"/>
-
-## API
-
-!!!include(./api/header/CHeader.api.md)!!!
-
-!!!include(./api/header/CHeaderBrand.api.md)!!!
-
-!!!include(./api/header/CHeaderNav.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(true)
-</script>
diff --git a/packages/docs/components/icon.md b/packages/docs/components/icon.md
deleted file mode 100644
index a68ced42..00000000
--- a/packages/docs/components/icon.md
+++ /dev/null
@@ -1,313 +0,0 @@
----
-title: Vue Icon Component
-name: Icon
-description: Vue icons library is a great resource for Vue developers, who can use its customizable SVG icons in their applications. It offers an extensive library of icons to choose from, which can be easily inserted into projects with just a few lines of code. Not only that, but users are also able to customize the appearance of these icons by setting various props on them. This provides developers with an efficient and flexible way to integrate useful graphical elements into their web pages without doing any extra work.
----
-
-## Installation
-
-To start using CoreUI Vue Icons in your project, you need to install it as a dependency. Follow the instructions below based on your package manager of choice:
-
-### Npm
-
-```bash
-// CoreUI Icons library
-npm install @coreui/icons
-
-// CIcon component
-npm install @coreui/icons-vue 
-```
-
-### Yarn
-
-```bash
-yarn add @coreui/icons
-yarn add @coreui/icons-vue
-```
-
-## Usage
-
-Import vue.js icons using one of these two options:
-
-### Single Vue.js icon
-
-To use a single Vue.js icon, import the `<CIcon>` component and the desired icon(s) from the `@coreui/icons` library. Then, include the `<CIcon>` component in your code and specify the icon prop with the imported icon variable. Additionally, you can set the desired size for the icon using the `size` prop.
-
-::: demo
-<CIcon :icon="icon.cilList" size="xl"/>
-<CIcon :icon="icon.cilShieldAlt" size="xl"/>
-:::
-```vue
-<template>
-  <CIcon :icon="cilList" size="xl"/>
-  <CIcon :icon="cilShieldAlt" size="xl"/>
-</template>
-<script setup>
-  import { CIcon } from '@coreui/icons-vue';
-  import { cilList, cilShieldAlt } from '@coreui/icons';
-</script>
-```
-
-### All icons
-
-To use all icons available in the CoreUI Vue.js Icons package, import the CIcon component and the entire `@coreui/icons` library using the `* as` syntax. Then, reference the desired icon within the `icon` prop.
-
-```vue
-<template>
-  <CIcon :icon="icon.cilList" size="xxl"/>
-</template>
-<script setup>
-  import { CIcon } from '@coreui/icons-vue';
-  import * as icon from '@coreui/icons';
-</script>
-```
-
-### Icons object
-
-This way you import your needed Vue.js icons once and pass them to $root object on 'icons' key
-
-```js
-// main.js / main.ts
-import { CIcon } from '@coreui/icons-vue';
-import {
-  cilArrowBottom,
-  cilArrowRight,
-  cilArrowTop,
-  cilBan,
-  cilBasket,
-  cilBell,
-  cilCalculator,
-  cilCalendar
-} from '@coreui/icons'
-
-const icons = {
-  cilArrowBottom,
-  cilArrowRight,
-  cilArrowTop,
-  cilBan,
-  cilBasket,
-  cilBell,
-  cilCalculator,
-  cilCalendar
-}
-
-const app = createApp(App)
-...
-app.provide('icons', icons)
-app.component('CIcon', CIcon)
-...
-app.mount('#app')
-
-```
-
-Later anywhere in the app:
-
-```vue
-<CIcon icon="cilArrowBottom" size="xxl"/>
-<CIcon icon="cil-arrow-bottom" size="xxl"/>
-```
-
-You can pass the name of the icon both in camelCase and kebab-case
-
-### Color
-
-The CoreUI Vue Icon component offers versatile color customization options, empowering you to personalize the icons in multiple ways. You can effortlessly modify the colors by utilizing either class names or CSS variables, providing flexibility and ease in creating visually stunning and cohesive icon designs.
-
-#### Utility classes
-
-With some [color utility classes](https://coreui.io/docs/utilities/colors/), you may use color to convey message.
-
-::: demo
-<CIcon :icon="icon.cilList" size="xl" />
-<CIcon :icon="icon.cilList" class="text-primary" size="xl" />
-<CIcon :icon="icon.cilList" class="text-secondary" size="xl" />
-<CIcon :icon="icon.cilList" class="text-success" size="xl" />
-<CIcon :icon="icon.cilList" class="text-danger" size="xl" />
-<CIcon :icon="icon.cilList" class="text-warning" size="xl" />
-<CIcon :icon="icon.cilList" class="text-info" size="xl" />
-:::
-```vue
-<CIcon :icon="cilList" size="xl" />
-<CIcon :icon="cilList" class="text-primary" size="xl" />
-<CIcon :icon="cilList" class="text-secondary" size="xl" />
-<CIcon :icon="cilList" class="text-success" size="xl" />
-<CIcon :icon="cilList" class="text-danger" size="xl" />
-<CIcon :icon="cilList" class="text-warning" size="xl" />
-<CIcon :icon="cilList" class="text-info" size="xl" />
-```
-
-#### CSS Variables
-
-CoreUI Vue Icons leverage local CSS variables, such as `--ci-primary-color` and `--ci-secondary-color` (for Duotone icons), to facilitate real-time customization. This allows developers to easily customize the icons by providing their own custom CSS variables.
-
-::: demo
-<CIcon :icon="icon.cilList" size="xl" :style="{'--ci-primary-color': 'red'}" />
-<CIcon :icon="icon.cilList" size="xl" :style="{'--ci-primary-color': 'green'}" />
-:::
-```vue
-<CIcon :icon="cilList" size="xl" :style="{'--ci-primary-color': 'red'}" />
-<CIcon :icon="cilList" size="xl" :style="{'--ci-primary-color': 'green'}" />
-```
-
-### Sizing
-
-Set heights of vue icons using size property like `size="lg"` and `size="sm"`.
-
-::: demo
-<CIcon :icon="icon.cilList" size="sm" />
-<CIcon :icon="icon.cilList" />
-<CIcon :icon="icon.cilList" size="lg" />
-<CIcon :icon="icon.cilList" size="xl" />
-<CIcon :icon="icon.cilList" size="xxl" />
-<CIcon :icon="icon.cilList" size="3xl" />
-:::
-```vue
-<CIcon :icon="cilList" size="sm" />
-<CIcon :icon="cilList" />
-<CIcon :icon="cilList" size="lg" />
-<CIcon :icon="cilList" size="xl" />
-<CIcon :icon="cilList" size="xxl" />
-<CIcon :icon="cilList" size="3xl" />
-```
-
-### Custom SVG Icons
-
-The `<CIconSvg`> component allows you to add custom SVG icons to your application. In case you want to use custom SVG icons, this component provides the flexibility to include bespoke SVG graphics that align with your design requirements.
-
-::: demo
-<CIconSvg size="4xl">
-  <svg
-    viewBox="0 0 102 116"
-    version="1.1"
-    xmlns="http://www.w3.org/2000/svg"
-    xmlnsXlink="http://www.w3.org/1999/xlink"
-  >
-    <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
-      <g fill="#3C4B64" fillRule="nonzero">
-        <path
-          d="M96,25.091 L57,2.5743 C53.2871871,0.430706461 48.7128129,0.430706461 45,2.5743 L6,25.091 C2.292246,27.239646 0.00690676667,31.1979678 0,35.4833 L0,80.5167 C0.00688629146,84.8020377 2.29223099,88.760369 6,90.909 L45,113.4256 C48.7127742,115.569338 53.2872258,115.569338 57,113.4256 L96,90.909 C99.707769,88.760369 101.993114,84.8020377 102,80.5167 L102,35.4833 C101.993093,31.1979678 99.707754,27.239646 96,25.091 Z M94,80.5167 C94,81.9457261 93.2375729,83.266187 92,83.9807 L53,106.4974 C51.7623957,107.211931 50.2376043,107.211931 49,106.4974 L10,83.9807 C8.76242713,83.266187 8,81.9457261 8,80.5167 L8,35.4833 C8,34.0542382 8.76239619,32.7337309 10,32.0192 L49,9.5025 C50.2376043,8.78796882 51.7623957,8.78796882 53,9.5025 L92,32.0192 C93.2376038,32.7337309 94,34.0542382 94,35.4833 L94,80.5167 Z"
-          id="Shape"
-        />
-        <path
-          d="M74.0216,71.0379 L71.1556,71.0379 C70.4827717,71.0379163 69.8208181,71.2076524 69.231,71.5314 L51.95,81.0167 L32,69.4981 L32,46.5206 L51.95,35.002 L69.2394,44.457 C69.8278903,44.7788245 70.4878603,44.9474965 71.1586,44.9475 L74.0218,44.9475 C75.1263695,44.9475 76.0218,44.0520695 76.0218,42.9475 L76.0218,40.2357 C76.0218,39.5046907 75.6230914,38.8318844 74.9818,38.481 L55.793,27.9854 C53.3404536,26.651551 50.3714915,26.6856213 47.9502,28.0754 L28,39.5929 C25.5282949,41.025705 24.0048155,43.6646378 24,46.5216 L24,69.4976 C24,72.3557593 25.5247614,74.9968204 28,76.4259 L47.95,87.9444 C50.3719491,89.3331078 53.3408366,89.3663802 55.7933,88.0323 L74.9833,77.5012 C75.623333,77.1499602 76.021125,76.4778764 76.0211,75.7478 L76.0211,73.0378 C76.0210448,71.9334648 75.1259352,71.0381761 74.0216,71.0379 L74.0216,71.0379 Z"
-          id="Path"
-        />
-      </g>
-    </g>
-  </svg>
-</CIconSvg>
-:::
-```vue
-<script setup>
-  import { CIconSvg } from '@coreui/icons-vue';
-</script>
-<template>
-  <CIconSvg size="4xl">
-    <svg
-      viewBox="0 0 102 116"
-      version="1.1"
-      xmlns="http://www.w3.org/2000/svg"
-      xmlnsXlink="http://www.w3.org/1999/xlink"
-    >
-      <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
-        <g fill="#3C4B64" fillRule="nonzero">
-          <path
-            d="M96,25.091 L57,2.5743 C53.2871871,0.430706461 48.7128129,0.430706461 45,2.5743 L6,25.091 C2.292246,27.239646 0.00690676667,31.1979678 0,35.4833 L0,80.5167 C0.00688629146,84.8020377 2.29223099,88.760369 6,90.909 L45,113.4256 C48.7127742,115.569338 53.2872258,115.569338 57,113.4256 L96,90.909 C99.707769,88.760369 101.993114,84.8020377 102,80.5167 L102,35.4833 C101.993093,31.1979678 99.707754,27.239646 96,25.091 Z M94,80.5167 C94,81.9457261 93.2375729,83.266187 92,83.9807 L53,106.4974 C51.7623957,107.211931 50.2376043,107.211931 49,106.4974 L10,83.9807 C8.76242713,83.266187 8,81.9457261 8,80.5167 L8,35.4833 C8,34.0542382 8.76239619,32.7337309 10,32.0192 L49,9.5025 C50.2376043,8.78796882 51.7623957,8.78796882 53,9.5025 L92,32.0192 C93.2376038,32.7337309 94,34.0542382 94,35.4833 L94,80.5167 Z"
-            id="Shape"
-          />
-          <path
-            d="M74.0216,71.0379 L71.1556,71.0379 C70.4827717,71.0379163 69.8208181,71.2076524 69.231,71.5314 L51.95,81.0167 L32,69.4981 L32,46.5206 L51.95,35.002 L69.2394,44.457 C69.8278903,44.7788245 70.4878603,44.9474965 71.1586,44.9475 L74.0218,44.9475 C75.1263695,44.9475 76.0218,44.0520695 76.0218,42.9475 L76.0218,40.2357 C76.0218,39.5046907 75.6230914,38.8318844 74.9818,38.481 L55.793,27.9854 C53.3404536,26.651551 50.3714915,26.6856213 47.9502,28.0754 L28,39.5929 C25.5282949,41.025705 24.0048155,43.6646378 24,46.5216 L24,69.4976 C24,72.3557593 25.5247614,74.9968204 28,76.4259 L47.95,87.9444 C50.3719491,89.3331078 53.3408366,89.3663802 55.7933,88.0323 L74.9833,77.5012 C75.623333,77.1499602 76.021125,76.4778764 76.0211,75.7478 L76.0211,73.0378 C76.0210448,71.9334648 75.1259352,71.0381761 74.0216,71.0379 L74.0216,71.0379 Z"
-            id="Path"
-          />
-        </g>
-      </g>
-    </svg>
-  </CIconSvg>
-</template>
-```
-
-## Available icons
-
-CoreUI Icons package is delivered with more than 1500 icons in multiple formats SVG, PNG, and Webfonts. CoreUI Icons are beautifully crafted symbols for common actions and items. You can use them in your digital products for web or mobile app.
-
-<CNav variant="tabs" role="tablist">
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPaneActiveKey === 1"
-      @click="() => {tabPaneActiveKey = 1}"
-    >
-      Linear
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPaneActiveKey === 2"
-      @click="() => {tabPaneActiveKey = 2}"
-    >
-      Brand
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPaneActiveKey === 3"
-      @click="() => {tabPaneActiveKey = 3}"
-    >
-      Flags
-    </CNavLink>
-  </CNavItem>
-</CNav>
-<CTabContent class="pt-4" style="--cui-light: #f0f4f7">
-  <CTabPane role="tabpanel" aria-labelledby="linear-tab" :visible="tabPaneActiveKey === 1">
-    <CRow v-if="tabPaneActiveKey === 1" :xs="{ cols: 3 }" :sm="{ cols: 4 }" :lg="{ cols: 5 }">
-      <CCol class="mb-4" v-for="(i) in linearIcons">
-        <div class="p-3 py-4 mb-2 bg-body-tertiary text-center rounded">
-          <CIcon :icon="icon[i]" size="xxl"/>
-        </div>
-        <div class="text-body-secondary text-center pt-1 small">{{i}}</div>
-      </CCol>
-    </CRow>
-  </CTabPane>
-  <CTabPane role="tabpanel" aria-labelledby="brand-tab" :visible="tabPaneActiveKey === 2">
-    <CRow v-if="tabPaneActiveKey === 2" :xs="{ cols: 3 }" :sm="{ cols: 4 }" :lg="{ cols: 5 }">
-      <CCol class="mb-4" v-for="(i) in brandIcons">
-        <div class="p-3 py-4 mb-2 bg-body-tertiary text-center rounded">
-          <CIcon :icon="icon[i]" size="xxl"/>
-        </div>
-        <div class="text-body-secondary text-center pt-1 small">{{i}}</div>
-      </CCol>
-    </CRow>
-  </CTabPane>
-  <CTabPane role="tabpanel" aria-labelledby="flags-tab" :visible="tabPaneActiveKey === 3">
-    <CRow v-if="tabPaneActiveKey === 3" :xs="{ cols: 3 }" :sm="{ cols: 4 }" :lg="{ cols: 5 }">
-      <CCol class="mb-4" v-for="(i) in flagIcons">
-        <div class="p-3 py-4 mb-2 bg-body-tertiary text-center rounded">
-          <CIcon :icon="icon[i]" size="xxl"/>
-        </div>
-        <div class="text-body-secondary text-center pt-1 small">{{i}}</div>
-      </CCol>
-    </CRow>
-  </CTabPane>
-</CTabContent>
-
-## API
-
-!!!include(./api/coreui-icons-vue/src/CIcon.api.md)!!!
-
-!!!include(./api/coreui-icons-vue/src/CIconSvg.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  import { CIcon } from '@coreui/icons-vue';
-  import * as icon from '@coreui/icons';
-
-  const linearIcons = ['cilAccountLogout', 'cilActionRedo', 'cilActionUndo', 'cilAddressBook', 'cilAirplaneModeOff', 'cilAirplaneMode', 'cilAirplay', 'cilAlarm', 'cilAlbum', 'cilAlignCenter', 'cilAlignLeft', 'cilAlignRight', 'cilAmericanFootball', 'cilAnimal', 'cilAperture', 'cilApple', 'cilApplicationsSettings', 'cilApplications', 'cilAppsSettings', 'cilApps', 'cilArrowBottom', 'cilArrowCircleBottom', 'cilArrowCircleLeft', 'cilArrowCircleRight', 'cilArrowCircleTop', 'cilArrowLeft', 'cilArrowRight', 'cilArrowThickBottom', 'cilArrowThickFromBottom', 'cilArrowThickFromLeft', 'cilArrowThickFromRight', 'cilArrowThickFromTop', 'cilArrowThickLeft', 'cilArrowThickRight', 'cilArrowThickToBottom', 'cilArrowThickToLeft', 'cilArrowThickToRight', 'cilArrowThickToTop', 'cilArrowThickTop', 'cilArrowTop', 'cilAssistiveListeningSystem', 'cilAsteriskCircle', 'cilAsterisk', 'cilAt', 'cilAudioDescription', 'cilAudioSpectrum', 'cilAudio', 'cilAvTimer', 'cilBabyCarriage', 'cilBaby', 'cilBackspace', 'cilBadge', 'cilBalanceScale', 'cilBan', 'cilBank', 'cilBarChart', 'cilBarcode', 'cilBaseball', 'cilBasket', 'cilBasketball', 'cilBath', 'cilBathroom', 'cilBattery0', 'cilBattery3', 'cilBattery5', 'cilBatteryAlert', 'cilBatteryEmpty', 'cilBatteryFull', 'cilBatterySlash', 'cilBeachAccess', 'cilBeaker', 'cilBed', 'cilBellExclamation', 'cilBell', 'cilBike', 'cilBirthdayCake', 'cilBlind', 'cilBluetooth', 'cilBlurCircular', 'cilBlurLinear', 'cilBlur', 'cilBoatAlt', 'cilBold', 'cilBoltCircle', 'cilBolt', 'cilBook', 'cilBookmark', 'cilBorderAll', 'cilBorderBottom', 'cilBorderClear', 'cilBorderHorizontal', 'cilBorderInner', 'cilBorderLeft', 'cilBorderOuter', 'cilBorderRight', 'cilBorderStyle', 'cilBorderTop', 'cilBorderVertical', 'cilBowling', 'cilBraille', 'cilBriefcase', 'cilBrightness', 'cilBritishPound', 'cilBrowser', 'cilBrushAlt', 'cilBrush', 'cilBug', 'cilBuilding', 'cilBullhorn', 'cilBurger', 'cilBurn', 'cilBusAlt', 'cilCalculator', 'cilCalendarCheck', 'cilCalendar', 'cilCameraControl', 'cilCameraRoll', 'cilCamera', 'cilCarAlt', 'cilCaretBottom', 'cilCaretLeft', 'cilCaretRight', 'cilCaretTop', 'cilCart', 'cilCash', 'cilCasino', 'cilCast', 'cilCat', 'cilCc', 'cilCenterFocus', 'cilChartLine', 'cilChartPie', 'cilChart', 'cilChatBubble', 'cilCheckAlt', 'cilCheckCircle', 'cilCheck', 'cilChevronBottom', 'cilChevronCircleDownAlt', 'cilChevronCircleLeftAlt', 'cilChevronCircleRightAlt', 'cilChevronCircleUpAlt', 'cilChevronDoubleDown', 'cilChevronDoubleLeft', 'cilChevronDoubleRight', 'cilChevronDoubleUp', 'cilChevronLeft', 'cilChevronRight', 'cilChevronTop', 'cilChildFriendly', 'cilChild', 'cilCircle', 'cilClearAll', 'cilClipboard', 'cilClock', 'cilClone', 'cilClosedCaptioning', 'cilCloudDownload', 'cilCloudUpload', 'cilCloud', 'cilCloudy', 'cilCode', 'cilCoffee', 'cilCog', 'cilColorBorder', 'cilColorFill', 'cilColorPalette', 'cilColumns', 'cilCommand', 'cilCommentBubble', 'cilCommentSquare', 'cilCompass', 'cilCompress', 'cilContact', 'cilContrast', 'cilControl', 'cilCopy', 'cilCouch', 'cilCreditCard', 'cilCropRotate', 'cilCrop', 'cilCursorMove', 'cilCursor', 'cilCut', 'cilDataTransferDown', 'cilDataTransferUp', 'cilDeaf', 'cilDelete', 'cilDescription', 'cilDevices', 'cilDialpad', 'cilDiamond', 'cilDinner', 'cilDisabled', 'cilDog', 'cilDollar', 'cilDoor', 'cilDoubleQuoteSansLeft', 'cilDoubleQuoteSansRight', 'cilDrinkAlcohol', 'cilDrink', 'cilDrop', 'cilEco', 'cilEducation', 'cilElevator', 'cilEnvelopeClosed', 'cilEnvelopeLetter', 'cilEnvelopeOpen', 'cilEqualizer', 'cilEthernet', 'cilEuro', 'cilExcerpt', 'cilExitToApp', 'cilExpandDown', 'cilExpandLeft', 'cilExpandRight', 'cilExpandUp', 'cilExposure', 'cilExternalLink', 'cilEyedropper', 'cilFaceDead', 'cilFace', 'cilFactorySlash', 'cilFactory', 'cilFastfood', 'cilFax', 'cilFeaturedPlaylist', 'cilFile', 'cilFilterFrames', 'cilFilterPhoto', 'cilFilterSquare', 'cilFilterX', 'cilFilter', 'cilFindInPage', 'cilFingerprint', 'cilFire', 'cilFlagAlt', 'cilFlightTakeoff', 'cilFlipToBack', 'cilFlipToFront', 'cilFlip', 'cilFlower', 'cilFolderOpen', 'cilFolder', 'cilFont', 'cilFootball', 'cilFork', 'cilFridge', 'cilFrown', 'cilFullscreenExit', 'cilFullscreen', 'cilFunctionsAlt', 'cilFunctions', 'cilGamepad', 'cilGarage', 'cilGem', 'cilGif', 'cilGift', 'cilGlobeAlt', 'cilGolfAlt', 'cilGolf', 'cilGradient', 'cilGrain', 'cilGraph', 'cilGridSlash', 'cilGrid', 'cilGroup', 'cilHamburgerMenu', 'cilHandPointDown', 'cilHandPointLeft', 'cilHandPointRight', 'cilHandPointUp', 'cilHappy', 'cilHd', 'cilHdr', 'cilHeader', 'cilHeadphones', 'cilHealing', 'cilHeart', 'cilHighlighter', 'cilHighligt', 'cilHistory', 'cilHome', 'cilHospital', 'cilHotTub', 'cilHouse', 'cilHttps', 'cilImageBroken', 'cilImagePlus', 'cilImage', 'cilInbox', 'cilIndentDecrease', 'cilIndentIncrease', 'cilIndustrySlash', 'cilIndustry', 'cilInfinity', 'cilInfo', 'cilInputHdmi', 'cilInputPower', 'cilInput', 'cilInstitution', 'cilItalic', 'cilJustifyCenter', 'cilJustifyLeft', 'cilJustifyRight', 'cilKeyboard', 'cilLan', 'cilLanguage', 'cilLaptop', 'cilLayers', 'cilLeaf', 'cilLemon', 'cilLevelDown', 'cilLevelUp', 'cilLibraryAdd', 'cilLibraryBuilding', 'cilLibrary', 'cilLifeRing', 'cilLightbulb', 'cilLineSpacing', 'cilLineStyle', 'cilLineWeight', 'cilLinkAlt', 'cilLinkBroken', 'cilLink', 'cilListFilter', 'cilListHighPriority', 'cilListLowPriority', 'cilListNumberedRtl', 'cilListNumbered', 'cilListRich', 'cilList', 'cilLocationPin', 'cilLockLocked', 'cilLockUnlocked', 'cilLocomotive', 'cilLoop1', 'cilLoopCircular', 'cilLoop', 'cilLowVision', 'cilMagnifyingGlass', 'cilMap', 'cilMediaEject', 'cilMediaPause', 'cilMediaPlay', 'cilMediaRecord', 'cilMediaSkipBackward', 'cilMediaSkipForward', 'cilMediaStepBackward', 'cilMediaStepForward', 'cilMediaStop', 'cilMedicalCross', 'cilMeh', 'cilMemory', 'cilMenu', 'cilMic', 'cilMicrophone', 'cilMinus', 'cilMobileLandscape', 'cilMobile', 'cilMoney', 'cilMonitor', 'cilMoodBad', 'cilMoodGood', 'cilMoodVeryBad', 'cilMoodVeryGood', 'cilMoon', 'cilMouse', 'cilMouthSlash', 'cilMove', 'cilMovie', 'cilMugTea', 'cilMug', 'cilMusicNote', 'cilNewspaper', 'cilNoteAdd', 'cilNotes', 'cilObjectGroup', 'cilObjectUngroup', 'cilOpacity', 'cilOpentype', 'cilOptions', 'cilPaintBucket', 'cilPaint', 'cilPaperPlane', 'cilPaperclip', 'cilParagraph', 'cilPaw', 'cilPenAlt', 'cilPenNib', 'cilPen', 'cilPencil', 'cilPeople', 'cilPhone', 'cilPin', 'cilPizza', 'cilPlant', 'cilPlaylistAdd', 'cilPlus', 'cilPool', 'cilPowerStandby', 'cilPregnant', 'cilPrint', 'cilPushchair', 'cilPuzzle', 'cilQrCode', 'cilRain', 'cilRectangle', 'cilRecycle', 'cilReload', 'cilReportSlash', 'cilResizeBoth', 'cilResizeHeight', 'cilResizeWidth', 'cilRestaurant', 'cilRoom', 'cilRouter', 'cilRowing', 'cilRss', 'cilRuble', 'cilRunning', 'cilSad', 'cilSatelite', 'cilSave', 'cilSchool', 'cilScreenDesktop', 'cilScreenSmartphone', 'cilScrubber', 'cilSearch', 'cilSend', 'cilSettings', 'cilShareAll', 'cilShareAlt', 'cilShareBoxed', 'cilShare', 'cilShieldAlt', 'cilShortText', 'cilShower', 'cilSignLanguage', 'cilSignalCellular0', 'cilSignalCellular3', 'cilSignalCellular4', 'cilSim', 'cilSitemap', 'cilSmilePlus', 'cilSmile', 'cilSmokeFree', 'cilSmokeSlash', 'cilSmoke', 'cilSmokingRoom', 'cilSnowflake', 'cilSoccer', 'cilSofa', 'cilSortAlphaDown', 'cilSortAlphaUp', 'cilSortAscending', 'cilSortDescending', 'cilSortNumericDown', 'cilSortNumericUp', 'cilSpa', 'cilSpaceBar', 'cilSpeak', 'cilSpeaker', 'cilSpeech', 'cilSpeedometer', 'cilSpreadsheet', 'cilSquare', 'cilStarHalf', 'cilStar', 'cilStorage', 'cilStream', 'cilStrikethrough', 'cilSun', 'cilSwapHorizontal', 'cilSwapVertical', 'cilSwimming', 'cilSync', 'cilTablet', 'cilTag', 'cilTags', 'cilTask', 'cilTaxi', 'cilTennisBall', 'cilTennis', 'cilTerminal', 'cilTerrain', 'cilTextShapes', 'cilTextSize', 'cilTextSquare', 'cilTextStrike', 'cilText', 'cilThumbDown', 'cilThumbUp', 'cilToggleOff', 'cilToggleOn', 'cilToilet', 'cilTouchApp', 'cilTransfer', 'cilTranslate', 'cilTrash', 'cilTriangle', 'cilTruck', 'cilTv', 'cilUnderline', 'cilUsb', 'cilUserFemale', 'cilUserFollow', 'cilUserPlus', 'cilUserUnfollow', 'cilUserX', 'cilUser', 'cilVector', 'cilVerticalAlignBottom', 'cilVerticalAlignCenter', 'cilVerticalAlignTop', 'cilVideo', 'cilVideogame', 'cilViewColumn', 'cilViewModule', 'cilViewQuilt', 'cilViewStream', 'cilVoiceOverRecord', 'cilVoice', 'cilVolumeHigh', 'cilVolumeLow', 'cilVolumeOff', 'cilWalk', 'cilWallet', 'cilWallpaper', 'cilWarning', 'cilWatch', 'cilWc', 'cilWeightlifitng', 'cilWheelchair', 'cilWifiSignal0', 'cilWifiSignal1', 'cilWifiSignal2', 'cilWifiSignal3', 'cilWifiSignal4', 'cilWifiSignalOff', 'cilWindowMaximize', 'cilWindowMinimize', 'cilWindowRestore', 'cilWindow', 'cilWrapText', 'cilXCircle', 'cilX', 'cilYen', 'cilZoomIn', 'cilZoomOut', 'cilZoom']
-
-  const brandIcons = ['cib500px5', 'cib500px', 'cibAboutMe', 'cibAbstract', 'cibAcm', 'cibAddthis', 'cibAdguard', 'cibAdobeAcrobatReader', 'cibAdobeAfterEffects', 'cibAdobeAudition', 'cibAdobeCreativeCloud', 'cibAdobeDreamweaver', 'cibAdobeIllustrator', 'cibAdobeIndesign', 'cibAdobeLightroomClassic', 'cibAdobeLightroom', 'cibAdobePhotoshop', 'cibAdobePremiere', 'cibAdobeTypekit', 'cibAdobeXd', 'cibAdobe', 'cibAirbnb', 'cibAlgolia', 'cibAlipay', 'cibAllocine', 'cibAmazonAws', 'cibAmazonPay', 'cibAmazon', 'cibAmd', 'cibAmericanExpress', 'cibAnaconda', 'cibAnalogue', 'cibAndroidAlt', 'cibAndroid', 'cibAngellist', 'cibAngularUniversal', 'cibAngular', 'cibAnsible', 'cibApacheAirflow', 'cibApacheFlink', 'cibApacheSpark', 'cibApache', 'cibAppStoreIos', 'cibAppStore', 'cibAppleMusic', 'cibApplePay', 'cibApplePodcasts', 'cibApple', 'cibAppveyor', 'cibAral', 'cibArchLinux', 'cibArchiveOfOurOwn', 'cibArduino', 'cibArtstation', 'cibArxiv', 'cibAsana', 'cibAtAndT', 'cibAtlassian', 'cibAtom', 'cibAudible', 'cibAurelia', 'cibAuth0', 'cibAutomatic', 'cibAutotask', 'cibAventrix', 'cibAzureArtifacts', 'cibAzureDevops', 'cibAzurePipelines', 'cibBabel', 'cibBaidu', 'cibBamboo', 'cibBancontact', 'cibBandcamp', 'cibBasecamp', 'cibBathasu', 'cibBehance', 'cibBigCartel', 'cibBing', 'cibBit', 'cibBitbucket', 'cibBitcoin', 'cibBitdefender', 'cibBitly', 'cibBlackberry', 'cibBlender', 'cibBloggerB', 'cibBlogger', 'cibBluetoothB', 'cibBluetooth', 'cibBoeing', 'cibBoost', 'cibBootstrap', 'cibBower', 'cibBrandAi', 'cibBrave', 'cibBtc', 'cibBuddy', 'cibBuffer', 'cibBuyMeACoffee', 'cibBuysellads', 'cibBuzzfeed', 'cibC', 'cibCakephp', 'cibCampaignMonitor', 'cibCanva', 'cibCashapp', 'cibCassandra', 'cibCastro', 'cibCcAmazonPay', 'cibCcAmex', 'cibCcApplePay', 'cibCcDinersClub', 'cibCcDiscover', 'cibCcJcb', 'cibCcMastercard', 'cibCcPaypal', 'cibCcStripe', 'cibCcVisa', 'cibCentos', 'cibCevo', 'cibChase', 'cibChef', 'cibChromecast', 'cibCircle', 'cibCircleci', 'cibCirrusci', 'cibCisco', 'cibCivicrm', 'cibClockify', 'cibClojure', 'cibCloudbees', 'cibCloudflare', 'cibCmake', 'cibCoOp', 'cibCodacy', 'cibCodeClimate', 'cibCodecademy', 'cibCodecov', 'cibCodeigniter', 'cibCodepen', 'cibCoderwall', 'cibCodesandbox', 'cibCodeship', 'cibCodewars', 'cibCodio', 'cibCoffeescript', 'cibCommonWorkflowLanguage', 'cibComposer', 'cibCondaForge', 'cibConekta', 'cibConfluence', 'cibCoreuiC', 'cibCoreui', 'cibCoursera', 'cibCoveralls', 'cibCpanel', 'cibCplusplus', 'cibCreativeCommonsBy', 'cibCreativeCommonsNcEu', 'cibCreativeCommonsNcJp', 'cibCreativeCommonsNc', 'cibCreativeCommonsNd', 'cibCreativeCommonsPdAlt', 'cibCreativeCommonsPd', 'cibCreativeCommonsRemix', 'cibCreativeCommonsSa', 'cibCreativeCommonsSamplingPlus', 'cibCreativeCommonsSampling', 'cibCreativeCommonsShare', 'cibCreativeCommonsZero', 'cibCreativeCommons', 'cibCrunchbase', 'cibCrunchyroll', 'cibCss3Shiled', 'cibCss3', 'cibCsswizardry', 'cibD3Js', 'cibDailymotion', 'cibDashlane', 'cibDazn', 'cibDblp', 'cibDebian', 'cibDeepin', 'cibDeezer', 'cibDelicious', 'cibDell', 'cibDeno', 'cibDependabot', 'cibDesignerNews', 'cibDevTo', 'cibDeviantart', 'cibDevrant', 'cibDiaspora', 'cibDigg', 'cibDigitalOcean', 'cibDiscord', 'cibDiscourse', 'cibDiscover', 'cibDisqus', 'cibDisroot', 'cibDjango', 'cibDocker', 'cibDocusign', 'cibDotNet', 'cibDraugiemLv', 'cibDribbble', 'cibDrone', 'cibDropbox', 'cibDrupal', 'cibDtube', 'cibDuckduckgo', 'cibDynatrace', 'cibEbay', 'cibEclipseide', 'cibElasticCloud', 'cibElasticSearch', 'cibElasticStack', 'cibElastic', 'cibElectron', 'cibElementary', 'cibEleventy', 'cibEllo', 'cibElsevier', 'cibEmlakjet', 'cibEmpirekred', 'cibEnvato', 'cibEpicGames', 'cibEpson', 'cibEsea', 'cibEslint', 'cibEthereum', 'cibEtsy', 'cibEventStore', 'cibEventbrite', 'cibEvernote', 'cibEverplaces', 'cibEvry', 'cibExercism', 'cibExpertsExchange', 'cibExpo', 'cibEyeem', 'cibFSecure', 'cibFacebookF', 'cibFacebook', 'cibFaceit', 'cibFandango', 'cibFavro', 'cibFeathub', 'cibFedex', 'cibFedora', 'cibFeedly', 'cibFidoAlliance', 'cibFigma', 'cibFilezilla', 'cibFirebase', 'cibFitbit', 'cibFlask', 'cibFlattr', 'cibFlickr', 'cibFlipboard', 'cibFlutter', 'cibFnac', 'cibFoursquare', 'cibFramer', 'cibFreebsd', 'cibFreecodecamp', 'cibFurAffinity', 'cibFurryNetwork', 'cibGarmin', 'cibGatsby', 'cibGauges', 'cibGenius', 'cibGentoo', 'cibGeocaching', 'cibGerrit', 'cibGg', 'cibGhost', 'cibGimp', 'cibGit', 'cibGitea', 'cibGithub', 'cibGitkraken', 'cibGitlab', 'cibGitpod', 'cibGitter', 'cibGlassdoor', 'cibGlitch', 'cibGmail', 'cibGnuPrivacyGuard', 'cibGnuSocial', 'cibGnu', 'cibGo', 'cibGodotEngine', 'cibGogCom', 'cibGoldenline', 'cibGoodreads', 'cibGoogleAds', 'cibGoogleAllo', 'cibGoogleAnalytics', 'cibGoogleChrome', 'cibGoogleCloud', 'cibGoogleKeep', 'cibGooglePay', 'cibGooglePlay', 'cibGooglePodcasts', 'cibGoogle', 'cibGooglesCholar', 'cibGovUk', 'cibGradle', 'cibGrafana', 'cibGraphcool', 'cibGraphql', 'cibGrav', 'cibGravatar', 'cibGreenkeeper', 'cibGreensock', 'cibGroovy', 'cibGroupon', 'cibGrunt', 'cibGulp', 'cibGumroad', 'cibGumtree', 'cibHabr', 'cibHackaday', 'cibHackerearth', 'cibHackerone', 'cibHackerrank', 'cibHackhands', 'cibHackster', 'cibHappycow', 'cibHashnode', 'cibHaskell', 'cibHatenaBookmark', 'cibHaxe', 'cibHelm', 'cibHere', 'cibHeroku', 'cibHexo', 'cibHighly', 'cibHipchat', 'cibHitachi', 'cibHockeyapp', 'cibHomify', 'cibHootsuite', 'cibHotjar', 'cibHouzz', 'cibHp', 'cibHtml5Shield', 'cibHtml5', 'cibHtmlacademy', 'cibHuawei', 'cibHubspot', 'cibHulu', 'cibHumbleBundle', 'cibIata', 'cibIbm', 'cibIcloud', 'cibIconjar', 'cibIcq', 'cibIdeal', 'cibIfixit', 'cibImdb', 'cibIndeed', 'cibInkscape', 'cibInstacart', 'cibInstagram', 'cibInstapaper', 'cibIntel', 'cibIntellijidea', 'cibIntercom', 'cibInternetExplorer', 'cibInvision', 'cibIonic', 'cibIssuu', 'cibItchIo', 'cibJabber', 'cibJava', 'cibJavascript', 'cibJekyll', 'cibJenkins', 'cibJest', 'cibJet', 'cibJetbrains', 'cibJira', 'cibJoomla', 'cibJquery', 'cibJs', 'cibJsdelivr', 'cibJsfiddle', 'cibJson', 'cibJupyter', 'cibJustgiving', 'cibKaggle', 'cibKaios', 'cibKaspersky', 'cibKentico', 'cibKeras', 'cibKeybase', 'cibKeycdn', 'cibKhanAcademy', 'cibKibana', 'cibKickstarter', 'cibKik', 'cibKirby', 'cibKlout', 'cibKnown', 'cibKoFi', 'cibKodi', 'cibKoding', 'cibKotlin', 'cibKrita', 'cibKubernetes', 'cibLanyrd', 'cibLaravelHorizon', 'cibLaravelNova', 'cibLaravel', 'cibLastFm', 'cibLatex', 'cibLaunchpad', 'cibLeetcode', 'cibLenovo', 'cibLess', 'cibLetsEncrypt', 'cibLetterboxd', 'cibLgtm', 'cibLiberapay', 'cibLibrarything', 'cibLibreoffice', 'cibLine', 'cibLinkedinIn', 'cibLinkedin', 'cibLinuxFoundation', 'cibLinuxMint', 'cibLinux', 'cibLivejournal', 'cibLivestream', 'cibLogstash', 'cibLua', 'cibLumen', 'cibLyft', 'cibMacys', 'cibMagento', 'cibMagisk', 'cibMailRu', 'cibMailchimp', 'cibMakerbot', 'cibManjaro', 'cibMarkdown', 'cibMarketo', 'cibMastercard', 'cibMastodon', 'cibMaterialDesign', 'cibMathworks', 'cibMatrix', 'cibMattermost', 'cibMatternet', 'cibMaxcdn', 'cibMcafee', 'cibMediaTemple', 'cibMediafire', 'cibMediumM', 'cibMedium', 'cibMeetup', 'cibMega', 'cibMendeley', 'cibMessenger', 'cibMeteor', 'cibMicroBlog', 'cibMicrogenetics', 'cibMicrosoftEdge', 'cibMicrosoft', 'cibMinetest', 'cibMinutemailer', 'cibMix', 'cibMixcloud', 'cibMixer', 'cibMojang', 'cibMonero', 'cibMongodb', 'cibMonkeytie', 'cibMonogram', 'cibMonzo', 'cibMoo', 'cibMozillaFirefox', 'cibMozilla', 'cibMusescore', 'cibMxlinux', 'cibMyspace', 'cibMysql', 'cibNativescript', 'cibNec', 'cibNeo4J', 'cibNetflix', 'cibNetlify', 'cibNextJs', 'cibNextcloud', 'cibNextdoor', 'cibNginx', 'cibNim', 'cibNintendo3Ds', 'cibNintendoGamecube', 'cibNintendoSwitch', 'cibNintendo', 'cibNodeJs', 'cibNodeRed', 'cibNodemon', 'cibNokia', 'cibNotion', 'cibNpm', 'cibNucleo', 'cibNuget', 'cibNuxtJs', 'cibNvidia', 'cibOcaml', 'cibOctave', 'cibOctopusDeploy', 'cibOculus', 'cibOdnoklassniki', 'cibOpenAccess', 'cibOpenCollective', 'cibOpenId', 'cibOpenSourceInitiative', 'cibOpenstreetmap', 'cibOpensuse', 'cibOpenvpn', 'cibOpera', 'cibOpsgenie', 'cibOracle', 'cibOrcid', 'cibOrigin', 'cibOsi', 'cibOsmc', 'cibOvercast', 'cibOverleaf', 'cibOvh', 'cibPagekit', 'cibPalantir', 'cibPandora', 'cibPantheon', 'cibPatreon', 'cibPaypal', 'cibPeriscope', 'cibPhp', 'cibPicartoTv', 'cibPinboard', 'cibPingdom', 'cibPingup', 'cibPinterestP', 'cibPinterest', 'cibPivotaltracker', 'cibPlangrid', 'cibPlayerMe', 'cibPlayerfm', 'cibPlaystation', 'cibPlaystation3', 'cibPlaystation4', 'cibPlesk', 'cibPlex', 'cibPluralsight', 'cibPlurk', 'cibPocket', 'cibPostgresql', 'cibPostman', 'cibPostwoman', 'cibPowershell', 'cibPrettier', 'cibPrismic', 'cibProbot', 'cibProcesswire', 'cibProductHunt', 'cibProtoIo', 'cibProtonmail', 'cibProxmox', 'cibPypi', 'cibPython', 'cibPytorch', 'cibQgis', 'cibQiita', 'cibQq', 'cibQualcomm', 'cibQuantcast', 'cibQuantopian', 'cibQuarkus', 'cibQuora', 'cibQwiklabs', 'cibQzone', 'cibR', 'cibRadiopublic', 'cibRails', 'cibRaspberryPi', 'cibReact', 'cibReadTheDocs', 'cibReadme', 'cibRealm', 'cibReason', 'cibRedbubble', 'cibRedditAlt', 'cibReddit', 'cibRedhat', 'cibRedis', 'cibRedux', 'cibRenren', 'cibReverbnation', 'cibRiot', 'cibRipple', 'cibRiseup', 'cibRollupJs', 'cibRoots', 'cibRoundcube', 'cibRss', 'cibRstudio', 'cibRuby', 'cibRubygems', 'cibRunkeeper', 'cibRust', 'cibSafari', 'cibSahibinden', 'cibSalesforce', 'cibSaltstack', 'cibSamsungPay', 'cibSamsung', 'cibSap', 'cibSassAlt', 'cibSass', 'cibSaucelabs', 'cibScala', 'cibScaleway', 'cibScribd', 'cibScrutinizerci', 'cibSeagate', 'cibSega', 'cibSellfy', 'cibSemaphoreci', 'cibSensu', 'cibSentry', 'cibServerFault', 'cibShazam', 'cibShell', 'cibShopify', 'cibShowpad', 'cibSiemens', 'cibSignal', 'cibSinaWeibo', 'cibSitepoint', 'cibSketch', 'cibSkillshare', 'cibSkyliner', 'cibSkype', 'cibSlack', 'cibSlashdot', 'cibSlickpic', 'cibSlides', 'cibSlideshare', 'cibSmashingmagazine', 'cibSnapchat', 'cibSnapcraft', 'cibSnyk', 'cibSociety6', 'cibSocketIo', 'cibSogou', 'cibSolus', 'cibSongkick', 'cibSonos', 'cibSoundcloud', 'cibSourceforge', 'cibSourcegraph', 'cibSpacemacs', 'cibSpacex', 'cibSparkfun', 'cibSparkpost', 'cibSpdx', 'cibSpeakerDeck', 'cibSpectrum', 'cibSpotify', 'cibSpotlight', 'cibSpreaker', 'cibSpring', 'cibSprint', 'cibSquarespace', 'cibStackbit', 'cibStackexchange', 'cibStackoverflow', 'cibStackpath', 'cibStackshare', 'cibStadia', 'cibStatamic', 'cibStaticman', 'cibStatuspage', 'cibSteam', 'cibSteem', 'cibSteemit', 'cibStitcher', 'cibStorify', 'cibStorybook', 'cibStrapi', 'cibStrava', 'cibStripeS', 'cibStripe', 'cibStubhub', 'cibStumbleupon', 'cibStyleshare', 'cibStylus', 'cibSublimeText', 'cibSubversion', 'cibSuperuser', 'cibSvelte', 'cibSvg', 'cibSwagger', 'cibSwarm', 'cibSwift', 'cibSymantec', 'cibSymfony', 'cibSynology', 'cibTMobile', 'cibTableau', 'cibTails', 'cibTapas', 'cibTeamviewer', 'cibTed', 'cibTeespring', 'cibTelegramPlane', 'cibTelegram', 'cibTencentQq', 'cibTencentWeibo', 'cibTensorflow', 'cibTerraform', 'cibTesla', 'cibTheMighty', 'cibTheMovieDatabase', 'cibTidal', 'cibTiktok', 'cibTinder', 'cibTodoist', 'cibToggl', 'cibTopcoder', 'cibToptal', 'cibTor', 'cibToshiba', 'cibTrainerroad', 'cibTrakt', 'cibTravisci', 'cibTreehouse', 'cibTrello', 'cibTripadvisor', 'cibTrulia', 'cibTumblr', 'cibTwilio', 'cibTwitch', 'cibTwitter', 'cibTwoo', 'cibTypescript', 'cibTypo3', 'cibUber', 'cibUbisoft', 'cibUblockOrigin', 'cibUbuntu', 'cibUdacity', 'cibUdemy', 'cibUikit', 'cibUmbraco', 'cibUnity', 'cibUnrealEngine', 'cibUnsplash', 'cibUntappd', 'cibUpwork', 'cibUsb', 'cibV8', 'cibVagrant', 'cibVenmo', 'cibVerizon', 'cibViadeo', 'cibViber', 'cibVim', 'cibVimeoV', 'cibVimeo', 'cibVine', 'cibVirb', 'cibVisa', 'cibVisualStudioCode', 'cibVisualStudio', 'cibVk', 'cibVlc', 'cibVsco', 'cibVueJs', 'cibWattpad', 'cibWeasyl', 'cibWebcomponentsOrg', 'cibWebpack', 'cibWebstorm', 'cibWechat', 'cibWhatsapp', 'cibWhenIWork', 'cibWii', 'cibWiiu', 'cibWikipedia', 'cibWindows', 'cibWire', 'cibWireguard', 'cibWix', 'cibWolframLanguage', 'cibWolframMathematica', 'cibWolfram', 'cibWordpress', 'cibWpengine', 'cibXPack', 'cibXbox', 'cibXcode', 'cibXero', 'cibXiaomi', 'cibXing', 'cibXrp', 'cibXsplit', 'cibYCombinator', 'cibYahoo', 'cibYammer', 'cibYandex', 'cibYarn', 'cibYelp', 'cibYoutube', 'cibZalando', 'cibZapier', 'cibZeit', 'cibZendesk', 'cibZerply', 'cibZillow', 'cibZingat', 'cibZoom', 'cibZorin', 'cibZulip']
-    
-  const flagIcons = ['cifAd', 'cifAe', 'cifAf', 'cifAg', 'cifAl', 'cifAm', 'cifAo', 'cifAr', 'cifAt', 'cifAu', 'cifAz', 'cifBa', 'cifBb', 'cifBd', 'cifBe', 'cifBf', 'cifBg', 'cifBh', 'cifBi', 'cifBj', 'cifBn', 'cifBo', 'cifBr', 'cifBs', 'cifBt', 'cifBw', 'cifBy', 'cifBz', 'cifCa', 'cifCd', 'cifCf', 'cifCg', 'cifCh', 'cifCi', 'cifCl', 'cifCm', 'cifCn', 'cifCo', 'cifCr', 'cifCu', 'cifCv', 'cifCy', 'cifCz', 'cifDe', 'cifDj', 'cifDk', 'cifDm', 'cifDo', 'cifDz', 'cifEc', 'cifEe', 'cifEg', 'cifEr', 'cifEs', 'cifEt', 'cifFi', 'cifFj', 'cifFm', 'cifFr', 'cifGa', 'cifGb', 'cifGd', 'cifGe', 'cifGh', 'cifGm', 'cifGn', 'cifGq', 'cifGr', 'cifGt', 'cifGw', 'cifGy', 'cifHk', 'cifHn', 'cifHr', 'cifHt', 'cifHu', 'cifId', 'cifIe', 'cifIl', 'cifIn', 'cifIq', 'cifIr', 'cifIs', 'cifIt', 'cifJm', 'cifJo', 'cifJp', 'cifKe', 'cifKg', 'cifKh', 'cifKi', 'cifKm', 'cifKn', 'cifKp', 'cifKr', 'cifKw', 'cifKz', 'cifLa', 'cifLb', 'cifLc', 'cifLi', 'cifLk', 'cifLr', 'cifLs', 'cifLt', 'cifLu', 'cifLv', 'cifLy', 'cifMa', 'cifMc', 'cifMd', 'cifMe', 'cifMg', 'cifMh', 'cifMk', 'cifMl', 'cifMm', 'cifMn', 'cifMr', 'cifMt', 'cifMu', 'cifMv', 'cifMw', 'cifMx', 'cifMy', 'cifMz', 'cifNa', 'cifNe', 'cifNg', 'cifNi', 'cifNl', 'cifNo', 'cifNp', 'cifNr', 'cifNu', 'cifNz', 'cifOm', 'cifPa', 'cifPe', 'cifPg', 'cifPh', 'cifPk', 'cifPl', 'cifPt', 'cifPw', 'cifPy', 'cifQa', 'cifRo', 'cifRs', 'cifRu', 'cifRw', 'cifSa', 'cifSb', 'cifSc', 'cifSd', 'cifSe', 'cifSg', 'cifSi', 'cifSk', 'cifSl', 'cifSm', 'cifSn', 'cifSo', 'cifSr', 'cifSs', 'cifSt', 'cifSv', 'cifSy', 'cifSz', 'cifTd', 'cifTg', 'cifTh', 'cifTj', 'cifTl', 'cifTm', 'cifTn', 'cifTo', 'cifTr', 'cifTt', 'cifTv', 'cifTw', 'cifTz', 'cifUa', 'cifUg', 'cifUs', 'cifUy', 'cifUz', 'cifVa', 'cifVc', 'cifVe', 'cifVn', 'cifWs', 'cifXk', 'cifYe', 'cifZa', 'cifZm', 'cifZw']
-
-  const tabPaneActiveKey = ref(1)
-</script> 
\ No newline at end of file
diff --git a/packages/docs/components/image.md b/packages/docs/components/image.md
deleted file mode 100644
index bce4f578..00000000
--- a/packages/docs/components/image.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-title: Vue Image Component
-name: Image
-description: Vue image component with responsive behavior (so it's never become larger than their parent element) and special styles.
-other_frameworks: image
----
-
-## Responsive images
-
-Images in CoreUI for Vue.js are made responsive with `fluid` property. This applies `max-width: 100%;` and `height: auto;` to the image so that it scales with the parent element.
-
-::: demo
-<CImage fluid :src="$withBase('/images/vue.jpg')" />
-:::
-```vue
-<CImage fluid src="/images/vue.jpg" />
-```
-
-## Image thumbnails
-
-In addition to our [border-radius utilities](https://coreui.io/docs/4.0/utilities/borders), you can use prop`thumbnail` to give an image a rounded 1px border appearance.
-
-::: demo
-<CImage rounded thumbnail :src="$withBase('/images/vue400.jpg')" width="200" height="200"/>
-:::
-```vue
-<CImage rounded thumbnail src="/images/vue400.jpg" width="200" height="200"/>
-```
-
-## Aligning images
-
-Align images with the `align` property.
-
-::: demo
-<div class="clearfix">
-  <CImage align="start" rounded :src="$withBase('/images/vue400.jpg')" width="200" height="200"/>
-  <CImage align="end" rounded :src="$withBase('/images/vue400.jpg')" width="200" height="200"/>
-</div>
-:::
-```vue
-<div class="clearfix">
-  <CImage align="start" rounded src="/images/vue400.jpg" width="200" height="200"/>
-  <CImage align="end" rounded src="/images/vue400.jpg" width="200" height="200"/>
-</div>
-```
-
-::: demo
-<div class="clearfix">
-  <CImage align="center" rounded :src="$withBase('/images/vue400.jpg')" width="200" height="200"/>
-</div>
-:::
-```vue
-<div class="clearfix">
-  <CImage align="center" rounded src="/images/vue400.jpg" width="200" height="200"/>
-</div>
-```
-
-::: demo
-<div class="text-center">
-  <CImage rounded :src="$withBase('/images/vue400.jpg')" width="200" height="200"/>
-</div>
-:::
-```vue
-<div class="text-center">
-  <CImage rounded src="/images/vue400.jpg" width="200" height="200"/>
-</div>
-```
-
-
-## API
-
-!!!include(./api/image/CImage.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/link.md b/packages/docs/components/link.md
deleted file mode 100644
index 69c3c3e8..00000000
--- a/packages/docs/components/link.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: CLink
-description: 
----
-
-## Examples
-
-<CLink href="#" >CLink</CLink>
-
-```vue
-
-<CLink href="#" >CLink</CLink>
-
-```
-
-
-
-## Additional content
\ No newline at end of file
diff --git a/packages/docs/components/list-group.md b/packages/docs/components/list-group.md
deleted file mode 100644
index f7525f5c..00000000
--- a/packages/docs/components/list-group.md
+++ /dev/null
@@ -1,351 +0,0 @@
----
-title: Vue List Group Component
-name: List group
-description: Vue List Group component allows displaying a series of content. Learn how to use Vue list group to build complex list structure on your website.
-other_frameworks: list-group
----
-
-## Basic example
-
-The default list group is an unordered list with items and the proper CSS classes. Build upon it with the options that follow, or with your CSS as required.
-
-::: demo
-<CListGroup>
-  <CListGroupItem>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-```
-
-## Active items
-
-Add `active` boolean property to a `<CListGroupItem>` to show the current active selection.
-
-::: demo
-<CListGroup>
-  <CListGroupItem active>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem active>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-```
-
-## Disabled items
-
-Add `disabled` boolean property to a `<CListGroupItem>` to make it appear disabled.
-
-::: demo
-<CListGroup>
-  <CListGroupItem disabled>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem disabled>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-```
-
-## Links and buttons
-
-Use `<a>`s or `<button>`s to create _actionable_ list group items with hover, disabled, and active states by adding `as="a|button"`. 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.
-
-::: demo
-<CListGroup>
-  <CListGroupItem as="a" href="#" active>Cras justo odio</CListGroupItem>
-  <CListGroupItem as="a" href="#">Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem as="a" href="#">Morbi leo risus</CListGroupItem>
-  <CListGroupItem as="a" href="#">Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem as="a" href="#" disabled>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem as="a" href="#" active>Cras justo odio</CListGroupItem>
-  <CListGroupItem as="a" href="#">Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem as="a" href="#">Morbi leo risus</CListGroupItem>
-  <CListGroupItem as="a" href="#">Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem as="a" href="#" disabled>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-```
-
-::: demo
-<CListGroup>
-  <CListGroupItem as="button" active>Cras justo odio</CListGroupItem>
-  <CListGroupItem as="button">Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem as="button">Morbi leo risus</CListGroupItem>
-  <CListGroupItem as="button">Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem as="button" disabled>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem as="button" active>Cras justo odio</CListGroupItem>
-  <CListGroupItem as="button">Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem as="button">Morbi leo risus</CListGroupItem>
-  <CListGroupItem as="button">Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem as="button" disabled>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-```
-
-## Flush
-
-Add `flush` boolean property to remove some borders and rounded corners to render list group items edge-to-edge in a parent container (e.g., cards).
-
-::: demo
-<CListGroup flush>
-  <CListGroupItem>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup flush>
-  <CListGroupItem>Cras justo odio</CListGroupItem>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem>Morbi leo risus</CListGroupItem>
-  <CListGroupItem>Porta ac consectetur ac</CListGroupItem>
-  <CListGroupItem>Vestibulum at eros</CListGroupItem>
-</CListGroup>
-```
-
-## Horizontal
-
-Add `layout="horizontal"` to change the layout of list group items from vertical to horizontal across all breakpoints. Alternatively, choose a responsive variant `.layout="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.**
-
-::: demo
-<template v-for="(item) in ['', '-sm', '-md', '-lg', '-xl', '-xxl']">
-  <CListGroup class="mb-2" :layout="'horizontal' + item">
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Morbi leo risus</CListGroupItem>
-  </CListGroup>
-</template>
-:::
-```vue
-<template v-for="(item) in ['', '-sm', '-md', '-lg', '-xl', '-xxl']">
-  <CListGroup class="mb-2" :layout="'horizontal' + item">
-    <CListGroupItem>Cras justo odio</CListGroupItem>
-    <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-    <CListGroupItem>Morbi leo risus</CListGroupItem>
-  </CListGroup>
-</template>
-```
-
-## Contextual classes
-
-Use contextual classes to style list items with a stateful background and color.
-
-::: demo
-<CListGroup>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem v-for="(item) in ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark']" :color="item">A simple {{item}} list group item</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem>Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem v-for="(item) in ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark']" :color="item">A simple {{item}} list group item</CListGroupItem>
-</CListGroup>
-```
-
-Contextual classes also work with `<a>`s or `<button>`s. 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.
-
-::: demo
-<CListGroup>
-  <CListGroupItem as="a" href="#">Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem v-for="(item) in ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark']" as="a" href="#" :color="item">A simple {{item}} list group item</CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem as="a" href="#">Dapibus ac facilisis in</CListGroupItem>
-  <CListGroupItem v-for="(item) in ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark']" as="a" href="#" :color="item">A simple {{item}} list group item</CListGroupItem>
-</CListGroup>
-```
-
-<Callout color="info" title="Conveying meaning to assistive technologies">
-  Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (e.g. the visible text), or is included through alternative means, such as additional text hidden with the <code>.visually-hidden</code> class.
-</Callout>
-
-## With badges
-
-Add badges to any list group item to show unread counts, activity, and more.
-
-::: demo
-<CListGroup>
-  <CListGroupItem class="d-flex justify-content-between align-items-center">Cras justo odio<CBadge color="primary" shape="rounded-pill">14</CBadge></CListGroupItem>
-  <CListGroupItem class="d-flex justify-content-between align-items-center">Dapibus ac facilisis in<CBadge color="primary" shape="rounded-pill">2</CBadge></CListGroupItem>
-  <CListGroupItem class="d-flex justify-content-between align-items-center">Morbi leo risus<CBadge color="primary" shape="rounded-pill">1</CBadge></CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem class="d-flex justify-content-between align-items-center">Cras justo odio<CBadge color="primary" shape="rounded-pill">14</CBadge></CListGroupItem>
-  <CListGroupItem class="d-flex justify-content-between align-items-center">Dapibus ac facilisis in<CBadge color="primary" shape="rounded-pill">2</CBadge></CListGroupItem>
-  <CListGroupItem class="d-flex justify-content-between align-items-center">Morbi leo risus<CBadge color="primary" shape="rounded-pill">1</CBadge></CListGroupItem>
-</CListGroup>
-```
-
-## Custom content
-
-Add nearly any HTML within, even for linked list groups like the one below, with the help of [flexbox utilities](https://coreui.io/docs/utilities/flex/).
-
-::: demo
-<CListGroup>
-  <CListGroupItem as="a" href="#" active>
-    <div class="d-flex w-100 justify-content-between">
-    <h5 class="mb-1">List group item heading</h5>
-      <small>3 days ago</small>
-    </div>
-    <p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
-    <small>Donec id elit non mi porta.</small>
-  </CListGroupItem>
-  <CListGroupItem as="a" href="#">
-    <div class="d-flex w-100 justify-content-between">
-    <h5 class="mb-1">List group item heading</h5>
-      <small class="text-body-secondary">3 days ago</small>
-    </div>
-    <p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
-    <small class="text-body-secondary">Donec id elit non mi porta.</small>
-  </CListGroupItem>
-  <CListGroupItem as="a" href="#">
-    <div class="d-flex w-100 justify-content-between">
-    <h5 class="mb-1">List group item heading</h5>
-      <small class="text-body-secondary">3 days ago</small>
-    </div>
-    <p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
-    <small class="text-body-secondary">Donec id elit non mi porta.</small>
-  </CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem as="a" href="#" active>
-    <div class="d-flex w-100 justify-content-between">
-    <h5 class="mb-1">List group item heading</h5>
-      <small>3 days ago</small>
-    </div>
-    <p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
-    <small>Donec id elit non mi porta.</small>
-  </CListGroupItem>
-  <CListGroupItem as="a" href="#">
-    <div class="d-flex w-100 justify-content-between">
-    <h5 class="mb-1">List group item heading</h5>
-      <small class="text-body-secondary">3 days ago</small>
-    </div>
-    <p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
-    <small class="text-body-secondary">Donec id elit non mi porta.</small>
-  </CListGroupItem>
-  <CListGroupItem as="a" href="#">
-    <div class="d-flex w-100 justify-content-between">
-    <h5 class="mb-1">List group item heading</h5>
-      <small class="text-body-secondary">3 days ago</small>
-    </div>
-    <p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
-    <small class="text-body-secondary">Donec id elit non mi porta.</small>
-  </CListGroupItem>
-</CListGroup>
-```
-
-## Checkboxes and radios
-
-Place CoreUI's checkboxes and radios within list group items and customize as needed.
-
-::: demo
-<CListGroup>
-  <CListGroupItem><CFormCheck label="Cras justo odio"/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="Dapibus ac facilisis in" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="Morbi leo risus" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="orta ac consectetur ac"/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="Vestibulum at eros"/></CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem><CFormCheck label="Cras justo odio"/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="Dapibus ac facilisis in" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="Morbi leo risus" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="orta ac consectetur ac"/></CListGroupItem>
-  <CListGroupItem><CFormCheck label="Vestibulum at eros"/></CListGroupItem>
-</CListGroup>
-```
-
-And if you want `<label>`s as the `.list-group-item` for large hit areas, you can do that, too.
-
-::: demo
-<CListGroup>
-  <CListGroupItem><CFormCheck hitArea="full" label="Cras justo odio"/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="Dapibus ac facilisis in" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="Morbi leo risus" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="orta ac consectetur ac"/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="Vestibulum at eros"/></CListGroupItem>
-</CListGroup>
-:::
-```vue
-<CListGroup>
-  <CListGroupItem><CFormCheck hitArea="full" label="Cras justo odio"/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="Dapibus ac facilisis in" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="Morbi leo risus" checked/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="orta ac consectetur ac"/></CListGroupItem>
-  <CListGroupItem><CFormCheck hitArea="full" label="Vestibulum at eros"/></CListGroupItem>
-</CListGroup>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue list groups 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.
-
-<ScssDocs file="_list-group.scss" capture="list-group-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CListGroup :style="vars">...</CListGroup>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="list-group-variables"/>
-
-## API
-
-!!!include(./api/list-group/CListGroup.api.md)!!!
-
-!!!include(./api/list-group/CListGroupItem.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/modal.md b/packages/docs/components/modal.md
deleted file mode 100644
index 07e19ad8..00000000
--- a/packages/docs/components/modal.md
+++ /dev/null
@@ -1,1265 +0,0 @@
----
-title: Vue Modal Component
-name: Modal
-description: Vue Modal component offers a lightweight, multi-purpose popup to add dialogs to yours. Learn how to customize Vue CoreUI Modals easily. Multiple examples and tutorial.
-other_frameworks: modal
----
-
-## Examples
-
-### Modal components
-
-Below 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 actions whenever possible, or provide another explicit action.
-
-::: demo
-<CModal class="show d-block position-static" :backdrop="false" :keyboard="false" visible>
-  <CModalHeader>
-    <CModalTitle>Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>Modal body text goes here.</CModalBody>
-  <CModalFooter>
-    <CButton color="secondary">Close</CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-:::
-``` vue
-<CModal :backdrop="false" :keyboard="false" visible>
-  <CModalHeader>
-    <CModalTitle>Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>Modal body text goes here.</CModalBody>
-  <CModalFooter>
-    <CButton color="secondary">Close</CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-```
-
-
-### Live demo
-
-Toggle a working modal demo by clicking the button below. It will slide down and fade in from the top of the page.
-
-::: demo
-<CButton color="primary" @click="() => { visibleLiveDemo = true }">Launch demo modal</CButton>
-<CModal 
-  :visible="visibleLiveDemo"
-  @close="() => { visibleLiveDemo = false }"
-  aria-labelledby="LiveDemoExampleLabel"
->
-  <CModalHeader>
-    <CModalTitle id="LiveDemoExampleLabel">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>Woohoo, you're reading this text in a modal!</CModalBody>
-  <CModalFooter>
-    <CButton color="secondary" @click="() => { visibleLiveDemo = false }">
-      Close
-    </CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleLiveDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleLiveDemo = true }">Launch demo modal</CButton>
-  <CModal 
-    :visible="visibleLiveDemo"
-    @close="() => { visibleLiveDemo = false }"
-    aria-labelledby="LiveDemoExampleLabel"
-  >
-    <CModalHeader>
-      <CModalTitle id="LiveDemoExampleLabel">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>Woohoo, you're reading this text in a modal!</CModalBody>
-    <CModalFooter>
-      <CButton color="secondary" @click="() => { visibleLiveDemo = false }">
-        Close
-      </CButton>
-      <CButton color="primary">Save changes</CButton>
-    </CModalFooter>
-  </CModal>
-</template>
-```
-### Static backdrop
-
-If you set `backdrop` property to `static`, your modal will behave as though the backdrop is static, meaning it will not close when clicking outside it. Click the button below to try it.
-
-::: demo
-<CButton color="primary" @click="() => { visibleStaticBackdropDemo = true }">Launch static backdrop modal</CButton>
-<CModal 
-  backdrop="static"
-  :visible="visibleStaticBackdropDemo"
-  @close="() => { visibleStaticBackdropDemo = false }" 
-  aria-labelledby="StaticBackdropExampleLabel"
->
-  <CModalHeader>
-    <CModalTitle id="StaticBackdropExampleLabel">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>Woohoo, you're reading this text in a modal!</CModalBody>
-  <CModalFooter>
-    <CButton color="secondary" @click="() => { visibleStaticBackdropDemo = false }">
-      Close
-    </CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleStaticBackdropDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleStaticBackdropDemo = true }">Launch demo modal</CButton>
-  <CModal 
-    backdrop="static"
-    :visible="visibleStaticBackdropDemo"
-    @close="() => { visibleStaticBackdropDemo = false }" 
-    aria-labelledby="StaticBackdropExampleLabel"
-  >
-    <CModalHeader>
-      <CModalTitle id="StaticBackdropExampleLabel">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>Woohoo, you're reading this text in a modal!</CModalBody>
-    <CModalFooter>
-      <CButton color="secondary" @click="() => { visibleStaticBackdropDemo = false }">
-        Close
-      </CButton>
-      <CButton color="primary">Save changes</CButton>
-    </CModalFooter>
-  </CModal>
-</template>
-```
-
-### Scrolling long content
-
-When 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.
-
-::: demo
-<CButton color="primary" @click="() => { visibleScrollingLongContentDemo = true }">Launch static backdrop modal</CButton>
-<CModal 
-  :visible="visibleScrollingLongContentDemo"
-  @close="() => { visibleScrollingLongContentDemo = false }"
-  aria-labelledby="ScrollingLongContentExampleLabel"
->
-  <CModalHeader>
-   <CModalTitle id="ScrollingLongContentExampleLabel">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-  </CModalBody>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleScrollingLongContentDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleScrollingLongContentDemo = true }">Launch demo modal</CButton>
-  <CModal 
-    :visible="visibleScrollingLongContentDemo"
-    @close="() => { visibleScrollingLongContentDemo = false }"
-    aria-labelledby="ScrollingLongContentExampleLabel"
-  >
-    <CModalHeader>
-     <CModalTitle id="ScrollingLongContentExampleLabel">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-    </CModalBody>
-  </CModal>
-</template>
-```
-
-You can also create a scrollable modal that allows scroll the modal body by adding `scrollable` prop.
-
-::: demo
-<CButton color="primary" @click="() => { visibleScrollableDemo = true }">Launch static backdrop modal</CButton>
-<CModal
-  scrollable
-  :visible="visibleScrollableDemo"
-  @close="() => { visibleScrollableDemo = false }"
-  aria-labelledby="ScrollingLongContentExampleLabel2"
->
-  <CModalHeader>
-    <CModalTitle id="ScrollingLongContentExampleLabel2">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-    <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>
-    <p>
-      Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-      lacus vel augue laoreet rutrum faucibus dolor auctor.
-    </p>
-    <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>
-  </CModalBody>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleScrollableDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleScrollableDemo = true }">Launch demo modal</CButton>
-  <CModal
-    scrollable
-    :visible="visibleScrollableDemo"
-    @close="() => { visibleScrollableDemo = false }"
-    aria-labelledby="ScrollingLongContentExampleLabel2"
-  >
-    <CModalHeader>
-      <CModalTitle id="ScrollingLongContentExampleLabel2">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-      <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>
-      <p>
-        Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
-        lacus vel augue laoreet rutrum faucibus dolor auctor.
-      </p>
-      <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>
-    </CModalBody>
-  </CModal>
-</template>
-```
-
-### Vertically centered
-
-Add `alignment="center` to `<CModal>` to vertically center the modal.
-
-::: demo
-<CButton color="primary" @click="() => { visibleVerticallyCenteredDemo = true }">Vertically centered modal</CButton>
-<CModal
-  alignment="center"
-  :visible="visibleVerticallyCenteredDemo"
-  @close="() => { visibleVerticallyCenteredDemo = false }"
-  aria-labelledby="VerticallyCenteredExample"
->
-  <CModalHeader>
-    <CModalTitle id="VerticallyCenteredExample">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    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.
-  </CModalBody>
-  <CModalFooter>
-    <CButton color="secondary" @click="() => { visibleVerticallyCenteredDemo = false }">
-      Close
-    </CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleVerticallyCenteredDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleVerticallyCenteredDemo = true }">Launch demo modal</CButton>
-  <CModal
-    alignment="center"
-    :visible="visibleVerticallyCenteredDemo"
-    @close="() => { visibleVerticallyCenteredDemo = false }"
-    aria-labelledby="VerticallyCenteredExample"
-  >
-    <CModalHeader>
-      <CModalTitle id="VerticallyCenteredExample">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      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.
-    </CModalBody>
-    <CModalFooter>
-      <CButton color="secondary" @click="() => { visibleVerticallyCenteredDemo = false }">
-        Close
-      </CButton>
-      <CButton color="primary">Save changes</CButton>
-    </CModalFooter>
-  </CModal>
-</template>
-```
-
-::: demo
-<CButton color="primary" @click="() => { visibleVerticallyCenteredScrollableDemo = true }">Vertically centered scrollable modal</CButton>
-<CModal 
-  alignment="center"
-  scrollable
-  :visible="visibleVerticallyCenteredScrollableDemo"
-  @close="() => { visibleVerticallyCenteredScrollableDemo = false }"
-  aria-labelledby="VerticallyCenteredExample2"
->
-  <CModalHeader>
-    <CModalTitle id="VerticallyCenteredExample2">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    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.
-  </CModalBody>
-  <CModalFooter>
-    <CButton color="secondary" @click="() => { visibleVerticallyCenteredScrollableDemo = false }">
-      Close
-    </CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleVerticallyCenteredScrollableDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleVerticallyCenteredScrollableDemo = true }">Vertically centered scrollable modal</CButton>
-  <CModal 
-    alignment="center"
-    scrollable
-    :visible="visibleVerticallyCenteredScrollableDemo"
-    @close="() => { visibleVerticallyCenteredScrollableDemo = false }"
-    aria-labelledby="VerticallyCenteredExample2"
-  >
-    <CModalHeader>
-      <CModalTitle id="VerticallyCenteredExample2">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      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.
-    </CModalBody>
-    <CModalFooter>
-      <CButton color="secondary" @click="() => { visibleVerticallyCenteredScrollableDemo = false }">
-        Close
-      </CButton>
-      <CButton color="primary">Save changes</CButton>
-    </CModalFooter>
-  </CModal>
-</template>
-```
-
-### Tooltips and popovers
-
-`<CTooltips>` and `<CPopovers>` can be placed within modals as needed. When modals are closed, any tooltips and popovers within are also automaticallyed.
-
-::: demo
-<CButton color="primary" @click="() => { visibleTooltipsAndPopoversDemo = true }">Launch demo modal</CButton>
-<CModal
-  :visible="visibleTooltipsAndPopoversDemo"
-  @close="() => { visibleTooltipsAndPopoversDemo = false }"
-  aria-labelledby="TooltipsAndPopoverExample"
->
-  <CModalHeader>
-    <CModalTitle id="TooltipsAndPopoverExample">Modal title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    <h5>Popover in a modal</h5>
-    <p>This <CButton color="secondary" v-c-popover="{header: 'Popover title', content: 'Popover body content is set in this property.'}">button</CButton></p>
-    <hr/>
-    <h5>Tooltips in a modal</h5>
-    <p>
-      <CLink v-c-tooltip="'Tooltip'">This link</CLink> and <CLink v-c-tooltip="'Tooltip'">that link</CLink> have tooltips on hover.
-    </p>
-  </CModalBody>
-  <CModalFooter>
-    <CButton color="secondary" @click="() => { visibleTooltipsAndPopoversDemo = false }">
-      Close
-    </CButton>
-    <CButton color="primary">Save changes</CButton>
-  </CModalFooter>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleTooltipsAndPopoversDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleTooltipsAndPopoversDemo = true }">Launch demo modal</CButton>
-  <CModal
-    :visible="visibleTooltipsAndPopoversDemo"
-    @close="() => { visibleTooltipsAndPopoversDemo = false }"
-    aria-labelledby="TooltipsAndPopoverExample"
-  >
-    <CModalHeader>
-      <CModalTitle id="TooltipsAndPopoverExample">Modal title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      <h5>Popover in a modal</h5>
-      <p>This <CButton color="secondary" v-c-popover="{header: 'Popover title', content: 'Popover body content is set in this property.'}">button</CButton></p>
-      <hr/>
-      <h5>Tooltips in a modal</h5>
-      <p>
-        <CLink v-c-tooltip="'Tooltip'">This link</CLink> and <CLink v-c-tooltip="'Tooltip'">that link</CLink> have tooltips on hover.
-      </p>
-    </CModalBody>
-    <CModalFooter>
-      <CButton color="secondary" @click="() => { visibleTooltipsAndPopoversDemo = false }">
-        Close
-      </CButton>
-      <CButton color="primary">Save changes</CButton>
-    </CModalFooter>
-  </CModal>
-</template>
-```
-
-### Toggle between modals
-
-Toggle between multiple modals with some clever placement of the `visible` props. **Please note multiple modals cannot be opened at the same time** — this method simply toggles between two separate modals.
-
-::: demo
-<CButton color="primary" @click="() => { visibleToggleBetweenModalsDemo1 = true }">Open first modal</CButton>
-<CModal
-  :visible="visibleToggleBetweenModalsDemo1"
-  @close="() => { visibleToggleBetweenModalsDemo1 = false }"
-  aria-labelledby="ToggleBetweenModalsExample1"
->
-  <CModalHeader>
-    <CModalTitle id="ToggleBetweenModalsExample1">Modal 1 title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    <p>Show a second modal and hide this one with the button below.</p>
-  </CModalBody>
-  <CModalFooter>
-    <CButton 
-      color="primary"
-      @click="() => { 
-        visibleToggleBetweenModalsDemo1 = false
-        visibleToggleBetweenModalsDemo2 = true
-      }"
-    >Open second modal</CButton>
-  </CModalFooter>
-</CModal>
-<CModal
-  :visible="visibleToggleBetweenModalsDemo2"
-  @close="() => {
-    visibleToggleBetweenModalsDemo1 = true
-    visibleToggleBetweenModalsDemo2 = false
-  }"
-  aria-labelledby="ToggleBetweenModalsExample2"
->
-  <CModalHeader>
-    <CModalTitle id="ToggleBetweenModalsExample2">Modal 2 title</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    <p>Hide this modal and show the first with the button below.</p>
-  </CModalBody>
-  <CModalFooter>
-    <CButton 
-      color="primary"
-      @click="() => { 
-        visibleToggleBetweenModalsDemo1 = true
-        visibleToggleBetweenModalsDemo2 = false
-      }"
-    >Back to first</CButton>
-  </CModalFooter>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleToggleBetweenModalsDemo1 = ref(false)
-  const visibleToggleBetweenModalsDemo2 = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleToggleBetweenModalsDemo1 = true }">Open first modal</CButton>
-  <CModal
-    :visible="visibleToggleBetweenModalsDemo1"
-    @close="() => { visibleToggleBetweenModalsDemo1 = false }"
-    aria-labelledby="ToggleBetweenModalsExample1"
-  >
-    <CModalHeader>
-      <CModalTitle id="ToggleBetweenModalsExample1">Modal 1 title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      <p>Show a second modal and hide this one with the button below.</p>
-    </CModalBody>
-    <CModalFooter>
-      <CButton 
-        color="primary"
-        @click="() => { 
-          visibleToggleBetweenModalsDemo1 = false
-          visibleToggleBetweenModalsDemo2 = true
-        }"
-      >Open second modal</CButton>
-    </CModalFooter>
-  </CModal>
-  <CModal
-    :visible="visibleToggleBetweenModalsDemo2"
-    @close="() => {
-      visibleToggleBetweenModalsDemo1 = true
-      visibleToggleBetweenModalsDemo2 = false
-    }"
-    aria-labelledby="ToggleBetweenModalsExample2"
-  >
-    <CModalHeader>
-      <CModalTitle id="ToggleBetweenModalsExample2">Modal 2 title</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      <p>Hide this modal and show the first with the button below.</p>
-    </CModalBody>
-    <CModalFooter>
-      <CButton 
-        color="primary"
-        @click="() => { 
-          visibleToggleBetweenModalsDemo1 = true
-          visibleToggleBetweenModalsDemo2 = false
-        }"
-      >Back to first</CButton>
-    </CModalFooter>
-  </CModal>
-</template>
-```
-
-### Change animation
-
-The variable `$modal-fade-transform` determines the transform state of React Modal component before the modal fade-in animation, whereas the variable `$modal-show-transform` determines the transform state of Modal component after the modal fade-in animation.
-If you want a zoom-in animation, for example, set `$modal-fade-transform: scale(.8)`.
-
-### Remove animation
-
-For modals that simply appear rather than fade into view, set `transition` to `false`.
-
-```vue
-<CModal transition={false}>...</CModal>
-```
-
-### Accessibility
-
-Be sure to add `aria-labelledby="..."`, referencing the modal title, to `<CModal />` Additionally, you may give a description of your modal dialog with `aria-describedby` on `<CModal>`. Note that you don’t need to add `role="dialog` since we already add it.
-
-## Optional sizes
-
-Modals have three optional sizes, available via modifier classes to be placed on a `<CModal>`. These sizes kick in at certain breakpoints to avoid horizontal scrollbars on narrower viewports.
-
-<table class="table">
-  <thead>
-    <tr>
-      <th>Size</th>
-      <th>Property size</th>
-      <th>Modal max-width</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>Small</td>
-      <td><code>'sm'</code></td>
-      <td><code>300px</code></td>
-    </tr>
-    <tr>
-      <td>Default</td>
-      <td class="text-body-secondary">None</td>
-      <td><code>500px</code></td>
-    </tr>
-    <tr>
-      <td>Large</td>
-      <td><code>'lg'</code></td>
-      <td><code>800px</code></td>
-    </tr>
-    <tr>
-      <td>Extra large</td>
-      <td><code>'xl'</code></td>
-      <td><code>1140px</code></td>
-    </tr>
-  </tbody>
-</table>
-
-::: demo
-<CButton color="primary" @click="() => { xlDemo = true }">Extra large modal</CButton>
-<CButton color="primary" @click="() => { lgDemo = true }">Large modal</CButton>
-<CButton color="primary" @click="() => { smDemo = true }">Small modal</CButton>
-<CModal
-  size="xl"
-  :visible="xlDemo"
-  @close="() => { xlDemo = false }"
-  aria-labelledby="OptionalSizesExample1"
->
-  <CModalHeader>
-    <CModalTitle id="OptionalSizesExample1">Extra large modal</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal 
-  size="lg"
-  :visible="lgDemo"
-  @close="() => { lgDemo = false }"
-  aria-labelledby="OptionalSizesExample2"
->
-  <CModalHeader>
-    <CModalTitle id="OptionalSizesExample2">Large modal</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal
-  size="sm" 
-  :visible="smDemo" 
-  @close="() => { smDemo = false }"
-  aria-labelledby="OptionalSizesExample3"
->
-  <CModalHeader>
-    <CModalTitle id="OptionalSizesExample3">Small modal</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const xlDemo = ref(false)
-  const lgDemo = ref(false)
-  const smDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { xlDemo = true }">Extra large modal</CButton>
-  <CButton color="primary" @click="() => { lgDemo = true }">Large modal</CButton>
-  <CButton color="primary" @click="() => { smDemo = true }">Small modal</CButton>
-  <CModal
-    size="xl"
-    :visible="xlDemo"
-    @close="() => { xlDemo = false }"
-    aria-labelledby="OptionalSizesExample1"
-  >
-    <CModalHeader>
-      <CModalTitle id="OptionalSizesExample1">Extra large modal</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    size="lg"
-    :visible="lgDemo"
-    @close="() => { lgDemo = false }"
-    aria-labelledby="OptionalSizesExample2"
-  >
-  <CModalHeader>
-    <CModalTitle id="OptionalSizesExample2">Large modal</CModalTitle>
-  </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    size="sm" 
-    :visible="smDemo" 
-    @close="() => { smDemo = false }"
-    aria-labelledby="OptionalSizesExample3"
-  >
-    <CModalHeader>
-      <CModalTitle id="OptionalSizesExample3">Small modal</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-</template>
-```
-
-## Fullscreen Modal
-
-Another override is the option to pop up a modal that covers the user viewport, available via property `fullscreen`.
-
-<table class="table">
-  <thead>
-    <tr>
-      <th>Property fullscreen</th>
-      <th>Availability</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td><code>true</code></td>
-      <td>Always</td>
-    </tr>
-    <tr>
-      <td><code>'sm'</code></td>
-      <td>Below <code>576px</code></td>
-    </tr>
-    <tr>
-      <td><code>'md'</code></td>
-      <td>Below <code>768px</code></td>
-    </tr>
-    <tr>
-      <td><code>'lg'</code></td>
-      <td>Below <code>992px</code></td>
-    </tr>
-    <tr>
-      <td><code>'xl'</code></td>
-      <td>Below <code>1200px</code></td>
-    </tr>
-    <tr>
-      <td><code>'xxl'</code></td>
-      <td>Below <code>1400px</code></td>
-    </tr>
-  </tbody>
-</table>
-
-::: demo
-<CButton color="primary" @click="() => { fullscreenDemo = true }">Full screen</CButton>
-<CButton color="primary" @click="() => { fullscreenSmDemo = true }">Full screen below sm</CButton>
-<CButton color="primary" @click="() => { fullscreenMdDemo = true }">Full screen below md</CButton>
-<CButton color="primary" @click="() => { fullscreenLgDemo = true }">Full screen below lg</CButton>
-<CButton color="primary" @click="() => { fullscreenXlDemo = true }">Full screen below xl</CButton>
-<CButton color="primary" @click="() => { fullscreenXxlDemo = true }">Full screen below xxl</CButton>
-<CModal
-  fullscreen
-  :visible="fullscreenDemo"
-  @close="() => { fullscreenDemo = false }"
-  aria-labelledby="FullscreenExample1"
->
-  <CModalHeader>
-    <CModalTitle id="FullscreenExample1">Full screen</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal
-  fullscreen="sm"
-  :visible="fullscreenSmDemo"
-  @close="() => { fullscreenSmDemo = false }"
-  aria-labelledby="FullscreenExample2"
->
-  <CModalHeader>
-    <CModalTitle id="FullscreenExample2">Full screen below sm</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal
-  fullscreen="md"
-  :visible="fullscreenMdDemo"
-  @close="() => { fullscreenMdDemo = false }"
-  aria-labelledby="FullscreenExample3"
->
-  <CModalHeader>
-    <CModalTitle id="FullscreenExample3">Full screen below md</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal
-  fullscreen="lg"
-  :visible="fullscreenLgDemo"
-  @close="() => { fullscreenLgDemo = false }"
-  aria-labelledby="FullscreenExample4"
->
-  <CModalHeader>
-    <CModalTitle id="FullscreenExample4">Full screen below lg</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal
-  fullscreen="xl"
-  :visible="fullscreenXlDemo"
-  @close="() => { fullscreenXlDemo = false }"
-  aria-labelledby="FullscreenExample5"
->
-  <CModalHeader>
-    <CModalTitle id="FullscreenExample5">Full screen below xl</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-<CModal
-  fullscreen="xxl"
-  :visible="fullscreenXxlDemo"
-  @close="() => { fullscreenXxlDemo = false }"
-  aria-labelledby="FullscreenExample6"
->
-  <CModalHeader>
-    <CModalTitle id="FullscreenExample6">Full screen below xxl</CModalTitle>
-  </CModalHeader>
-  <CModalBody>
-    ...
-  </CModalBody>
-</CModal>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const fullscreenDemo = ref(false)
-  const fullscreenSmDemo = ref(false)
-  const fullscreenMdDemo = ref(false)
-  const fullscreenLgDemo = ref(false)
-  const fullscreenXlDemo = ref(false)
-  const fullscreenXxlDemo = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { fullscreenDemo = true }">Full screen</CButton>
-  <CButton color="primary" @click="() => { fullscreenSmDemo = true }">Full screen below sm</CButton>
-  <CButton color="primary" @click="() => { fullscreenMdDemo = true }">Full screen below md</CButton>
-  <CButton color="primary" @click="() => { fullscreenLgDemo = true }">Full screen below lg</CButton>
-  <CButton color="primary" @click="() => { fullscreenXlDemo = true }">Full screen below xl</CButton>
-  <CButton color="primary" @click="() => { fullscreenXxlDemo = true }">Full screen below xxl</CButton>
-  <CModal
-    fullscreen
-    :visible="fullscreenDemo"
-    @close="() => { fullscreenDemo = false }"
-    aria-labelledby="FullscreenExample1"
-  >
-    <CModalHeader>
-      <CModalTitle id="FullscreenExample1">Full screen</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    fullscreen="sm"
-    :visible="fullscreenSmDemo"
-    @close="() => { fullscreenSmDemo = false }"
-    aria-labelledby="FullscreenExample2"
-  >
-    <CModalHeader>
-      <CModalTitle id="FullscreenExample2">Full screen below sm</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    fullscreen="md"
-    :visible="fullscreenMdDemo"
-    @close="() => { fullscreenMdDemo = false }"
-    aria-labelledby="FullscreenExample3"
-  >
-    <CModalHeader>
-      <CModalTitle id="FullscreenExample3">Full screen below md</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    fullscreen="lg"
-    :visible="fullscreenLgDemo"
-    @close="() => { fullscreenLgDemo = false }"
-    aria-labelledby="FullscreenExample4"
-  >
-    <CModalHeader>
-      <CModalTitle id="FullscreenExample4">Full screen below lg</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    fullscreen="xl"
-    :visible="fullscreenXlDemo"
-    @close="() => { fullscreenXlDemo = false }"
-    aria-labelledby="FullscreenExample5"
-  >
-    <CModalHeader>
-      <CModalTitle id="FullscreenExample5">Full screen below xl</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-  <CModal
-    fullscreen="xxl"
-    :visible="fullscreenXxlDemo"
-    @close="() => { fullscreenXxlDemo = false }"
-    aria-labelledby="FullscreenExample6"
-  >
-    <CModalHeader>
-      <CModalTitle id="FullscreenExample6">Full screen below xxl</CModalTitle>
-    </CModalHeader>
-    <CModalBody>
-      ...
-    </CModalBody>
-  </CModal>
-</template>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue modals 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.
-
-<ScssDocs file="_modal.scss" capture="modal-css-vars"/>
-
-<ScssDocs file="_modal.scss" capture="modal-backdrop-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CModal :style="vars">...</CModal>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="modal-variables"/>
-
-### SASS loops
-
-[Responsive fullscreen modals](#fullscreen-modal) are generated via the `$breakpoints` map and a loop in `scss/_modal.scss`.
-
-<ScssDocs file="_modal.scss" capture="modal-fullscreen-loop"/>
-
-## API
-
-!!!include(./api/modal/CModal.api.md)!!!
-
-!!!include(./api/modal/CModalHeader.api.md)!!!
-
-!!!include(./api/modal/CModalTitle.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const visibleLiveDemo = ref(false)
-  const visibleStaticBackdropDemo = ref(false)
-  const visibleScrollingLongContentDemo = ref(false)
-  const visibleScrollableDemo = ref(false)
-  const visibleVerticallyCenteredDemo = ref(false)
-  const visibleVerticallyCenteredScrollableDemo = ref(false)
-  const visibleTooltipsAndPopoversDemo = ref(false)
-  const visibleToggleBetweenModalsDemo1 = ref(false)
-  const visibleToggleBetweenModalsDemo2 = ref(false)
-  const xlDemo = ref(false)
-  const lgDemo = ref(false)
-  const smDemo = ref(false)
-  const fullscreenDemo = ref(false)
-  const fullscreenSmDemo = ref(false)
-  const fullscreenMdDemo = ref(false)
-  const fullscreenLgDemo = ref(false)
-  const fullscreenXlDemo = ref(false)
-  const fullscreenXxlDemo = ref(false)
-</script>
diff --git a/packages/docs/components/navbar.md b/packages/docs/components/navbar.md
deleted file mode 100644
index ce2e636a..00000000
--- a/packages/docs/components/navbar.md
+++ /dev/null
@@ -1,1308 +0,0 @@
----
-title: Vue Navbar Component
-name: Navbar
-description: Documentation and examples for the Vue navbar powerful, responsive navigation header component. Includes support for branding, links, dropdowns, and more.
-other_frameworks: navbar
----
-
-## Supported content
-
-`<CNavbar>` come with built-in support for a handful of sub-components. Choose from the following as needed:
-
-- `<CNavbarBrand>` for your company, product, or project name.
-- `<CNavbarNav>` for a full-height and lightweight navigation (including support for dropdowns).
-- `<CNavbarToggler>` for use with our collapse plugin and other [navigation toggling](#responsive-behaviors) behaviors.
-- Flex and spacing utilities for any form controls and actions.
-- `<CNavbarText>` for adding vertically centered strings of text.
-- `<CCollapse>` for grouping and hiding navbar contents by a parent breakpoint.
-
-Here's an example of all the sub-components included in a responsive light-themed navbar that automatically collapses at the `lg` (large) breakpoint.
-
-## Basic usage
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(true)
-</script>
-<template>
-  <CNavbar expand="lg" color-scheme="light" class="bg-light">
-    <CContainer fluid>
-      <CNavbarBrand href="#">Navbar</CNavbarBrand>
-      <CNavbarToggler @click="visible = !visible"/>
-      <CCollapse class="navbar-collapse" :visible="visible">
-        <CNavbarNav>
-          <CNavItem>
-            <CNavLink href="#" active>
-              Home
-            </CNavLink>
-          </CNavItem>
-          <CNavItem>
-            <CNavLink href="#">Link</CNavLink>
-          </CNavItem>
-          <CDropdown variant="nav-item" :popper="false">
-            <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-            <CDropdownMenu>
-              <CDropdownItem href="#">Action</CDropdownItem>
-              <CDropdownItem href="#">Another action</CDropdownItem>
-              <CDropdownDivider />
-              <CDropdownItem href="#">Something else here</CDropdownItem>
-            </CDropdownMenu>
-          </CDropdown>
-          <CNavItem>
-            <CNavLink href="#" disabled>
-              Disabled
-            </CNavLink>
-          </CNavItem>
-        </CNavbarNav>
-        <CForm class="d-flex">
-          <CFormInput type="search" class="me-2" placeholder="Search"/>
-          <CButton type="submit" color="success" variant="outline">Search</CButton>
-        </CForm>
-      </CCollapse>
-    </CContainer>
-  </CNavbar>
-</template>
-```
-
-### Brand
-
-The `<CNavbarBrand>` can be applied to most elements, but an anchor works best, as some elements might require utility classes or custom styles.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-<br/>
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand class="mb-0 h1">Navbar</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-// As a link
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-<br/>
-// As a heading
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand class="mb-0 h1">Navbar</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-Adding images to the `<CNavbarBrand>` will likely always require custom styles or utilities to properly size. Here are some examples to demonstrate.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">
-      <img :src="$withBase('/images/brand/coreui-signet.svg')" alt="" width="22" height="24"/>
-    </CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-// Just an image
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">
-      <img src="/images/brand/coreui-signet.svg" alt="" width="22" height="24"/>
-    </CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">
-      <img :src="$withBase('/images/brand/coreui-signet.svg')" alt="" width="22" height="24" class="d-inline-block align-top"/> CoreUI
-    </CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-// Image and text
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">
-      <img src="/images/brand/coreui-signet.svg" alt="" width="22" height="24" class="d-inline-block align-top"/> CoreUI
-    </CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-### Nav
-
-`<CNavbar>` navigation is based on `<CNavbarNav>`. **Navigation in navbars will also grow to occupy as much horizontal space as possible** to keep your navbar contents securely aligned.
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Features</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Pricing</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>Disabled</CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Features</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Pricing</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>Disabled</CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-And because we use classes for our navs, you can avoid the list-based approach entirely if you like.
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav as="nav">
-        <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        <CNavLink href="#">Features</CNavLink>
-        <CNavLink href="#">Pricing</CNavLink>
-        <CNavLink href="#" disabled>Disabled</CNavLink>
-      </CNavbarNav>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav as="nav">
-        <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        <CNavLink href="#">Features</CNavLink>
-        <CNavLink href="#">Pricing</CNavLink>
-        <CNavLink href="#" disabled>Disabled</CNavLink>
-      </CNavbarNav>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-
-
-You can also use dropdowns in your navbar. Please note that `<CDropdown>` component requires `variant="nav-item"`.
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Features</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Pricing</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle>Dropdown link</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-      </CNavbarNav>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Features</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Pricing</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle>Dropdown link</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-      </CNavbarNav>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-### Forms
-
-Place various form controls and components within a navbar:
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CForm class="d-flex">
-      <CFormInput type="search" class="me-2" placeholder="Search"/>
-      <CButton type="submit" color="success" variant="outline">Search</CButton>
-    </CForm>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CForm class="d-flex">
-      <CFormInput type="search" class="me-2" placeholder="Search"/>
-      <CButton type="submit" color="success" variant="outline">Search</CButton>
-    </CForm>
-  </CContainer>
-</CNavbar>
-```
-
-Immediate child elements of `<CNavbar>` use flex layout and will default to `justify-content: space-between`. Use additional [flex utilities](https://coreui.io/docs/4.0/utilities/flex/) as needed to adjust this behavior.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CForm class="d-flex">
-      <CFormInput type="search" class="me-2" placeholder="Search"/>
-      <CButton type="submit" color="success" variant="outline">Search</CButton>
-    </CForm>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CForm class="d-flex">
-      <CFormInput type="search" class="me-2" placeholder="Search"/>
-      <CButton type="submit" color="success" variant="outline">Search</CButton>
-    </CForm>
-  </CContainer>
-</CNavbar>
-```
-
-Input groups work, too. If your navbar is an entire form, or mostly a form, you can use the `<CForm>` element as the container and save some HTML.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CForm class="container-fluid">
-    <CInputGroup>
-      <CInputGroupText id="basic-addon1">@</CInputGroupText>
-      <CFormInput placeholder="Username" aria-label="Username" aria-describedby="basic-addon1"/> 
-    </CInputGroup>
-  </CForm>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CForm class="container-fluid">
-    <CInputGroup>
-      <CInputGroupText id="basic-addon1">@</CInputGroupText>
-      <CFormInput placeholder="Username" aria-label="Username" aria-describedby="basic-addon1"/> 
-    </CInputGroup>
-  </CForm>
-</CNavbar>
-```
-
-Various 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.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CForm class="container-fluid justify-content-start">
-    <CButton type="button" color="success" variant="outline" class="me-2">Main button</CButton>
-    <CButton type="button" color="secondary" variant="outline" size="sm">Smaller button</CButton>
-  </CForm>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CForm class="container-fluid justify-content-start">
-    <CButton type="button" color="success" variant="outline" class="me-2">Main button</CButton>
-    <CButton type="button" color="secondary" variant="outline" size="sm">Smaller button</CButton>
-  </CForm>
-</CNavbar>
-```
-
-### Text
-
-Navbars may contain bits of text with the help of `<CNavbarText>`. This class adjusts vertical alignment and horizontal spacing for strings of text.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarText>Navbar text with an inline element</CNavbarText>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarText>Navbar text with an inline element</CNavbarText>
-  </CContainer>
-</CNavbar>
-```
-
-## Color schemes
-
-Theming the navbar has never been easier thanks to the combination of theming classes and `background-color` utilities. Set `color-scheme="light"` for use with light background colors, or `color-scheme="dark"` for dark background colors. Then, customize with `.bg-*` utilities.
-
-::: demo
-<CNavbar expand="lg" color-scheme="dark" class="bg-dark">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="light" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-<br/>
-<CNavbar expand="lg" color-scheme="dark" class="bg-primary">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="light" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-<br/>
-<CNavbar expand="lg" color-scheme="light" style="background-color: #e3f2fd">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="primary" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="dark" class="bg-dark">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="light" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-<br/>
-<CNavbar expand="lg" color-scheme="dark" class="bg-primary">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="light" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-<br/>
-<CNavbar expand="lg" color-scheme="light" style="background-color: #e3f2fd">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav>
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CDropdown variant="nav-item" :popper="false">
-          <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownDivider />
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="primary" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-## Containers
-
-Although it's not required, you can wrap a `<CNavbar>` in a `<CContainer>` to center it on a page–though note that an inner container is still required. Or you can add a container inside the `<CNavbar>` to only center the contents of a [fixed or static top navbar](#placement).
-
-::: demo
-<CContainer>
-  <CNavbar color-scheme="light" class="bg-light">
-    <CContainer fluid>
-      <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    </CContainer>
-  </CNavbar>
-</CContainer>
-:::
-```vue
-<CContainer>
-  <CNavbar color-scheme="light" class="bg-light">
-    <CContainer fluid>
-      <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    </CContainer>
-  </CNavbar>
-</CContainer>
-```
-
-Use any of the responsive containers to change how wide the content in your navbar is presented.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer breakpoint="md">
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer breakpoint="md">
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-## Placement
-
-Use our `placement` properly to place navbars in non-static positions. Choose from fixed to the top, fixed to the bottom, or stickied to the top (scrolls with the page until it reaches the top, then stays there). Fixed 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.
-
-Also note that **`.sticky-top` uses `position: sticky`, which [isn't fully supported in every browser](https://caniuse.com/css-sticky)**.
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Default</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Default</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light" placement="fixed-top">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Fixed top</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light" placement="fixed-top">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Fixed top</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light" placement="fixed-bottom">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Fixed bottom</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light" placement="fixed-bottom">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Fixed bottom</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-::: demo
-<CNavbar color-scheme="light" class="bg-light" placement="sticky-top">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Sticky top</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar color-scheme="light" class="bg-light" placement="sticky-top">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Sticky top</CNavbarBrand>
-  </CContainer>
-</CNavbar>
-```
-
-## Responsive behaviors
-
-Navbars can use `<CNavbarToggler>`, `<CCollapse>`, and `expand="{sm|md|lg|xl|xxl}"` property 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.
-
-For navbars that never collapse, add the `expand` boolean property on the `<CNavbar>`. For navbars that always collapse, don't add any property.
-
-### Toggler
-
-Navbar togglers are left-aligned by default, but should they follow a sibling element like a `<CNavbarBrand>`, 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.
-
-With no `<CNavbarBrand>` shown at the smallest breakpoint:
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarBrand href="#">Hidden brand</CNavbarBrand>
-      <CNavbarNav class="me-auto mb-2 mb-lg-0">
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarBrand href="#">Hidden brand</CNavbarBrand>
-      <CNavbarNav class="me-auto mb-2 mb-lg-0">
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-With a brand name shown on the left and toggler on the right:
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav class="me-auto mb-2 mb-lg-0">
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav class="me-auto mb-2 mb-lg-0">
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-With a toggler on the left and brand name on the right:
-
-::: demo
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav class="me-auto mb-2 mb-lg-0">
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<CNavbar expand="lg" color-scheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarToggler aria-label="Toggle navigation" aria-expanded={visible} @click="visible = !visible"/>
-    <CNavbarBrand href="#">Navbar</CNavbarBrand>
-    <CCollapse class="navbar-collapse" :visible="visible">
-      <CNavbarNav class="me-auto mb-2 mb-lg-0">
-        <CNavItem>
-          <CNavLink href="#" active>
-            Home
-          </CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#">Link</CNavLink>
-        </CNavItem>
-        <CNavItem>
-          <CNavLink href="#" disabled>
-            Disabled
-          </CNavLink>
-        </CNavItem>
-      </CNavbarNav>
-      <CForm class="d-flex">
-        <CFormInput type="search" class="me-2" placeholder="Search"/>
-        <CButton type="submit" color="success" variant="outline">Search</CButton>
-      </CForm>
-    </CCollapse>
-  </CContainer>
-</CNavbar>
-```
-
-### External content
-
-Sometimes you want to use the collapse plugin to trigger a container element for content that structurally sits outside of the `<CNavbar>`.
-
-::: demo
-<CCollapse id="navbarToggleExternalContent" :visible="visibleExternalContent" data-coreui-theme="dark">
-  <div class="bg-dark p-4">
-    <h5 class="text-body-emphasis h4">Collapsed content</h5>
-    <span class="text-body-secondary">Toggleable via the navbar brand.</span>
-  </div>
-</CCollapse>
-<CNavbar colorScheme="dark" class="bg-dark">
-  <CContainer fluid>
-    <CNavbarToggler
-      aria-controls="navbarToggleExternalContent"
-      aria-label="Toggle navigation"
-      @click="visibleExternalContent = !visibleExternalContent"
-    />
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleExternalContent = ref(false)
-</script>
-<template>
-  <CCollapse id="navbarToggleExternalContent" :visible="visibleExternalContent" data-coreui-theme="dark">
-    <div class="bg-dark p-4">
-      <h5 class="text-body-emphasis h4">Collapsed content</h5>
-      <span class="text-body-secondary">Toggleable via the navbar brand.</span>
-    </div>
-  </CCollapse>
-  <CNavbar colorScheme="dark" class="bg-dark">
-    <CContainer fluid>
-      <CNavbarToggler
-        aria-controls="navbarToggleExternalContent"
-        aria-label="Toggle navigation"
-        @click="visibleExternalContent = !visibleExternalContent"
-      />
-    </CContainer>
-  </CNavbar>
-</template>
-```
-
-### Offcanvas
-
-Transform your expanding and collapsing navbar into an offcanvas drawer with the offcanvas plugin. We extend both the offcanvas default styles and use our `expand="*"` prop to create a dynamic and flexible navigation sidebar.
-
-In the example below, to create an offcanvas navbar that is always collapsed across all breakpoints, omit the `expand="*"` prop entirely.
-
-:::demo
-<CNavbar colorScheme="light" class="bg-light">
-  <CContainer fluid>
-    <CNavbarBrand>Offcanvas navbar</CNavbarBrand>
-    <CNavbarToggler
-      aria-controls="offcanvasNavbar"
-      aria-label="Toggle navigation"
-      @click="visibleOffcanvas = !visibleOffcanvas"
-    />
-    <COffcanvas id="offcanvasNavbar" placement="end" :visible="visibleOffcanvas" @hide="visibleOffcanvas = false">
-      <COffcanvasHeader>
-        <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-        <CCloseButton class="text-reset" @click="visibleOffcanvas = false" />
-      </COffcanvasHeader>
-      <COffcanvasBody>
-        <CNavbarNav>
-          <CNavItem>
-            <CNavLink href="#" active>
-              Home
-            </CNavLink>
-          </CNavItem>
-          <CNavItem>
-            <CNavLink href="#">Link</CNavLink>
-          </CNavItem>
-          <CDropdown variant="nav-item" :popper="false">
-            <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-            <CDropdownMenu>
-              <CDropdownItem href="#">Action</CDropdownItem>
-              <CDropdownItem href="#">Another action</CDropdownItem>
-              <CDropdownDivider />
-              <CDropdownItem href="#">Something else here</CDropdownItem>
-            </CDropdownMenu>
-          </CDropdown>
-          <CNavItem>
-            <CNavLink href="#" disabled>
-              Disabled
-            </CNavLink>
-          </CNavItem>
-        </CNavbarNav>
-        <CForm class="d-flex">
-          <CFormInput type="search" class="me-2" placeholder="Search" />
-          <CButton type="submit" color="success" variant="outline">
-            Search
-          </CButton>
-        </CForm>
-      </COffcanvasBody>
-    </COffcanvas>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleOffcanvas = ref(false)
-</script>
-<template>
-  <CNavbar colorScheme="light" class="bg-light">
-    <CContainer fluid>
-      <CNavbarBrand>Offcanvas navbar</CNavbarBrand>
-      <CNavbarToggler
-        aria-controls="offcanvasNavbar"
-        aria-label="Toggle navigation"
-        @click="visibleOffcanvas = !visibleOffcanvas"
-      />
-      <COffcanvas id="offcanvasNavbar" placement="end" :visible="visibleOffcanvas" @hide="visibleOffcanvas = false">
-        <COffcanvasHeader>
-          <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-          <CCloseButton class="text-reset" @click="visibleOffcanvas = false" />
-        </COffcanvasHeader>
-        <COffcanvasBody>
-          <CNavbarNav>
-            <CNavItem>
-              <CNavLink href="#" active>
-                Home
-              </CNavLink>
-            </CNavItem>
-            <CNavItem>
-              <CNavLink href="#">Link</CNavLink>
-            </CNavItem>
-            <CDropdown variant="nav-item" :popper="false">
-              <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-              <CDropdownMenu>
-                <CDropdownItem href="#">Action</CDropdownItem>
-                <CDropdownItem href="#">Another action</CDropdownItem>
-                <CDropdownDivider />
-                <CDropdownItem href="#">Something else here</CDropdownItem>
-              </CDropdownMenu>
-            </CDropdown>
-            <CNavItem>
-              <CNavLink href="#" disabled>
-                Disabled
-              </CNavLink>
-            </CNavItem>
-          </CNavbarNav>
-          <CForm class="d-flex">
-            <CFormInput type="search" class="me-2" placeholder="Search" />
-            <CButton type="submit" color="success" variant="outline">
-              Search
-            </CButton>
-          </CForm>
-        </COffcanvasBody>
-      </COffcanvas>
-    </CContainer>
-  </CNavbar>
-</template>
-```
-
-To create an offcanvas navbar that expands into a normal navbar at a specific breakpoint like `xxl`, use `expand="xxl"` property.
-
-:::demo
-<CNavbar colorScheme="light" class="bg-light" expand="xxl">
-  <CContainer fluid>
-    <CNavbarBrand>Offcanvas navbar</CNavbarBrand>
-    <CNavbarToggler
-      aria-controls="offcanvasNavbar2"
-      aria-label="Toggle navigation"
-      @click="visibleOffcanvas2 = !visibleOffcanvas2"
-    />
-    <COffcanvas id="offcanvasNavbar2" placement="end" :visible="visibleOffcanvas2" @hide="visibleOffcanvas2 = false">
-      <COffcanvasHeader>
-        <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-        <CCloseButton class="text-reset" @click="visibleOffcanvas2 = false" />
-      </COffcanvasHeader>
-      <COffcanvasBody>
-        <CNavbarNav>
-          <CNavItem>
-            <CNavLink href="#" active>
-              Home
-            </CNavLink>
-          </CNavItem>
-          <CNavItem>
-            <CNavLink href="#">Link</CNavLink>
-          </CNavItem>
-          <CDropdown variant="nav-item" :popper="false">
-            <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-            <CDropdownMenu>
-              <CDropdownItem href="#">Action</CDropdownItem>
-              <CDropdownItem href="#">Another action</CDropdownItem>
-              <CDropdownDivider />
-              <CDropdownItem href="#">Something else here</CDropdownItem>
-            </CDropdownMenu>
-          </CDropdown>
-          <CNavItem>
-            <CNavLink href="#" disabled>
-              Disabled
-            </CNavLink>
-          </CNavItem>
-        </CNavbarNav>
-        <CForm class="d-flex">
-          <CFormInput type="search" class="me-2" placeholder="Search" />
-          <CButton type="submit" color="success" variant="outline">
-            Search
-          </CButton>
-        </CForm>
-      </COffcanvasBody>
-    </COffcanvas>
-  </CContainer>
-</CNavbar>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleOffcanvas2 = ref(false)
-</script>
-<template>
-  <CNavbar colorScheme="light" class="bg-light" expand="xxl">
-    <CContainer fluid>
-      <CNavbarBrand>Offcanvas navbar</CNavbarBrand>
-      <CNavbarToggler
-        aria-controls="offcanvasNavbar2"
-        aria-label="Toggle navigation"
-        @click="visibleOffcanvas2 = !visibleOffcanvas2"
-      />
-      <COffcanvas id="offcanvasNavbar2" placement="end" :visible="visibleOffcanvas2" @hide="visibleOffcanvas2 = false">
-        <COffcanvasHeader>
-          <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-          <CCloseButton class="text-reset" @click="visibleOffcanvas2 = false" />
-        </COffcanvasHeader>
-        <COffcanvasBody>
-          <CNavbarNav>
-            <CNavItem>
-              <CNavLink href="#" active>
-                Home
-              </CNavLink>
-            </CNavItem>
-            <CNavItem>
-              <CNavLink href="#">Link</CNavLink>
-            </CNavItem>
-            <CDropdown variant="nav-item" :popper="false">
-              <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-              <CDropdownMenu>
-                <CDropdownItem href="#">Action</CDropdownItem>
-                <CDropdownItem href="#">Another action</CDropdownItem>
-                <CDropdownDivider />
-                <CDropdownItem href="#">Something else here</CDropdownItem>
-              </CDropdownMenu>
-            </CDropdown>
-            <CNavItem>
-              <CNavLink href="#" disabled>
-                Disabled
-              </CNavLink>
-            </CNavItem>
-          </CNavbarNav>
-          <CForm class="d-flex">
-            <CFormInput type="search" class="me-2" placeholder="Search" />
-            <CButton type="submit" color="success" variant="outline">
-              Search
-            </CButton>
-          </CForm>
-        </COffcanvasBody>
-      </COffcanvas>
-    </CContainer>
-  </CNavbar>
-</template>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue navbars 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.
-
-<ScssDocs file="_navbar.scss" capture="navbar-css-vars"/>
-
-Some additional CSS variables are also present on `.navbar-nav`:
-
-<ScssDocs file="_navbar.scss" capture="navbar-nav-css-vars"/>
-
-Customization through CSS variables can be seen on the `.navbar-dark` class where we override specific values without adding duplicate CSS selectors.
-
-<ScssDocs file="_navbar.scss" capture="navbar-dark-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CNavbar :style="vars">...</CNavbar>
-```
-
-### SASS variables
-
-Variables for all navbars:
-
-<ScssDocs file="_variables.scss" capture="navbar-variables"/>
-
-Variables for the [dark navbar](#color-schemes):
-
-<ScssDocs file="_variables.scss" capture="navbar-dark-variables"/>
-
-### SASS loops
-
-[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`.
-
-<ScssDocs file="_navbar.scss" capture="navbar-expand-loop"/>
-
-## API
-
-!!!include(./api/navbar/CNavbar.api.md)!!!
-
-!!!include(./api/navbar/CNavbarBrand.api.md)!!!
-
-!!!include(./api/navbar/CNavbarNav.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(true)
-  const visibleExternalContent = ref(false)
-  const visibleOffcanvas = ref(false)
-  const visibleOffcanvas2 = ref(false)
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/navs-tabs.md b/packages/docs/components/navs-tabs.md
deleted file mode 100644
index 9ad84051..00000000
--- a/packages/docs/components/navs-tabs.md
+++ /dev/null
@@ -1,1035 +0,0 @@
----
-title: Vue Navs & Tabs Components
-name: Navs & Tabs
-description: Documentation and examples for how to use CoreUI's included Vue navigation components.
-other_frameworks: navs-tabs
----
-
-## Base nav
-
-Navigation available in CoreUI for Vue share general markup and styles, from the base `.nav` class to the active and disabled states. Swap modifier classes to switch between each style.
-
-The 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.
-
-::: demo
-<CNav>
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav>
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-Classes 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.
-
-::: demo
-
-  <CNav as="nav">
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-    <CNavLink href="#">Link</CNavLink>
-    <CNavLink href="#">Link</CNavLink>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNav>
-
-:::
-```vue
-
-  <CNav as="nav">
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-    <CNavLink href="#">Link</CNavLink>
-    <CNavLink href="#">Link</CNavLink>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNav>
-
-```
-
-## Available styles
-
-Change the style of `.nav`s component with modifiers and utilities. Mix and match as needed, or build your own.
-
-### Horizontal alignment
-
-Change the horizontal alignment of your nav with [flexbox utilities](https://coreui.io/docs/layout/grid/#horizontal-alignment). By default, navs are left-aligned, but you can easily change them to center or right aligned.
-
-Centered with `.justify-content-center`:
-
-::: demo
-<CNav class="justify-content-center">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav class="justify-content-center">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-Right-aligned with `.justify-content-end`:
-
-::: demo
-<CNav class="justify-content-end">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav class="justify-content-end">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Vertical
-
-Stack 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`).
-
-::: demo
-<CNav class="flex-column">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav class="flex-column">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Tabs
-
-Takes the basic nav from above and adds the `variant="tabs"` class to generate a tabbed interface
-
-::: demo
-<CNav variant="tabs">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="tabs">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Pills
-
-Take that same HTML, but use `variant="pills"` instead:
-
-::: demo
-<CNav variant="pills">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="pills">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-
-### Underline
-
-Take that same code, but use `variant="underline"` instead:
-
-::: demo
-<CNav variant="underline">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="underline">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-### Underline border
-
-Take that same code, but use `variant="underline-border"` instead:
-
-::: demo
-<CNav variant="underline-border">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="underline-border">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Enclosed
-
-Use the `variant="enclosed"` class to give your navigation items a subtle border and rounded styling.
-
-::: demo
-<CNav variant="enclosed">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="enclosed">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Enclosed pills 
-
-Use the `variant="enclosed-pills"` to achieve a pill-style appearance for each nav item, using pill-shaped borders and smoother outlines.
-
-::: demo
-<CNav variant="enclosed-pills">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="enclosed-pills">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Fill and justify
-
-Force your `.nav`'s contents to extend the full available width one of two modifier classes. To proportionately fill all available space with your `.nav-item`s, use `layout="fill"`. Notice that all horizontal space is occupied, but not every nav item has the same width.
-
-::: demo
-<CNav variant="pills" layout="fill">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="pills" layout="fill">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-For equal-width elements, use `layout="justified"`. All horizontal space will be occupied by nav links, but unlike the .nav-fill above, every nav item will be the same width.
-
-::: demo
-<CNav variant="pills" layout="justified">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="pills" layout="justified">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-## Working with flex utilities
-
-If you need responsive nav variations, consider using a series of [flexbox utilities](https://coreui.io/docs/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.
-
-::: demo
-<CNav as="nav" variant="pills" class="flex-column flex-sm-row">
-  <CNavLink href="#" active>
-    Active
-  </CNavLink>
-  <CNavLink href="#">Link</CNavLink>
-  <CNavLink href="#">Link</CNavLink>
-  <CNavLink href="#" disabled>
-    Disabled
-  </CNavLink>
-</CNav>
-:::
-```vue
-<CNav as="nav" variant="pills" class="flex-column flex-sm-row">
-  <CNavLink href="#" active>
-    Active
-  </CNavLink>
-  <CNavLink href="#">Link</CNavLink>
-  <CNavLink href="#">Link</CNavLink>
-  <CNavLink href="#" disabled>
-    Disabled
-  </CNavLink>
-</CNav>
-```
-
-## Regarding accessibility
-
-If 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.
-
-Note 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 [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#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.
-
-## Using dropdowns
-
-Add dropdown menus with a little extra HTML.
-
-### Tabs with dropdowns
-
-::: demo
-<CNav>
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CDropdown variant="nav-item">
-    <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav>
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CDropdown variant="nav-item">
-    <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-### Pills with dropdowns
-
-::: demo
-<CNav variant="pills">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CDropdown variant="nav-item">
-    <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-:::
-```vue
-<CNav variant="pills">
-  <CNavItem>
-    <CNavLink href="#" active>
-      Active
-    </CNavLink>
-  </CNavItem>
-  <CDropdown variant="nav-item">
-    <CDropdownToggle color="secondary">Dropdown button</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CNavItem>
-    <CNavLink href="#">Link</CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink href="#" disabled>
-      Disabled
-    </CNavLink>
-  </CNavItem>
-</CNav>
-```
-
-
-## Tab panes
-
-Dynamic tabbed interfaces, as described in the [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#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).
-
-Note that dynamic tabbed interfaces should not contain dropdown menus, as this causes 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.
-
-::: demo
-<CNav variant="tabs" role="tablist">
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPaneActiveKey === 1"
-      @click="() => {tabPaneActiveKey = 1}"
-    >
-      Home
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPaneActiveKey === 2"
-      @click="() => {tabPaneActiveKey = 2}"
-    >
-      Profile
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPaneActiveKey === 3"
-      @click="() => {tabPaneActiveKey = 3}"
-    >
-      Contact
-    </CNavLink>
-  </CNavItem>
-</CNav>
-<CTabContent>
-  <CTabPane role="tabpanel" aria-labelledby="home-tab" :visible="tabPaneActiveKey === 1">
-    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.
-  </CTabPane>
-  <CTabPane role="tabpanel" aria-labelledby="profile-tab" :visible="tabPaneActiveKey === 2">
-    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.
-  </CTabPane>
-  <CTabPane role="tabpanel" aria-labelledby="contact-tab" :visible="tabPaneActiveKey === 3">
-    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.
-  </CTabPane>
-</CTabContent>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const tabPaneActiveKey = ref(1)
-</script>
-<template>
-  <CNav variant="tabs" role="tablist">
-    <CNavItem>
-      <CNavLink
-        href="javascript:void(0);"
-        :active="tabPaneActiveKey === 1"
-        @click="() => {tabPaneActiveKey = 1}"
-      >
-        Home
-      </CNavLink>
-    </CNavItem>
-    <CNavItem>
-      <CNavLink
-        href="javascript:void(0);"
-        :active="tabPaneActiveKey === 2"
-        @click="() => {tabPaneActiveKey = 2}"
-      >
-        Profile
-      </CNavLink>
-    </CNavItem>
-    <CNavItem>
-      <CNavLink
-        href="javascript:void(0);"
-        :active="tabPaneActiveKey === 3"
-        @click="() => {tabPaneActiveKey = 3}"
-      >
-        Contact
-      </CNavLink>
-    </CNavItem>
-  </CNav>
-  <CTabContent>
-    <CTabPane role="tabpanel" aria-labelledby="home-tab" :visible="tabPaneActiveKey === 1">
-      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.
-    </CTabPane>
-    <CTabPane role="tabpanel" aria-labelledby="profile-tab" :visible="tabPaneActiveKey === 2">
-      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.
-    </CTabPane>
-    <CTabPane role="tabpanel" aria-labelledby="contact-tab" :visible="tabPaneActiveKey === 3">
-      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.
-    </CTabPane>
-  </CTabContent>
-</template>
-```
-
-The tabs also works with pills.
-
-::: demo
-<CNav variant="pills" role="tablist">
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPanePillsActiveKey === 1"
-      @click="() => {tabPanePillsActiveKey = 1}"
-    >
-      Home
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPanePillsActiveKey === 2"
-      @click="() => {tabPanePillsActiveKey = 2}"
-    >
-      Profile
-    </CNavLink>
-  </CNavItem>
-  <CNavItem>
-    <CNavLink
-      href="javascript:void(0);"
-      :active="tabPanePillsActiveKey === 3"
-      @click="() => {tabPanePillsActiveKey = 3}"
-    >
-      Contact
-    </CNavLink>
-  </CNavItem>
-</CNav>
-<CTabContent>
-  <CTabPane role="tabpanel" aria-labelledby="home-tab" :visible="tabPanePillsActiveKey === 1">
-    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.
-  </CTabPane>
-  <CTabPane role="tabpanel" aria-labelledby="profile-tab" :visible="tabPanePillsActiveKey === 2">
-    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.
-  </CTabPane>
-  <CTabPane role="tabpanel" aria-labelledby="contact-tab" :visible="tabPanePillsActiveKey === 3">
-    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.
-  </CTabPane>
-</CTabContent>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const tabPanePillsActiveKey = ref(1)
-</script>
-<template>
-  <CNav variant="tabs" role="tablist">
-    <CNavItem>
-      <CNavLink
-        href="javascript:void(0);"
-        :active="tabPanePillsActiveKey === 1"
-        @click="() => {tabPanePillsActiveKey = 1}"
-      >
-        Home
-      </CNavLink>
-    </CNavItem>
-    <CNavItem>
-      <CNavLink
-        href="javascript:void(0);"
-        :active="tabPanePillsActiveKey === 2"
-        @click="() => {tabPanePillsActiveKey = 2}"
-      >
-        Profile
-      </CNavLink>
-    </CNavItem>
-    <CNavItem>
-      <CNavLink
-        href="javascript:void(0);"
-        :active="tabPanePillsActiveKey === 3"
-        @click="() => {tabPanePillsActiveKey = 3}"
-      >
-        Contact
-      </CNavLink>
-    </CNavItem>
-  </CNav>
-  <CTabContent>
-    <CTabPane role="tabpanel" aria-labelledby="home-tab" :visible="tabPanePillsActiveKey === 1">
-      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.
-    </CTabPane>
-    <CTabPane role="tabpanel" aria-labelledby="profile-tab" :visible="tabPanePillsActiveKey === 2">
-      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.
-    </CTabPane>
-    <CTabPane role="tabpanel" aria-labelledby="contact-tab" :visible="tabPanePillsActiveKey === 3">
-      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.
-    </CTabPane>
-  </CTabContent>
-</template>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue cards 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.
-
-On the `.nav` base class:
-
-<ScssDocs file="_nav.scss" capture="nav-css-vars"/>
-
-On the `.nav-tabs` modifier class:
-
-<ScssDocs file="_nav.scss" capture="nav-tabs-css-vars"/>
-
-On the `.nav-pills` modifier class:
-
-<ScssDocs file="_nav.scss" capture="nav-pills-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CNav :style="vars">...</CNav>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="nav-variables"/>
-
-## API
-
-!!!include(./api/nav/CNav.api.md)!!!
-
-!!!include(./api/nav/CNavGroup.api.md)!!!
-
-!!!include(./api/nav/CNavItem.api.md)!!!
-
-`CNavItem` and `CNavLink` have the same properties. If you set the `href` property on `CNavItem` then, `CNavLink` will be generated inside `CNavItem`.
-
-!!!include(./api/nav/CNavLink.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const tabPaneActiveKey = ref(1)
-  const tabPanePillsActiveKey = ref(1)
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/offcanvas.md b/packages/docs/components/offcanvas.md
deleted file mode 100644
index a39696ba..00000000
--- a/packages/docs/components/offcanvas.md
+++ /dev/null
@@ -1,413 +0,0 @@
----
-title: Vue Offcanvas Component
-name: Offcanvas
-description: Vue alert component allows build hidden sidebars into your project for navigation, shopping carts.
-other_frameworks: offcanvas
----
-
-
-## Examples
-
-### Offcanvas components
-
-Below is an offcanvas example that is shown by default (via `:visible="true"`). 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.
-
-
-::: demo
-<div class="docs-example-offcanvas bg-light">
-  <COffcanvas :backdrop="false" placement="start" :visible="true">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" />
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any Bootstrap component or
-      custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</div>
-:::
-```vue
-<template>
-  <COffcanvas :backdrop="false" placement="start" :visible="true">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" />
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any Bootstrap component or
-      custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-### Live demo
-
-Use the buttons below to show and hide an offcanvas component.
-
-- `:visible="false"` hides content (default)
-- `visible` or `:visible="true"` shows content
-
-::: demo
-<CButton color="primary" @click="() => { visible = !visible }">Toggle offcanvas</CButton>
-<COffcanvas placement="start" :visible="visible" @hide="() => { visible = !visible }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visible = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    Content for the offcanvas goes here. You can place just about any Bootstrap component or
-    custom elements here.
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visible = !visible }">Toggle offcanvas</CButton>
-  <COffcanvas placement="start" :visible="visible" @hide="() => { visible = !visible }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visible = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any Bootstrap component or
-      custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-### Body scrolling
-
-Scrolling the `<body>` element is disabled when an offcanvas and its backdrop are visible. Use the scroll property to toggle `<body>` scrolling and backdrop to toggle the backdrop.
-
-::: demo
-<CButton color="primary" @click="() => { visibleScrolling = !visibleScrolling }">Enable body scrolling</CButton>
-<COffcanvas :backdrop="false" placement="start" scroll :visible="visibleScrolling" @hide="() => { visibleScrolling = !visibleScrolling }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleScrolling = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    <p>Try scrolling the rest of the page to see this option in action.</p>
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(false)
-  const visibleScrolling = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleScrolling = !visibleScrolling }">Enable body scrolling</CButton>
-  <COffcanvas :backdrop="false" placement="start" scroll :visible="visibleScrolling" @hide="() => { visibleScrolling = !visibleScrolling }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleScrolling = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      <p>Try scrolling the rest of the page to see this option in action.</p>
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-### Body scrolling and backdrop
-
-You can also enable `<body>` scrolling with a visible backdrop.
-
-::: demo
-<CButton color="primary" @click="() => { visibleWithBothOptions = !visibleWithBothOptions }">Enable both scrolling & backdrop</CButton>
-<COffcanvas placement="start" scroll :visible="visibleWithBothOptions" @hide="() => { visibleWithBothOptions = !visibleWithBothOptions }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleWithBothOptions = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    <p>Try scrolling the rest of the page to see this option in action.</p>
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleWithBothOptions = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleWithBothOptions = !visibleWithBothOptions }">Enable both scrolling &amp; backdrop</CButton>
-  <COffcanvas placement="start" scroll :visible="visibleWithBothOptions" @hide="() => { visibleWithBothOptions = !visibleWithBothOptions }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleWithBothOptions = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      <p>Try scrolling the rest of the page to see this option in action.</p>
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-### Static backdrop
-
-If you set a `backdrop` to `static`, your Vue offcanvas component will not close when clicking outside of it.
-
-::: demo
-<CButton color="primary" @click="() => { visibleWithStaticBackdrop = !visibleWithStaticBackdrop }">Toggle static offcanvas</CButton>
-<COffcanvas backdrop="static" placement="start" :visible="visibleWithStaticBackdrop" @hide="() => { visibleWithStaticBackdrop = !visibleWithStaticBackdrop }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleWithStaticBackdrop = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    <p>I will not close if you click outside of me.</p>
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleWithStaticBackdrop = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleWithStaticBackdrop = !visibleWithStaticBackdrop }">Toggle static offcanvas</CButton>
-  <COffcanvas backdrop="static" placement="start" :visible="visibleWithStaticBackdrop" @hide="() => { visibleWithStaticBackdrop = !visibleWithStaticBackdrop }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleWithStaticBackdrop = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      <p>I will not close if you click outside of me.</p>
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-## Dark offcanvas
-
-Change the appearance of offcanvases with `dark` boolean property to better match them to different contexts like dark navbars.
-
-::: demo
-<div class="docs-example-offcanvas bg-body-secondary p-0 overflow-hidden">
-  <COffcanvas :backdrop="false" dark placement="start" :visible="true">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" />
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any React component or custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</div>
-:::
-```vue
-<COffcanvas :backdrop="false" dark placement="start" :visible="true">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" />
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    Content for the offcanvas goes here. You can place just about any React component or custom elements here.
-  </COffcanvasBody>
-</COffcanvas>
-```
-
-
-## Responsive 
-
-Responsive offcanvas properties hide content outside the viewport from a specified breakpoint and down.
-Above that breakpoint, the contents within will behave as usual. 
-For example, `responsive="lg"` hides content in an offcanvas below the lg breakpoint, but shows the content above the lg breakpoint.
-
-::: demo
-<CButton color="primary" @click="() => { visibleResponsiveBackdrop = !visibleResponsiveBackdrop }">Toggle offcanvas</CButton>
-<CAlert class="d-none d-lg-block" color="info">Resize your browser to show the responsive offcanvas toggle.</CAlert>
-<COffcanvas placement="start" responsive="lg" :visible="visibleResponsiveBackdrop" @hide="() => { visibleResponsiveBackdrop = !visibleResponsiveBackdrop }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Responsive offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleResponsiveBackdrop = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    <p>This is content within an <code>.offcanvas-lg</code></p>.
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleResponsiveBackdrop = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleResponsiveBackdrop = !visibleResponsiveBackdrop }">Toggle static offcanvas</CButton>
-  <CAlert class="d-none d-lg-block" color="info">Resize your browser to show the responsive offcanvas toggle.</CAlert>
-  <COffcanvas placement="start" responsive="lg" :visible="visibleResponsiveBackdrop" @hide="() => { visibleResponsiveBackdrop = !visibleResponsiveBackdrop }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Responsive offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleResponsiveBackdrop = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      <p>This is content within an <code>.offcanvas-lg</code></p>.
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-
-## Placement
-
-There's no default placement for offcanvas components, so you must add one of the modifier classes below;
-
-- `placement="start"` places offcanvas on the left of the viewport (shown above)
-- `placement="end"` places offcanvas on the right of the viewport
-- `placement="top"` places offcanvas on the top of the viewport
-- `placement="bottom"` places offcanvas on the bottom of the viewport
-
-Try the top, right, and bottom examples out below.
-
-::: demo
-<CButton color="primary" @click="() => { visibleTop = !visibleTop }">Toggle top offcanvas</CButton>
-<COffcanvas placement="top" :visible="visibleTop" @hide="() => { visibleTop = !visibleTop }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleTop = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    Content for the offcanvas goes here. You can place just about any Bootstrap component or
-    custom elements here.
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleTop = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleTop = !visibleTop }">Toggle top offcanvas</CButton>
-  <COffcanvas placement="top" :visible="visibleTop" @hide="() => { visibleTop = !visibleTop }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleTop = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any Bootstrap component or
-      custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-::: demo
-<CButton color="primary" @click="() => { visibleEnd = !visibleEnd }">Toggle right offcanvas</CButton>
-<COffcanvas placement="end" :visible="visibleEnd" @hide="() => { visibleEnd = !visibleEnd }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleEnd = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    Content for the offcanvas goes here. You can place just about any Bootstrap component or
-    custom elements here.
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleEnd = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleEnd = !visibleEnd }">Toggle right offcanvas</CButton>
-  <COffcanvas placement="end" :visible="visibleEnd" @hide="() => { visibleEnd = !visibleEnd }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleEnd = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any Bootstrap component or
-      custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-::: demo
-<CButton color="primary" @click="() => { visibleBottom = !visibleBottom }">Toggle bottom offcanvas</CButton>
-<COffcanvas placement="bottom" :visible="visibleBottom" @hide="() => { visibleBottom = !visibleBottom }">
-  <COffcanvasHeader>
-    <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-    <CCloseButton class="text-reset" @click="() => { visibleBottom = false }"/>
-  </COffcanvasHeader>
-  <COffcanvasBody>
-    Content for the offcanvas goes here. You can place just about any Bootstrap component or
-    custom elements here.
-  </COffcanvasBody>
-</COffcanvas>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const visibleBottom = ref(false)
-</script>
-<template>
-  <CButton color="primary" @click="() => { visibleBottom = !visibleBottom }">Toggle bottom offcanvas</CButton>
-  <COffcanvas placement="bottom" :visible="visibleBottom" @hide="() => { visibleBottom = !visibleBottom }">
-    <COffcanvasHeader>
-      <COffcanvasTitle>Offcanvas</COffcanvasTitle>
-      <CCloseButton class="text-reset" @click="() => { visibleBottom = false }"/>
-    </COffcanvasHeader>
-    <COffcanvasBody>
-      Content for the offcanvas goes here. You can place just about any Bootstrap component or
-      custom elements here.
-    </COffcanvasBody>
-  </COffcanvas>
-</template>
-```
-
-## Accessibility
-
-Since the offcanvas panel is conceptually a modal dialog, be sure to add `aria-labelledby="..."`—referencing the offcanvas title—to `<COffcanvas>`. Note that you don’t need to add `role="dialog"` since we already add it automatically.
-
-## Customizing
-
-### CSS variables
-
-Vue offcanvas 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.
-
-<ScssDocs file="_offcanvas.scss" capture="offcanvas-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <COffcanvas :style="vars">...</COffcanvas>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="offcanvas-variables"/>
-
-## API
-
-!!!include(./api/offcanvas/COffcanvas.api.md)!!!
-
-!!!include(./api/offcanvas/COffcanvasTitle.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const visible = ref(false)
-  const visibleTop = ref(false)
-  const visibleEnd = ref(false)
-  const visibleBottom = ref(false)
-  const visibleScrolling = ref(false)
-  const visibleResponsiveBackdrop = ref(false)
-  const visibleWithStaticBackdrop = ref(false)
-  const visibleWithBothOptions = ref(false)
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/pagination.md b/packages/docs/components/pagination.md
deleted file mode 100644
index 9cda5bce..00000000
--- a/packages/docs/components/pagination.md
+++ /dev/null
@@ -1,191 +0,0 @@
----
-title: Vue Pagination Component
-name: Pagination
-description: Documentation and examples for showing pagination to indicate a series of related content exists across multiple pages.
-other_frameworks: pagination
----
-
-## Overview
-
-We 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.
-
-In 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"`.
-
-::: demo
-<CPagination aria-label="Page navigation example">
-  <CPaginationItem href="#">Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination aria-label="Page navigation example">
-  <CPaginationItem href="#">Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-```
-
-## Working with icons
-
-Looking 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.
-
-::: demo
-<CPagination aria-label="Page navigation example">
-  <CPaginationItem aria-label="Previous" href="#"><span aria-hidden="true">&laquo;</span></CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem aria-label="Next" href="#"><span aria-hidden="true">&raquo;</span></CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination aria-label="Page navigation example">
-  <CPaginationItem aria-label="Previous" href="#"><span aria-hidden="true">&laquo;</span></CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem aria-label="Next" href="#"><span aria-hidden="true">&raquo;</span></CPaginationItem>
-</CPagination>
-```
-
-## Disabled and active states
-
-Pagination links are customizable for different circumstances. Use `disabled` for links that appear un-clickable and `.active` to indicate the current page.
-
-While the `disabled` prop uses `pointer-events: none` to _try_ to disable the link functionality of `<a>`s, that CSS property is not yet standardized and doesn't account for keyboard navigation. As such, we always add `tabindex="-1"` on disabled links and use custom JavaScript to fully disable their functionality.
-
-::: demo
-<CPagination aria-label="Page navigation example">
-  <CPaginationItem aria-label="Previous" href="#" disabled><span aria-hidden="true">&laquo;</span></CPaginationItem>
-  <CPaginationItem href="#" active>1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem aria-label="Next" href="#"><span aria-hidden="true">&raquo;</span></CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination aria-label="Page navigation example">
-  <CPaginationItem aria-label="Previous" href="#" disabled><span aria-hidden="true">&laquo;</span></CPaginationItem>
-  <CPaginationItem href="#" active>1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem aria-label="Next" href="#"><span aria-hidden="true">&raquo;</span></CPaginationItem>
-</CPagination>
-```
-
-## Sizing
-
-Fancy larger or smaller pagination? Add `size="lg"` or `size="sm"` for additional sizes.
-
-::: demo
-<CPagination size="lg" aria-label="Page navigation example">
-  <CPaginationItem href="#">Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination size="lg" aria-label="Page navigation example">
-  <CPaginationItem href="#">Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-```
-
-::: demo
-<CPagination size="sm" aria-label="Page navigation example">
-  <CPaginationItem href="#">Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination size="sm" aria-label="Page navigation example">
-  <CPaginationItem href="#">Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-```
-
-## Alignment
-
-Change the alignment of pagination components with `align` property.
-
-::: demo
-<CPagination align="center" aria-label="Page navigation example">
-  <CPaginationItem disabled>Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination align="center" aria-label="Page navigation example">
-  <CPaginationItem disabled>Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-```
-
-::: demo
-<CPagination align="end" aria-label="Page navigation example">
-  <CPaginationItem disabled>Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-:::
-```vue
-<CPagination align="end" aria-label="Page navigation example">
-  <CPaginationItem disabled>Previous</CPaginationItem>
-  <CPaginationItem href="#">1</CPaginationItem>
-  <CPaginationItem href="#">2</CPaginationItem>
-  <CPaginationItem href="#">3</CPaginationItem>
-  <CPaginationItem href="#">Next</CPaginationItem>
-</CPagination>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue pagination use 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.
-
-<ScssDocs file="_pagination.scss" capture="pagination-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CPagination :style="vars">...</CCard>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="pagination-variables"/>
-
-## API
-
-!!!include(./api/pagination/CPagination.api.md)!!!
-
-!!!include(./api/pagination/CPaginationItem.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/placeholder.md b/packages/docs/components/placeholder.md
deleted file mode 100644
index a18b0153..00000000
--- a/packages/docs/components/placeholder.md
+++ /dev/null
@@ -1,193 +0,0 @@
----
-title: Vue Placeholder Component
-name: Placeholder
-description: Use loading vue placeholders for your components or pages to indicate something may still be loading.
-other_frameworks: placeholder
----
-
-## About
-
-Placeholders 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.
-
-
-## Example
-
-In 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.
-
-In 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.
-
-
-:::demo
-<div class="d-flex justify-content-around">
-  <CCard style="width: 18rem">
-    <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-    <CCardBody>
-      <CCardTitle>Card title</CCardTitle>
-      <CCardText>
-        Some quick example text to build on the card title and make up the bulk of the card's
-        content.
-      </CCardText>
-      <CButton color="primary" href="#">Go somewhere</CButton>
-    </CCardBody>
-  </CCard>
-  <CCard style="width: 18rem">
-    <CCardImage as="svg" orientation="top" width="100%" height="162" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Placeholder" preserveAspectRatio="xMidYMid slice" focusable="false">
-      <title>Placeholder</title><rect width="100%" height="100%" fill="#868e96"></rect>
-    </CCardImage>  
-    <CCardBody>
-      <CCardTitle v-c-placeholder="{animation: 'glow', xs: 7}">
-        <CPlaceholder :xs="6" />
-      </CCardTitle>
-      <CCardText v-c-placeholder="{animation: 'glow'}">
-        <CPlaceholder :xs="7" />
-        <CPlaceholder :xs="4" />
-        <CPlaceholder :xs="4" />
-        <CPlaceholder :xs="6" />
-        <CPlaceholder :xs="8" />
-      </CCardText>
-      <CButton v-c-placeholder="{xs: 6}" color="primary" aria-hidden="true" disabled href="#" tabindex="-1"></CButton>
-    </CCardBody>
-  </CCard>
-</div>
-:::
-```vue
-<CCard style="width: 18rem">
-  <CCardImage orientation="top" :src="$withBase('/images/vue.jpg')" />
-  <CCardBody>
-    <CCardTitle>Card title</CCardTitle>
-    <CCardText>
-      Some quick example text to build on the card title and make up the bulk of the card's
-      content.
-    </CCardText>
-    <CButton color="primary" href="#">Go somewhere</CButton>
-  </CCardBody>
-</CCard>
-<CCard style="width: 18rem">
-  <CCardImage as="svg" orientation="top" width="100%" height="162" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Placeholder" preserveAspectRatio="xMidYMid slice" focusable="false">
-    <title>Placeholder</title><rect width="100%" height="100%" fill="#868e96"></rect>
-  </CCardImage>  
-  <CCardBody>
-    <CCardTitle v-c-placeholder="{animation: 'glow', xs: 7}">
-      <CPlaceholder :xs="6" />
-    </CCardTitle>
-    <CCardText v-c-placeholder="{animation: 'glow'}">
-      <CPlaceholder :xs="7" />
-      <CPlaceholder :xs="4" />
-      <CPlaceholder :xs="4" />
-      <CPlaceholder :xs="6" />
-      <CPlaceholder :xs="8" />
-    </CCardText>
-    <CButton v-c-placeholder="{xs: 6}" color="primary" aria-hidden="true" disabled href="#" tabindex="-1"></CButton>
-  </CCardBody>
-</CCard>
-```
-
-## How it works
-
-Create placeholders with the `<CPlaceholder>` component and a grid column propx (e.g., `:xs="6"`) to set the `width`. They can replace the text inside an element or be added as a modifier class to an existing component.
-
-We apply additional styling to `CButton`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.
-
-:::demo
-<p aria-hidden="true">
-  <CPlaceholder :xs="6" />
-</p>
-<CButton v-c-placeholder="{xs: 4}" color="primary" aria-hidden="true" disabled href="#" tabindex="-1"></CButton>
-:::
-```vue
-<p aria-hidden="true">
-  <CPlaceholder :xs="6" />
-</p>
-<CButton v-c-placeholder="{xs: 4}" color="primary" aria-hidden="true" disabled href="#" tabindex="-1"></CButton>
-```
-
-<Callout color="info">
-  The use of <code>aria-hidden="true"</code> only indicates that the element should be hidden to screen readers. The <strong>loading</strong> 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.
-</Callout>
-
-### Width
-
-You can change the `width` through grid column classes, width utilities, or inline styles.
-
-:::demo
-<CPlaceholder :xs="6" />
-<CPlaceholder class="w-75" />
-<CPlaceholder style="width: 30%" />
-:::
-```vue
-<CPlaceholder :xs="6" />
-<CPlaceholder class="w-75" />
-<CPlaceholder style="width: 30%" />
-```
-
-### Color
-
-By default, the `<CPlaceholder>` uses `currentColor`. This can be overridden with a custom color or utility class.
-
-:::demo
-<CPlaceholder :xs="12" />
-
-<CPlaceholder color="primary" :xs="12" />
-<CPlaceholder color="secondary" :xs="12" />
-<CPlaceholder color="success" :xs="12" />
-<CPlaceholder color="danger" :xs="12" />
-<CPlaceholder color="warning" :xs="12" />
-<CPlaceholder color="info" :xs="12" />
-<CPlaceholder color="light" :xs="12" />
-<CPlaceholder color="dark" :xs="12" />
-:::
-```vue
-<CPlaceholder :xs="12" />
-
-<CPlaceholder color="primary" :xs="12" />
-<CPlaceholder color="secondary" :xs="12" />
-<CPlaceholder color="success" :xs="12" />
-<CPlaceholder color="danger" :xs="12" />
-<CPlaceholder color="warning" :xs="12" />
-<CPlaceholder color="info" :xs="12" />
-<CPlaceholder color="light" :xs="12" />
-<CPlaceholder color="dark" :xs="12" />
-```
-
-### Sizing
-
-The size of `<CPlaceholder>`s are based on the typographic style of the parent element. Customize them with `size` prop: `lg`, `sm`, or `xs`.
-
-:::demo
-<CPlaceholder :xs="12" size="lg"/>
-<CPlaceholder :xs="12"/>
-<CPlaceholder :xs="12" size="sm"/>
-<CPlaceholder :xs="12" size="xs"/>
-:::
-```vue
-<CPlaceholder :xs="12" size="lg"/>
-<CPlaceholder :xs="12"/>
-<CPlaceholder :xs="12" size="sm"/>
-<CPlaceholder :xs="12" size="xs"/>
-```
-
-### Animation
-
-Animate placeholders with `animation="glow"` or `animation="wave"` to better convey the perception of something being _actively_ loaded.
-
-:::demo
-<CPlaceholder as="p" animation="glow">
-  <CPlaceholder :xs="12" />
-</CPlaceholder>  
-<CPlaceholder as="p" animation="wave">
-  <CPlaceholder :xs="12" />
-</CPlaceholder> 
-:::
-```vue
-<CPlaceholder as="p" animation="glow">
-  <CPlaceholder :xs="12" />
-</CPlaceholder>  
-
-<CPlaceholder as="p" animation="wave">
-  <CPlaceholder :xs="12" />
-</CPlaceholder> 
-```
-
-## API
-
-!!!include(./api/placeholder/CPlaceholder.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/popover.md b/packages/docs/components/popover.md
deleted file mode 100644
index d758ad80..00000000
--- a/packages/docs/components/popover.md
+++ /dev/null
@@ -1,213 +0,0 @@
----
-title: Vue Popover Component and Directive
-name: Popover
-description: Documentation and examples for adding Vue popovers, like those found in iOS, to any element on your site.
-other_frameworks: popover
----
-
-## Example
-
-### Component
-
-::: demo
-<CPopover title="Popover title" content="And here\’s some amazing content. It’s very engaging. Right?" placement="right">
-  <template #toggler="{ id, on }">
-    <CButton color="danger" size="lg" :aria-describedby="id" v-on="on">Click to toggle popover</CButton>
-  </template>
-</CPopover>
-:::
-```vue
-<CPopover title="Popover title" content="And here\’s some amazing content. It’s very engaging. Right?" placement="right">
-  <template #toggler="{ id, on }">
-    <CButton color="danger" size="lg" :aria-describedby="id" v-on="on">Click to toggle popover</CButton>
-  </template>
-</CPopover>
-```
-
-### Directive
-
-::: demo
-<CButton color="danger" size="lg" v-c-popover="{header: 'Popover title', content: 'And here\’s some amazing content. It’s very engaging. Right?', placement: 'right'}">Click to toggle popover</CButton>
-:::
-```vue
-<CButton color="danger" size="lg" v-c-popover="{header: 'Popover title', content: 'And here\’s some amazing content. It’s very engaging. Right?', placement: 'right'}">Click to toggle popover</CButton>
-```
-
-### Four directions
-
-Four options are available: top, right, bottom, and left aligned. Directions are mirrored when using CoreUI for Vue in RTL.
-
-#### Component
-
-::: demo
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="top">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on top</CButton>
-  </template>
-</CPopover>
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="right">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on right</CButton>
-  </template>
-</CPopover>
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="bottom">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on bottom</CButton>
-  </template>
-</CPopover>
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="left">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on left</CButton>
-  </template>
-</CPopover>
-:::
-```vue
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="top">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on top</CButton>
-  </template>
-</CPopover>
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="right">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on right</CButton>
-  </template>
-</CPopover>
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="bottom">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on bottom</CButton>
-  </template>
-</CPopover>
-<CPopover content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="left">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Popover on left</CButton>
-  </template>
-</CPopover>
-```
-
-#### Directive
-
-::: demo
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'top'}">Popover on top</CButton>
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'right'}">Popover on right</CButton>
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'bottom'}">Popover on bottom</CButton>
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'left'}">Popover on left</CButton>
-:::
-```vue
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'top'}">Popover on top</CButton>
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'right'}">Popover on right</CButton>
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'bottom'}">Popover on bottom</CButton>
-<CButton color="secondary" v-c-popover="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'left'}">Popover on left</CButton>
-```
-
-### Custom popovers
-
-You can customize the appearance of popovers using [CSS variables](#css-variables). We set a custom `style` to scope our custom appearance and use it to override some of the local CSS variables.
-
-::: demo
-<CPopover
-  content="This popover is themed via CSS variables."
-  placement="right"
-  title="Custom popover"
-  :style="customPopoverStyle"
->
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Custom popover</CButton>
-  </template>
-</CPopover>
-:::
-```vue
-<script setup>
-  const customPopoverStyle = {
-    '--cui-popover-max-width': '200px',
-    '--cui-popover-border-color': 'var(--cui-primary)',
-    '--cui-popover-header-bg': 'var(--cui-primary)',
-    '--cui-popover-header-color': 'var(--cui-white)',
-    '--cui-popover-body-padding-x': '1rem',
-    '--cui-popover-body-padding-y': '.5rem',
-  }
-</script>
-<template>
-  <CPopover
-    content="This popover is themed via CSS variables."
-    placement="right"
-    title="Custom popover"
-    :style="customPopoverStyle"
-  >
-    <template #toggler="{ id, on }">
-      <CButton color="secondary" :aria-describedby="id" v-on="on">Custom popover</CButton>
-    </template>
-  </CPopover>
-</template>
-```
-
-## Usage
-
-### Disabled elements
-
-Elements 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"`.
-
-For disabled popover triggers, you may also prefer `: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.
-
-:::demo
-<CPopover
-  content="Disabled popover"
-  placement="right"
-  :trigger="['hover', 'focus']"
->
-  <template #toggler="{ id, on }">
-    <span class="d-inline-block" :tabindex="0" :aria-describedby="id" v-on="on">
-      <CButton color="primary" disabled>Disabled button</CButton>
-    </span>
-  </template>
-</CPopover>
-:::
-```vue
-<CPopover
-  content="Disabled popover"
-  placement="right"
-  :trigger="['hover', 'focus']"
->
-  <template #toggler="{ id, on }">
-    <span class="d-inline-block" :tabindex="0" :aria-describedby="id" v-on="on">
-      <CButton color="primary" disabled>Disabled button</CButton>
-    </span>
-  </template>
-</CPopover>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue popovers 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.
-
-<ScssDocs file="_popover.scss" capture="popover-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CPopover :style="vars">...</CPopover>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="popover-variables"/>
-
-## API
-
-!!!include(./api/popover/CPopover.api.md)!!!
-
-<script setup>
-  const customPopoverStyle = {
-    '--cui-popover-max-width': '200px',
-    '--cui-popover-border-color': 'var(--cui-primary)',
-    '--cui-popover-header-bg': 'var(--cui-primary)',
-    '--cui-popover-header-color': 'var(--cui-white)',
-    '--cui-popover-body-padding-x': '1rem',
-    '--cui-popover-body-padding-y': '.5rem',
-  }
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/progress.md b/packages/docs/components/progress.md
deleted file mode 100644
index 335bae35..00000000
--- a/packages/docs/components/progress.md
+++ /dev/null
@@ -1,226 +0,0 @@
----
-title: Vue Progress Component
-name: Progress
-description: Documentation and examples for using Vue progress bars featuring support for stacked bars, animated backgrounds, and text labels.
-other_frameworks: progress
----
-
-## Example
-
-Progress 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.
-
-## Basic usage
-
-::: demo
-<CProgress :value="0"/>
-<CProgress :value="25"/>
-<CProgress :value="50"/>
-<CProgress :value="75"/>
-<CProgress :value="100"/>
-:::
-```vue
-<CProgress :value="0"/>
-<CProgress :value="25"/>
-<CProgress :value="50"/>
-<CProgress :value="75"/>
-<CProgress :value="100"/>
-```
-
-## Labels
-
-Add labels to your progress bars by placing text within the `<CProgressBar>`.
-
-::: demo
-<CProgress :value="25">25%</CProgress>
-:::
-```vue
-<CProgress :value="25">25%</CProgress>
-```
-
-Please note that the default setting for the content within the `<CProgressBar />` is to be limited by the `overflow: hidden property`, preventing it from extending beyond the bar's boundaries. If the progress bar is shorter than its label, the content will be truncated and could be difficult to read. To modify this behavior, you can utilize the `.overflow-visible` class from the overflow utilities. However, it is important to specify a specific text color to ensure readability. It's worth noting that this approach currently does not consider color modes.
-
-:::demo
-<CProgress :value="10" color="success">
-  <CProgressBar class="overflow-visible text-dark px-2">Long label text for the progress bar, set to a dark color</CProgressBar>
-</CProgress>
-:::
-```vue
-<CProgress :value="10" color="success">
-  <CProgressBar class="overflow-visible text-dark px-2">Long label text for the progress bar, set to a dark color</CProgressBar>
-</CProgress>
-```
-
-Since **v5.0.0** you can also use the `progressBarClassName` property directly on the `<CProgress />` component to achieve the same.
-
-```vue
-<CProgress progressBarClassName="overflow-visible text-dark px-2" color="success" :value="10">Long label text for the progress bar, set to a dark color</CProgress>
-```
-
-## Height
-
-We only set a `height` value on the `<CProgress>`, so if you change that value the inner `<CProgressBar>` will automatically resize accordingly.
-
-::: demo
-<CProgress :height="1" :value="25" />
-<CProgress :height="20" :value="25" />
-:::
-```vue
-<CProgress :height="1" :value="25" />
-<CProgress :height="20" :value="25" />
-```
-
-## Backgrounds
-
-Use `color` prop to change the appearance of individual progress bars.
-
-::: demo
-<CProgress color="success" :value="25"/>
-<CProgress color="info" :value="50"/>
-<CProgress color="warning" :value="75"/>
-<CProgress color="danger" :value="100"/>
-:::
-```vue
-<CProgress color="success" :value="25"/>
-<CProgress color="info" :value="50"/>
-<CProgress color="warning" :value="75"/>
-<CProgress color="danger" :value="100"/>
-```
-
-Ensure that when you incorporate labels into progress bars featuring a custom background color, you also select an appropriate text color to ensure readability and maintain adequate contrast for the labels.
-
-::: demo
-<CProgress color="success" :value="25">
-  <CProgressBar>25%</CProgressBar>
-</CProgress>
-<CProgress color="info" :value="50">
-  <CProgressBar class="text-dark">50%</CProgressBar>
-</CProgress>
-<CProgress color="warning" :value="75">
-  <CProgressBar class="text-dark">75%</CProgressBar>
-</CProgress>
-<CProgress color="danger" :value="100">
-  <CProgressBar>100%</CProgressBar>
-</CProgress>
-:::
-```vue
-<CProgress color="success" :value="25">
-  <CProgressBar>25%</CProgressBar>
-</CProgress>
-<CProgress color="info" :value="50">
-  <CProgressBar class="text-dark">50%</CProgressBar>
-</CProgress>
-<CProgress color="warning" :value="75">
-  <CProgressBar class="text-dark">75%</CProgressBar>
-</CProgress>
-<CProgress color="danger" :value="100">
-  <CProgressBar>100%</CProgressBar>
-</CProgress>
-```
-
-
-Since **v5.0.0** you can also use the `progressBarClassName` property directly on the `<CProgress />` component to achieve the same.
-
-```vue
-<CProgress color="success" :value="25">25%</CProgress>
-<CProgress color="info" progressBarClassName="text-dark" :value="50">50%</CProgress>
-<CProgress color="warning" progressBarClassName="text-dark" :value="75">75%</CProgress>
-<CProgress color="danger" :value="100">100%</CProgress>
-```
-
-## Multiple bars
-
-Include multiple progress bars in a progress component if you need.
-
-<Callout color="info" title="New markup in v5.0.0">
-  In version 5.0.0, we introduced a new <code>&lt;CProgressStacked&gt;</code> component to more logically wrap multiple progress bars into a single stacked progress bar. The previous structure will continue to work until the next major version.
-</Callout>
-
-
-**New markup**
-
-::: demo
-<CProgressStacked>
-  <CProgress :value="15" />
-  <CProgress color="success" :value="30" />
-  <CProgress color="info" :value="20" />
-</CProgressStacked>
-:::
-```vue
-<CProgressStacked>
-  <CProgress :value="15" />
-  <CProgress color="success" :value="30" />
-  <CProgress color="info" :value="20" />
-</CProgressStacked>
-```
-
-
-**Previous markup**
-```vue
-<CProgress>
-  <CProgressBar :value="15" />
-  <CProgressBar color="success" :value="30" />
-  <CProgressBar color="info" :value="20" />
-</CProgress>
-```
-
-## Striped
-
-Add `variant="striped"` to any `<CProgressBar>` to apply a stripe via CSS gradient over the progress bar's background color.
-
-::: demo
-<CProgress color="success" variant="striped" :value="25"/>
-<CProgress color="info" variant="striped" :value="50"/>
-<CProgress color="warning" variant="striped" :value="75"/>
-<CProgress color="danger" variant="striped" :value="100"/>
-:::
-```vue
-<CProgress color="success" variant="striped" :value="25"/>
-<CProgress color="info" variant="striped" :value="50"/>
-<CProgress color="warning" variant="striped" :value="75"/>
-<CProgress color="danger" variant="striped" :value="100"/>
-```
-
-## Animated stripes
-
-The striped gradient can also be animated. Add `animated` property to `<CProgressBar>` to animate the stripes right to left via CSS3 animations.
-
-::: demo
-<CProgress color="success" variant="striped" animated :value="25"/>
-<CProgress color="info" variant="striped" animated :value="50"/>
-<CProgress color="warning" variant="striped" animated :value="75"/>
-<CProgress color="danger" variant="striped" animated :value="100"/>
-:::
-```vue
-<CProgress color="success" variant="striped" animated :value="25"/>
-<CProgress color="info" variant="striped" animated :value="50"/>
-<CProgress color="warning" variant="striped" animated :value="75"/>
-<CProgress color="danger" variant="striped" animated :value="100"/>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue cards 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.
-
-<ScssDocs file="_progress.scss" capture="progress-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CProgress :style="vars">...</CProgress>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="progress-variables"/>
-
-## API
-
-!!!include(./api/progress/CProgress.api.md)!!!
-
-!!!include(./api/progress/CProgressBar.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/sidebar.md b/packages/docs/components/sidebar.md
deleted file mode 100644
index b59d1f54..00000000
--- a/packages/docs/components/sidebar.md
+++ /dev/null
@@ -1,409 +0,0 @@
----
-title: Vue Sidebar Component
-name: Sidebar
-description: Vue Sidebar is a powerful and customizable responsive navigation component for any type of vertical navigation. Bootstrap Sidebar come with built-in support for branding, navigation, and more.
-other_frameworks: sidebar
----
-
-## Supported content
-
-Sidebar come with built-in support for a handful of sub-components. Choose from the following as needed:
-
-- `<CSidebarHeader>` for optional header.
-- `<CSidebarBrand>` for your company, product, or project name.
-- `<CSidebarNav>` for a full-height and lightweight navigation (including support for dropdowns).
-- `<CSidebarFooter>` for optional footer.
-- `<CSidebarToggler>` for use with our minimizer plugin.
-
-## Examples
-
-### Sidebar component
-
-Below is an sidebar example that is shown by default on desktop devices.
-
-::: demo-bg-secondary
-<CSidebar>
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CoreUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> Nav item
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> With badge
-      <CBadge class="ms-auto" color="primary">NEW</CBadge>
-    </CNavItem>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown2
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" /> Download CoreUI
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" /> Try CoreUI PRO
-    </CNavItem>
-  </CSidebarNav>
-  <CSidebarFooter class="border-top">
-    <CSidebarToggler/>
-  </CSidebarFooter>
-</CSidebar>
-:::
-```vue
-<CSidebar>
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CoreUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> Nav item
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> With badge
-      <CBadge class="ms-auto" color="primary">NEW</CBadge>
-    </CNavItem>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown2
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" /> Download CoreUI
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" /> Try CoreUI PRO
-    </CNavItem>
-  </CSidebarNav>
-  <CSidebarFooter class="border-top">
-    <CSidebarToggler/>
-  </CSidebarFooter>
-</CSidebar>
-```
-
-### Narrow sidebar
-
-Add the `narrow` property to make the sidebar narrow.
-
-::: demo-bg-secondary
-<CSidebar narrow>
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/>
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/>
-    </CNavItem>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" />
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" />
-    </CNavItem>
-  </CSidebarNav>
-</CSidebar>
-:::
-```vue
-<CSidebar narrow>
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/>
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/>
-    </CNavItem>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" />
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" />
-    </CNavItem>
-  </CSidebarNav>
-</CSidebar>
-```
-
-### Unfoldable sidebar
-
-Add the `unfoldable` property to make the sidebar narrow with unfoldable on hover.
-
-::: demo-bg-secondary
-<CSidebar unfoldable>
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> Nav item
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> With badge
-      <CBadge class="ms-auto" color="primary">NEW</CBadge>
-    </CNavItem>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown2
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" /> Download CoreUI
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" /> Try CoreUI PRO
-    </CNavItem>
-  </CSidebarNav>
-</CSidebar>
-:::
-```vue
-<CSidebar unfoldable>
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> Nav item
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> With badge
-      <CBadge class="ms-auto" color="primary">NEW</CBadge>
-    </CNavItem>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown2
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" /> Download CoreUI
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" /> Try CoreUI PRO
-    </CNavItem>
-  </CSidebarNav>
-</CSidebar>
-```
-
-## Dark sidebar
-
-Change the appearance of sidebars with the `colorScheme="dark"`.
-
-::: demo-bg-secondary
-<CSidebar colorScheme="dark">
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CoreUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> Nav item
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> With badge
-      <CBadge class="ms-auto" color="primary">NEW</CBadge>
-    </CNavItem>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown2
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" /> Download CoreUI
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" /> Try CoreUI PRO
-    </CNavItem>
-  </CSidebarNav>
-  <CSidebarFooter class="border-top">
-    <CSidebarToggler/>
-  </CSidebarFooter>
-</CSidebar>
-:::
-```vue
-<CSidebar colorScheme="dark">
-  <CSidebarHeader class="border-bottom">
-    <CSidebarBrand>CoreUI</CSidebarBrand>
-  </CSidebarHeader>
-  <CSidebarNav>
-    <CNavTitle>Nav Title</CNavTitle>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> Nav item
-    </CNavItem>
-    <CNavItem href="#">
-      <CIcon  customClassName="nav-icon" icon="cil-speedometer"/> With badge
-      <CBadge class="ms-auto" color="primary">NEW</CBadge>
-    </CNavItem>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavGroup>
-      <template #togglerContent>
-        <CIcon  customClassName="nav-icon" icon="cil-puzzle"/> Nav dropdown2
-      </template>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-      <CNavItem href="#">
-        <span class="nav-icon"><span class="nav-icon-bullet"></span></span> Nav dropdown item
-      </CNavItem>
-    </CNavGroup>
-    <CNavItem href="https://coreui.io">
-      <CIcon customClassName="nav-icon" icon="cil-cloud-download" /> Download CoreUI
-    </CNavItem>
-    <CNavItem href="https://coreui.io/pro/">
-      <CIcon customClassName="nav-icon" icon="cil-layers" /> Try CoreUI PRO
-    </CNavItem>
-  </CSidebarNav>
-  <CSidebarFooter class="border-top">
-    <CSidebarToggler/>
-  </CSidebarFooter>
-</CSidebar>
-```
-
-## Placement
-
-By default placement for sidebar components is on the left of the viewport, but you can add one of the modifier classes below.
-
-- `placement="start"` places sidebar on the left of the viewport (shown above)
-- `placement="end"` places sidebar on the right of the viewport
-
-## Customizing
-
-### CSS variables
-
-Vue sidebars use local CSS variables on `.sidebar` and `.sidebar-backdrop` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-<ScssDocs file="sidebar/_sidebar.scss" capture="sidebar-css-vars" />
-
-<ScssDocs file="sidebar/_sidebar.scss" capture="sidebar-overlaid-css-vars" />
-
-<ScssDocs file="sidebar/_sidebar-narrow.scss" capture="sidebar-narrow-css-vars" />
-
-<ScssDocs file="sidebar/_sidebar-nav.scss" capture="sidebar-nav-css-vars" />
-
-<ScssDocs file="sidebar/_sidebar.scss" capture="sidebar-toggler-css-vars" />
-
-<ScssDocs file="sidebar/_sidebar.scss" capture="sidebar-backdrop-css-vars" />
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CSidebar :style="vars">...</CSidebar>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="sidebar-variables" />
-
-<ScssDocs file="_variables.scss" capture="sidebar-toggler" />
-
-## API
-
-!!!include(./api/sidebar/CSidebar.api.md)!!!
diff --git a/packages/docs/components/spinner.md b/packages/docs/components/spinner.md
deleted file mode 100644
index f6a9eaac..00000000
--- a/packages/docs/components/spinner.md
+++ /dev/null
@@ -1,175 +0,0 @@
----
-title: Vue Spinner Component
-name: Spinner
-description: Indicate the loading state of a component or page with CoreUI spinners, built entirely with HTML, CSS, and no JavaScript.
-other_frameworks: spinner
----
-
-## About
-
-CoreUI "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.
-
-For accessibility purposes, each loader here includes `role="status"` and a nested `<span class="visually-hidden">Loading...</span>`.
-
-## Border spinner
-
-Use the border spinners for a lightweight loading indicator.
-
-## Basic usage
-
-::: demo
-<CSpinner/>
-:::
-```vue
-<CSpinner/>
-```
-
-### Colors
-
-The border spinner uses `currentColor` for its `border-color`. You can use any of our text color utilities on the standard spinner.
-
-::: demo
-<CSpinner color="primary"/>
-<CSpinner color="secondary"/>
-<CSpinner color="success"/>
-<CSpinner color="danger"/>
-<CSpinner color="warning"/>
-<CSpinner color="info"/>
-<CSpinner color="light"/>
-<CSpinner color="dark"/>
-:::
-```vue
-<CSpinner color="primary"/>
-<CSpinner color="secondary"/>
-<CSpinner color="success"/>
-<CSpinner color="danger"/>
-<CSpinner color="warning"/>
-<CSpinner color="info"/>
-<CSpinner color="light"/>
-<CSpinner color="dark"/>
-```
-
-## Growing spinner
-
-If you don't fancy a border spinner, switch to the grow spinner. While it doesn't technically spin, it does repeatedly grow!
-
-::: demo
-<CSpinner variant="grow"/>
-:::
-```vue
-<CSpinner variant="grow"/>
-```
-
-Once again, this spinner is built with `currentColor`, so you can easily change its appearance. Here it is in blue, along with the supported variants.
-
-::: demo
-<CSpinner color="primary" variant="grow"/>
-<CSpinner color="secondary" variant="grow"/>
-<CSpinner color="success" variant="grow"/>
-<CSpinner color="danger" variant="grow"/>
-<CSpinner color="warning" variant="grow"/>
-<CSpinner color="info" variant="grow"/>
-<CSpinner color="light" variant="grow"/>
-<CSpinner color="dark" variant="grow"/>
-:::
-```vue
-<CSpinner color="primary" variant="grow"/>
-<CSpinner color="secondary" variant="grow"/>
-<CSpinner color="success" variant="grow"/>
-<CSpinner color="danger" variant="grow"/>
-<CSpinner color="warning" variant="grow"/>
-<CSpinner color="info" variant="grow"/>
-<CSpinner color="light" variant="grow"/>
-<CSpinner color="dark" variant="grow"/>
-```
-
-## Size
-
-Add `size="sm"`property` to make a smaller spinner that can quickly be used within other components.
-
-::: demo
-<CSpinner size="sm"/>
-<CSpinner size="sm" variant="grow"/>
-:::
-```vue
-<CSpinner size="sm"/>
-<CSpinner size="sm" variant="grow"/>
-```
-
-## Buttons
-
-Use 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.
-
-::: demo
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" aria-hidden="true"/>
-</CButton>
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" aria-hidden="true"/>
-  Loading...
-</CButton>
-:::
-```vue
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" aria-hidden="true"/>
-</CButton>
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" aria-hidden="true"/>
-  Loading...
-</CButton>
-```
-
-::: demo
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" variant="grow" aria-hidden="true"/>
-</CButton>
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" variant="grow" aria-hidden="true"/>
-  Loading...
-</CButton>
-:::
-```vue
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" variant="grow" aria-hidden="true"/>
-</CButton>
-<CButton color="primary" disabled>
-  <CSpinner as="span" size="sm" variant="grow" aria-hidden="true"/>
-  Loading...
-</CButton>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue spinners 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.
-
-Border spinner variables:
-
-<ScssDocs file="_spinners.scss" capture="spinner-border-css-vars"/>
-
-Growing spinner variables:
-
-<ScssDocs file="_spinners.scss" capture="spinner-grow-css-vars"/>
-
-For 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:
-
-<ScssDocs file="_spinners.scss" capture="spinner-border-sm-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CSpinner :style="vars">...</CSpinner>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="spinner-variables"/>
-
-## API
-
-!!!include(./api/spinner/CSpinner.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/table.md b/packages/docs/components/table.md
deleted file mode 100644
index 06994d69..00000000
--- a/packages/docs/components/table.md
+++ /dev/null
@@ -1,1926 +0,0 @@
----
-title: Vue Table Component
-name: Table
-description: Documentation and examples for opt-in styling of tables.
-other_frameworks: table
----
-
-## How to use Vue Table Component
-
-Due to the widespread use of `<CTable>` elements across third-party widgets like calendars and date pickers, CoreUI's tables are **opt-in**. All table styles are not inherited in CoreUI, meaning any nested tables can be styled independent from the parent.
-
-Using the most basic table CoreUI, here's how `<CTable>`-based tables look in CoreUI.
-
-::: demo-rounded
-<CTable :columns="columns" :items="items" />
-:::
-
-In version **4.5.0** we introduced a new way to create a table, similarly to our [Smart Table component](https://coreui.io/vue/docs/components/smart-table.html).
-
-```vue
-<script setup>
-  const columns = [
-    {
-      key: 'id',
-      label: '#',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'class',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_1',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_2',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-  ]
-  const items = [
-    {
-      id: 1,
-      class: 'Mark',
-      heading_1: 'Otto',
-      heading_2: '@mdo',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 2,
-      class: 'Jacob',
-      heading_1: 'Thornton',
-      heading_2: '@fat',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 3,
-      class: 'Larry the Bird',
-      heading_2: '@twitter',
-      _cellProps: { id: { scope: 'row' }, class: { colSpan: 2 } },
-    },
-  ]
-</script>
-<template>
-  <CTable :columns="columns" :items="items" />
-</template>
-```
-
-You can also put all table components together manually as hitherto.
-
-```vue
-<CTable>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-## Variants
-
-Use contextual classes to color tables, table rows or individual cells.
-
-::: demo
-<CTable :columns="columnsVariantExample" :items="itemsVariantExample" />
-:::
-
-```vue
-<CTable>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">Default</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="primary">
-      <CTableHeaderCell scope="row">Primary</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="secondary">
-      <CTableHeaderCell scope="row">Secondary</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="success">
-      <CTableHeaderCell scope="row">Success</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="danger">
-      <CTableHeaderCell scope="row">Danger</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="warning">
-      <CTableHeaderCell scope="row">Warning</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="info">
-      <CTableHeaderCell scope="row">Info</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="light">
-      <CTableHeaderCell scope="row">Light</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow color="dark">
-      <CTableHeaderCell scope="row">Dark</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-Since version **4.5.0** also this way.
-
-```vue
-<script setup>
-  const columnsVariantExample = [
-    { key: 'class', _props: { scope: 'col' } },
-    { key: 'heading_1', label: 'Heading', _props: { scope: 'col' } },
-    { key: 'heading_2', label: 'Heading', _props: { scope: 'col' } },
-  ]
-  const itemsVariantExample = [
-    {
-      class: 'Default',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-    },
-    {
-      class: 'Primary',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'primary' },
-    },
-    {
-      class: 'Secondary',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'secondary' },
-    },
-    {
-      class: 'Success',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'success' },
-    },
-    {
-      class: 'Danger',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'danger' },
-    },
-    {
-      class: 'Warning',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'warning' },
-    },
-    {
-      class: 'Info',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'info' },
-    },
-    {
-      class: 'Light',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'light' },
-    },
-    {
-      class: 'Dark',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'dark' },
-    },
-  ]
-</script>
-<template>
-  <CTable :columns="columnsVariantExample" :items="itemsVariantExample" />
-</template>
-```
-
-## Accented tables
-
-### Striped rows
-
-Use `striped` property to add zebra-striping to any table row within the `<CTableBody>`.
-
-::: demo
-<CTable striped>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable striped>
-  ...
-</CTable>
-```
-
-### Striped columns
-
-Use `stripedColumns` boolean property to add zebra-striping to any table column.
-
-::: demo
-<CTable stripedColumns>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colSpan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-
-```vue
-<CTable stripedColumns>
-  ...
-</CTable>
-```
-
-These classes can also be added to table variants:
-
-::: demo
-<CTable color="dark" striped>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable color="dark" striped>
-  ...
-</CTable>
-```
-
-::: demo
-<CTable color="dark" stripedColumns>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable color="dark" stripedColumns>
-  ...
-</CTable>
-```
-
-::: demo
-<CTable color="success" striped>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable color="success" striped>
-  ...
-</CTable>
-```
-
-::: demo
-<CTable color="success" stripedColumns>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable color="success" striped>
-  ...
-</CTable>
-```
-
-### Hoverable rows
-
-Use `hover` property to enable a hover state on table rows within a `<CTableBody>`.
-
-::: demo
-<CTable hover>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable hover>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-::: demo
-<CTable color="dark" hover>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable color="dark" hover>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-These hoverable rows can also be combined with the striped variant:
-
-::: demo
-<CTable striped hover>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable striped hover>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-### Active tables
-
-Highlight a table row or cell by adding a `active` property.
-
-::: demo-rounded
-<CTable :columns="columnsActiveTableExample" :items="itemsActiveTableExample" />
-:::
-
-As mentioned before since version **4.5.0** we have two ways to generate tables, also with custom properties for rows, and cells.
-
-```vue
-<script setup>
-  const columnsActiveTableExample = [
-    {
-      key: 'id',
-      label: '#',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'class',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_1',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_2',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-  ]
-  const itemsActiveTableExample = [
-    {
-      id: 1,
-      class: 'Mark',
-      heading_1: 'Otto',
-      heading_2: '@mdo',
-      _props: { active: true },
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 2,
-      class: 'Jacob',
-      heading_1: 'Thornton',
-      heading_2: '@fat',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 3,
-      class: 'Larry the Bird',
-      heading_2: '@twitter',
-      _cellProps: { id: { scope: 'row' }, class: { active: true, colSpan: 2 } },
-    },
-  ]
-</script>
-<template>
-  <CTable :columns="columnsActiveTableExample" :items="itemsActiveTableExample" />
-</template>
-```
-
-```vue
-<CTable>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow active>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2" active>Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-::: demo
-<CTable color="dark" :columns="columnsActiveTableExample" :items="itemsActiveTableExample" />
-:::
-```vue
-<script setup>
-  const columnsActiveTableExample = [
-    {
-      key: 'id',
-      label: '#',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'class',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_1',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_2',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-  ]
-  const itemsActiveTableExample = [
-    {
-      id: 1,
-      class: 'Mark',
-      heading_1: 'Otto',
-      heading_2: '@mdo',
-      _props: { active: true },
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 2,
-      class: 'Jacob',
-      heading_1: 'Thornton',
-      heading_2: '@fat',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 3,
-      class: 'Larry the Bird',
-      heading_2: '@twitter',
-      _cellProps: { id: { scope: 'row' }, class: { active: true, colSpan: 2 } },
-    },
-  ]
-</script>
-<template>
-  <CTable color="dark" :columns="columnsActiveTableExample" :items="itemsActiveTableExample" />
-</template>
-```
-
-## Table borders
-
-### Bordered tables
-
-Add `bordered` property for borders on all sides of the table and cells.
-
-::: demo
-<CTable bordered :columns="columns" :items="items" />
-:::
-```vue
-<CTable bordered>
-  ...
-</CTable>
-```
-
-[Border color utilities](https://coreui.io/docs/4.0/utilities/borders#border-color) can be added to change colors:
-
-::: demo
-<CTable bordered border-color="primary" :columns="columns" :items="items" />
-:::
-```vue
-<CTable bordered border-color="primary">
-  ...
-</CTable>
-```
-
-### Tables without borders
-
-Add `borderless` property for a table without borders.
-
-::: demo
-<CTable borderless :columns="columns" :items="items" />
-:::
-```vue
-<CTable borderless>
-  ...
-</CTable>
-```
-
-::: demo
-<CTable color="dark" borderless :columns="columns" :items="items" />
-:::
-```vue
-<CTable color="dark" borderless>
-  ...
-</CTable>
-```
-
-## Small tables
-
-Add `small` property to make any `<CTable>` more compact by cutting all cell `padding` in half.
-
-::: demo
-<CTable small :columns="columns" :items="items" />
-:::
-```vue
-<CTable small>
-  ...
-</CTable>
-```
-
-## Vertical alignment
-
-Table cells of `<CTableHead>` are always vertical aligned to the bottom. Table cells in `<CTableBody>` inherit their alignment from `<CTable>` and are aligned to the the top by default. Use the align property to re-align where needed.
-
-::: demo
-<CTable align="middle" reponsive>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col" class="w-25">Heading 1</CTableHeaderCell>
-      <CTableHeaderCell scope="col" class="w-25">Heading 2</CTableHeaderCell>
-      <CTableHeaderCell scope="col" class="w-25">Heading 3</CTableHeaderCell>
-      <CTableHeaderCell scope="col" class="w-25">Heading 4</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonsCTableRowate how the vertical alignment works in the preceding cells.</CTableDataCell>
-    </CTableRow>
-    <CTableRow align="bottom">
-      <CTableDataCell>This cell inherits <code>vertical-align: bottom;</code> from the table row</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: bottom;</code> from the table row</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: bottom;</code> from the table row</CTableDataCell>
-      <CTableDataCell>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonsCTableRowate how the vertical alignment works in the preceding cells.</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell align="top">This cell is aligned to the top.</CTableDataCell>
-      <CTableDataCell>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonsCTableRowate how the vertical alignment works in the preceding cells.</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable> 
-:::
-```vue
-<CTable align="middle" reponsive>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col" class="w-25">Heading 1</CTableHeaderCell>
-      <CTableHeaderCell scope="col" class="w-25">Heading 2</CTableHeaderCell>
-      <CTableHeaderCell scope="col" class="w-25">Heading 3</CTableHeaderCell>
-      <CTableHeaderCell scope="col" class="w-25">Heading 4</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonsCTableRowate how the vertical alignment works in the preceding cells.</CTableDataCell>
-    </CTableRow>
-    <CTableRow align="bottom">
-      <CTableDataCell>This cell inherits <code>vertical-align: bottom;</code> from the table row</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: bottom;</code> from the table row</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: bottom;</code> from the table row</CTableDataCell>
-      <CTableDataCell>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonsCTableRowate how the vertical alignment works in the preceding cells.</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell>This cell inherits <code>vertical-align: middle;</code> from the table</CTableDataCell>
-      <CTableDataCell align="top">This cell is aligned to the top.</CTableDataCell>
-      <CTableDataCell>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonsCTableRowate how the vertical alignment works in the preceding cells.</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable> 
-```
-
-## Nesting
-
-Border styles, active styles, and table variants are not inherited by nested tables.
-
-::: demo
-<CTable striped>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell colspan="4">
-        <CTable>
-          <CTableHead>
-            <CTableRow>
-              <CTableHeaderCell scope="col">Header</CTableHeaderCell>
-              <CTableHeaderCell scope="col">Header</CTableHeaderCell>
-              <CTableHeaderCell scope="col">Header</CTableHeaderCell>
-            </CTableRow>
-          </CTableHead>
-          <CTableBody>
-            <CTableRow>
-              <CTableHeaderCell scope="row">A</CTableHeaderCell>
-              <CTableDataCell>First</CTableDataCell>
-              <CTableDataCell>Last</CTableDataCell>
-            </CTableRow>
-            <CTableRow>
-              <CTableHeaderCell scope="row">B</CTableHeaderCell>
-              <CTableDataCell>First</CTableDataCell>
-              <CTableDataCell>Last</CTableDataCell>
-            </CTableRow>
-            <CTableRow>
-              <CTableHeaderCell scope="row">C</CTableHeaderCell>
-              <CTableDataCell>First</CTableDataCell>
-              <CTableDataCell>Last</CTableDataCell>
-            </CTableRow>
-          </CTableBody>
-        </CTable>
-      </CTableHeaderCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable striped>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell colspan="4">
-        <CTable>
-          <CTableHead>
-            <CTableRow>
-              <CTableHeaderCell scope="col">Header</CTableHeaderCell>
-              <CTableHeaderCell scope="col">Header</CTableHeaderCell>
-              <CTableHeaderCell scope="col">Header</CTableHeaderCell>
-            </CTableRow>
-          </CTableHead>
-          <CTableBody>
-            <CTableRow>
-              <CTableHeaderCell scope="row">A</CTableHeaderCell>
-              <CTableDataCell>First</CTableDataCell>
-              <CTableDataCell>Last</CTableDataCell>
-            </CTableRow>
-            <CTableRow>
-              <CTableHeaderCell scope="row">B</CTableHeaderCell>
-              <CTableDataCell>First</CTableDataCell>
-              <CTableDataCell>Last</CTableDataCell>
-            </CTableRow>
-            <CTableRow>
-              <CTableHeaderCell scope="row">C</CTableHeaderCell>
-              <CTableDataCell>First</CTableDataCell>
-              <CTableDataCell>Last</CTableDataCell>
-            </CTableRow>
-          </CTableBody>
-        </CTable>
-      </CTableHeaderCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-## Anatomy
-
-### Table head
-
-Similar to tables and dark tables, use the modifier prop `color="light"` or `color="dark"` to make `<CTableHead>`s appear light or dark gray.
-
-::: demo
-<CTable>
-  <CTableHead color="light">
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Larry</CTableDataCell>
-      <CTableDataCell>the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable>
-  <CTableHead color="light">
-    ...
-  </CTableHead>
-  <CTableBody>
-    ...
-  </CTableBody>
-</CTable>
-```
-
-If you generate a table using the new method incorporated in version **4.5.0**, you have to use tableHeadProps property to pass properties to the table header component.
-
-```vue
-<script setup>
-  const columns = [ ... ]
-  const items = [ ... ]
-</script>
-<template>
-  <CTable :columns="columns" :items="items" :tableHeadProps="{ color: 'light' }" />
-</template>
-```
-
-::: demo
-<CTable>
-  <CTableHead color="dark">
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable>
-  <CTableHead color="dark">
-    ...
-  </CTableHead>
-  <CTableBody>
-    ...
-  </CTableBody>
-</CTable>
-```
-
-Starting from version **4.5.0** also this way.
-
-```vue
-<script setup>
-  const columns = [ ... ]
-  const items = [ ... ]
-</script>
-<template>
-  <CTable :columns="columns" :items="items" :tableHeadProps="{ color: 'dark' }" />
-</template>
-```
-
-### Table foot
-
-::: demo
-<CTable>
-  <CTableHead color="light">
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell colspan="2">Larry the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable>
-  <CTableHead color="light">
-    ...
-  </CTableHead>
-  <CTableBody>
-    ...
-  </CTableBody>
-  <CTableHead>
-    <CTableRow>
-      <CTableDataCell>Footer</CTableDataCell>
-      <CTableDataCell>Footer</CTableDataCell>
-      <CTableDataCell>Footer</CTableDataCell>
-      <CTableDataCell>Footer</CTableDataCell>
-    </CTableRow>
-  </CTableHead>
-</CTable>
-```
-
-Starting from version **4.5.0** also this way.
-
-```vue
-<script setup>
-  const columns = [ ... ]
-  const footer = [
-    'Footer',
-    'Footer',
-    'Footer',
-    'Footer',
-  ]
-  const items = [ ... ]
-</script>
-<template>
-  <CTable :columns="columns" :footer="footer" :items="items" :tableHeadProps="{ color: 'dark' }" />
-</template>
-```
-
-### Captions
-
-A `<CTableCaption>` 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.
-
-::: demo
-<CTable>
-  <CTableCaption>List of users</CTableCaption>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Larry</CTableDataCell>
-      <CTableDataCell>the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable>
-  <CTableCaption>List of users</CTableCaption>
-  <CTableHead>
-    ...
-  </CTableHead>
-  <CTableBody>
-    ...
-  </CTableBody>
-</CTable>
-```
-
-Starting from version **4.5.0** also this way.
-
-```vue
-<script setup>
-  const columns = [ ... ]
-  const items = [ ... ]
-</script>
-<template>
-  <CTable caption="List of users" :columns="columns" :items="items"  />
-</template>
-```
-
-You can also put the `<CTableCaption>` on the top of the table with `caption="top"`.
-
-::: demo
-<CTable caption="top">
-  <CTableCaption>List of users</CTableCaption>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Larry</CTableDataCell>
-      <CTableDataCell>the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable caption="top">
-  <CTableCaption>List of users</CTableCaption>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Class</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Mark</CTableDataCell>
-      <CTableDataCell>Otto</CTableDataCell>
-      <CTableDataCell>@mdo</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Jacob</CTableDataCell>
-      <CTableDataCell>Thornton</CTableDataCell>
-      <CTableDataCell>@fat</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Larry</CTableDataCell>
-      <CTableDataCell>the Bird</CTableDataCell>
-      <CTableDataCell>@twitter</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-```
-
-Since version **4.5.0** also this way.
-
-```vue
-<script setup>
-  const columns = [ ... ]
-  const items = [ ... ]
-</script>
-<template>
-  <CTable captionTop="List of users" :columns="columns" :items="items"  />
-</template>
-```
-## Responsive tables
-
-Responsive tables allow tables to be scrolled horizontally with ease. Make any table responsive across all viewports by adding a `responsive` property. Or, pick a maximum breakpoint with which to have a responsive table up to by using `responsive="{-sm|-md|-lg|-xl|-xxl}"`.
-
-::: demo
-<CTable responsive>
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable responsive>
-  ...
-</CTable>
-```
-
-::: demo
-<CTable responsive="sm">
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable responsive="sm">
-  ...
-</CTable>
-```
-
-::: demo
-<CTable responsive="md">
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable responsive="md">
-  ...
-</CTable>
-```
-
-::: demo
-<CTable responsive="lg">
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable responsive="lg">
-  ...
-</CTable>
-```
-
-::: demo
-<CTable responsive="xl">
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable responsive="xl">
-  ...
-</CTable>
-```
-
-::: demo
-<CTable responsive="xxl">
-  <CTableHead>
-    <CTableRow>
-      <CTableHeaderCell scope="col">#</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-      <CTableHeaderCell scope="col">Heading</CTableHeaderCell>
-    </CTableRow>
-  </CTableHead>
-  <CTableBody>
-    <CTableRow>
-      <CTableHeaderCell scope="row">1</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">2</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-    <CTableRow>
-      <CTableHeaderCell scope="row">3</CTableHeaderCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-      <CTableDataCell>Cell</CTableDataCell>
-    </CTableRow>
-  </CTableBody>
-</CTable>
-:::
-```vue
-<CTable responsive="xxl">
-  ...
-</CTable>
-```
-
-## API
-
-!!!include(./api/table/CTable.api.md)!!!
-
-!!!include(./api/table/CTableBody.api.md)!!!
-
-!!!include(./api/table/CTableDataCell.api.md)!!!
-
-!!!include(./api/table/CTableFoot.api.md)!!!
-
-!!!include(./api/table/CTableHead.api.md)!!!
-
-!!!include(./api/table/CTableHeaderCell.api.md)!!!
-
-!!!include(./api/table/CTableRow.api.md)!!!
-
-<script setup>
-  const columns = [
-    {
-      key: 'id',
-      label: '#',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'class',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_1',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_2',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-  ]
-  const items = [
-    {
-      id: 1,
-      class: 'Mark',
-      heading_1: 'Otto',
-      heading_2: '@mdo',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 2,
-      class: 'Jacob',
-      heading_1: 'Thornton',
-      heading_2: '@fat',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 3,
-      class: 'Larry the Bird',
-      heading_2: '@twitter',
-      _cellProps: { id: { scope: 'row' }, class: { colSpan: 2 } },
-    },
-  ]
-  const columnsActiveTableExample = [
-    {
-      key: 'id',
-      label: '#',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'class',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_1',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-    {
-      key: 'heading_2',
-      label: 'Heading',
-      _props: { scope: 'col' },
-    },
-  ]
-  const itemsActiveTableExample = [
-    {
-      id: 1,
-      class: 'Mark',
-      heading_1: 'Otto',
-      heading_2: '@mdo',
-      _props: { active: true },
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 2,
-      class: 'Jacob',
-      heading_1: 'Thornton',
-      heading_2: '@fat',
-      _cellProps: { id: { scope: 'row' } },
-    },
-    {
-      id: 3,
-      class: 'Larry the Bird',
-      heading_2: '@twitter',
-      _cellProps: { id: { scope: 'row' }, class: { active: true, colSpan: 2 } },
-    },
-  ]
-  const columnsVariantExample = [
-    { key: 'class', _props: { scope: 'col' } },
-    { key: 'heading_1', label: 'Heading', _props: { scope: 'col' } },
-    { key: 'heading_2', label: 'Heading', _props: { scope: 'col' } },
-  ]
-  const itemsVariantExample = [
-    {
-      class: 'Default',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-    },
-    {
-      class: 'Primary',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'primary' },
-    },
-    {
-      class: 'Secondary',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'secondary' },
-    },
-    {
-      class: 'Success',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'success' },
-    },
-    {
-      class: 'Danger',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'danger' },
-    },
-    {
-      class: 'Warning',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'warning' },
-    },
-    {
-      class: 'Info',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'info' },
-    },
-    {
-      class: 'Light',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'light' },
-    },
-    {
-      class: 'Dark',
-      heading_1: 'Cell',
-      heading_2: 'Cell',
-      _cellProps: { class: { scope: 'row' } },
-      _props: { color: 'dark' },
-    },
-  ]
-</script>
diff --git a/packages/docs/components/tabs.md b/packages/docs/components/tabs.md
deleted file mode 100644
index 33b8a72d..00000000
--- a/packages/docs/components/tabs.md
+++ /dev/null
@@ -1,595 +0,0 @@
----
-title: Vue Tabs Components
-name: Tabs
-description: The CoreUI Vue Tabs component provides a flexible and accessible way to create tabbed navigation in your application. It supports various styles and configurations to meet different design requirements.
-since: 5.1.0
----
-
-## Example
-
-The basic Vue tabs example uses the `variant="tabs"` props to generate a tabbed interface.
-
-::: demo
-<CTabs activeItemKey="profile">
-  <CTabList variant="tabs">
-    <CTab itemKey="home">Home</CTab>
-    <CTab itemKey="profile">Profile</CTab>
-    <CTab itemKey="contact">Contact</CTab>
-    <CTab disabled itemKey="disabled">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="p-3" itemKey="home">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="profile">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="contact">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="disabled">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs activeItemKey="profile">
-  <CTabList variant="tabs">
-    <CTab itemKey="home">Home</CTab>
-    <CTab itemKey="profile">Profile</CTab>
-    <CTab itemKey="contact">Contact</CTab>
-    <CTab disabled itemKey="disabled">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="p-3" itemKey="home">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="profile">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="contact">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="disabled">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-
-## Available styles
-
-Change the style of `<CTabs>`'s component with modifiers and utilities. Mix and match as needed, or build your own.
-
-### Unstyled
-
-If you don’t provide the `variant` prop, the component will default to a basic style.
-
-::: demo
-<CTabs activeItemKey="profile">
-  <CTabList>
-    <CTab itemKey="home">Home</CTab>
-    <CTab itemKey="profile">Profile</CTab>
-    <CTab itemKey="contact">Contact</CTab>
-    <CTab disabled itemKey="disabled">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="p-3" itemKey="home">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="profile">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="contact">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="disabled">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs activeItemKey="profile">
-  <CTabList>
-    <CTab itemKey="home">Home</CTab>
-    <CTab itemKey="profile">Profile</CTab>
-    <CTab itemKey="contact">Contact</CTab>
-    <CTab disabled itemKey="disabled">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="p-3" itemKey="home">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="profile">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="contact">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" itemKey="disabled">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-### Pills
-
-Take that same code, but use `variant="pills"` instead:
-
-::: demo
-<CTabs :activeItemKey=2>
-  <CTabList variant="pills">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="p-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey=2>
-  <CTabList variant="pills">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="p-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="p-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-### Underline
-
-Take that same code, but use `variant="underline"` instead:
-
-::: demo
-<CTabs :activeItemKey="2">
-  <CTabList variant="underline">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey="2">
-  <CTabList variant="underline">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-### Underline border
-
-Take that same code, but use `variant="underline-border"` instead:
-
-::: demo
-<CTabs :activeItemKey="2">
-  <CTabList variant="underline-border">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey="2">
-  <CTabList variant="underline-border">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-### Enclosed
-
-Use the `variant="enclosed"` class to give your tab items a subtle border and rounded styling.
-
-::: demo
-<CTabs :activeItemKey="1">
-  <CTabList variant="enclosed">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey="1">
-  <CTabList variant="enclosed-pills">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-### Enclosed pills 
-
-Use the `variant="enclosed-pills"` to achieve a pill-style appearance for each tab item, using pill-shaped borders and smoother outlines.
-
-::: demo
-<CTabs :activeItemKey="1">
-  <CTabList variant="enclosed-pills">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey="1">
-  <CTabList variant="enclosed-pills">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-### Fill and justify
-
-Force your `<CTabs>`'s contents to extend the full available width one of two modifier classes. To proportionately fill all available space use `layout="fill"`. Notice that all horizontal space is occupied, but not every nav item has the same width.
-
-::: demo
-<CTabs :activeItemKey="2">
-  <CTabList variant="tabs" layout="fill">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile tab with longer content</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey="2">
-  <CTabList variant="tabs" layout="fill">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile tab with longer content</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-For equal-width elements, use `layout="justified"`. All horizontal space will be occupied by nav links, but unlike the `layout="fill"` above, every nav item will be the same width.
-
-::: demo
-<CTabs :activeItemKey="2">
-  <CTabList variant="tabs" layout="justified">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-:::
-```vue
-<CTabs :activeItemKey="2">
-  <CTabList variant="tabs" layout="justified">
-    <CTab aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel class="py-3" aria-labelledby="home-tab-pane" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="profile-tab-pane" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="contact-tab-pane" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel class="py-3" aria-labelledby="disabled-tab-pane" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-## Accessibility
-
-Dynamic tabbed interfaces, as described in the [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#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).
-
-### WAI-ARIA Roles
-
-- The element that serves as the container for the set of tabs has the role `tablist`.
-- Each element that serves as a tab has the role `tab` and is contained within the element with the role `tablist`.
-- Each element that contains the content panel for a tab has the role `tabpanel`.
-- If the tab list has a visible label, the element with the role `tablist` has `aria-labelledby` set to a value that refers to the labeling element. Otherwise, the `tablist` element has a label provided by `aria-label`.
-- Each element with the role `tab` has the property `aria-controls` referring to its associated `tabpanel` element.
-- The active tab element has the state `aria-selected` set to `true`, and all other tab elements have it set to `false`.
-- Each element with the role `tabpanel` has the property `aria-labelledby` referring to its associated `tab` element.
-
-Our Vue Tabs component automatically manages all `role="..."` and `aria-` attributes for accessibility. It also handles the selected state by adding `aria-selected="true"` to the active tab. Additionally, you have the flexibility to manually set these attributes, as shown in the example below:
-
-```jsx
-<CTabs :activeItemKey="2">
-  <CTabList variant="tabs">
-    <CTab id="home-tab" aria-controls="home-tab-pane" :itemKey="1">Home</CTab>
-    <CTab id="profile-tab" aria-controls="profile-tab-pane" :itemKey="2">Profile</CTab>
-    <CTab id="contact-tab" aria-controls="contact-tab-pane" :itemKey="3">Contact</CTab>
-    <CTab id="disabled-tab" aria-controls="disabled-tab-pane" disabled :itemKey="4">Disabled</CTab>
-  </CTabList>
-  <CTabContent>
-    <CTabPanel id="home-tab-pane" class="p-3" aria-labelledby="home-tab-pane" aria-labelledby="home-tab" :itemKey="1">
-      Home tab content
-    </CTabPanel>
-    <CTabPanel id="profile-tab-pane" class="p-3" aria-labelledby="profile-tab-pane" aria-labelledby="profile-tab" :itemKey="2">
-      Profile tab content
-    </CTabPanel>
-    <CTabPanel id="contact-tab-pane" class="p-3" aria-labelledby="contact-tab-pane" aria-labelledby="contact-tab" :itemKey="3">
-      Contact tab content
-    </CTabPanel>
-    <CTabPanel id="disabled-tab-pane" class="p-3" aria-labelledby="disabled-tab-pane" aria-labelledby="disabled-tab" :itemKey="4">
-      Disabled tab content
-    </CTabPanel>
-  </CTabContent>
-</CTabs>
-```
-
-This example demonstrates how to manually set `aria-selected`, `aria-controls`, and `aria-labelledby` attributes on your `<CTab>`'s and `<CTabPanels>`'s.
-
-### Keyboard Interaction
-
-**When focus enters the tab list:**
-
-<kbd>Tab</kbd>: It places focus on the active `tab` element.
-
-**When focus is on a tab element:**
-
-<kbd>Tab</kbd>: Moves focus to the next element in the tab sequence, typically the tabpanel unless the first focusable element inside the tabpanel is found earlier.
-
-<kbd>Left Arrow</kbd>: Moves focus to the previous tab. If on the first tab, it wraps around to the last tab.
-
-<kbd>Right Arrow</kbd>: Moves focus to the next tab. If on the last tab, it wraps around to the first tab.
-
-<kbd>Home</kbd>: Moves focus to the first tab.
-
-<kbd>End</kbd>: Moves focus to the last tab.
-
-## Customizing
-
-### CSS variables
-
-Vue tabs use local CSS variables on `.nav`, `.nav-tabs`, `.nav-pills`, `.nav-underline` and `.nav-underline-border` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.
-
-On the `.nav` base class:
-
-<ScssDocs file="_nav.scss" capture="nav-css-vars"/>
-
-On the `.nav-tabs` modifier class:
-
-<ScssDocs file="_nav.scss" capture="nav-tabs-css-vars"/>
-
-On the `.nav-pills` modifier class:
-
-<ScssDocs file="_nav.scss" capture="nav-pills-css-vars"/>
-
-On the `.nav-underline` modifier class:
-
-<ScssDocs file="_nav.scss" capture="nav-underline-css-vars"/>
-
-On the `.nav-underline-border` modifier class:
-
-<ScssDocs file="_nav.scss" capture="nav-underline-border-css-vars"/>
-
-#### How to use CSS variables
-
-```jsx
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CTabs :style="vars">...</CTabs>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="nav-variables"/>
-
-## API
-
-!!!include(./api/tabs/CTab.api.md)!!!
-!!!include(./api/tabs/CTabContent.api.md)!!!
-!!!include(./api/tabs/CTabList.api.md)!!!
-!!!include(./api/tabs/CTabPanel.api.md)!!!
-!!!include(./api/tabs/CTabs.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/components/toast.md b/packages/docs/components/toast.md
deleted file mode 100644
index 906a5fad..00000000
--- a/packages/docs/components/toast.md
+++ /dev/null
@@ -1,351 +0,0 @@
----
-title: Vue Toast Component
-name: Toast
-description: Push notifications to your visitors with a toast, a lightweight and easily customizable alert message.
-other_frameworks: toast
----
-
-Vue toasts 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.
-
-## Overview
-
-Things to know when using the toast plugin:
-
-- Toasts are opt-in for performance reasons, so **you must initialize them yourself**.
-- Toasts will automatically hide if you do not specify `autohide: false`.
-
-## Examples
-
-### Basic
-
-To 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.
-
-Toasts 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.
-
-::: demo
-<CToast :autohide="false" visible>
-<CToastHeader closeButton>
-<svg
-      class="rounded me-2"
-      width="20"
-      height="20"
-      xmlns="http://www.w3.org/2000/svg"
-      preserveAspectRatio="xMidYMid slice"
-      focusable="false"
-      role="img"
-    >
-<rect width="100%" height="100%" fill="#007aff"></rect>
-</svg>
-<span class="me-auto fw-bold">CoreUI for Vue.js</span>
-<small>7 min ago</small>
-</CToastHeader>
-<CToastBody>Hello, world! This is a toast message.</CToastBody>
-</CToast>
-:::
-```vue
-<CToast :autohide="false" visible>
-  <CToastHeader closeButton>
-    <svg
-      class="rounded me-2"
-      width="20"
-      height="20"
-      xmlns="http://www.w3.org/2000/svg"
-      preserveAspectRatio="xMidYMid slice"
-      focusable="false"
-      role="img"
-    >
-      <rect width="100%" height="100%" fill="#007aff"></rect>
-    </svg>
-    <span class="me-auto fw-bold">CoreUI for Vue.js</span>
-    <small>7 min ago</small>
-  </CToastHeader>
-  <CToastBody>Hello, world! This is a toast message.</CToastBody>
-</CToast>
-```
-
-:::demo
-<CButton color="primary" @click="createToast">Send a toast</CButton>
-<CToaster class="p-3" placement="top-end">
-  <CToast v-for="(toast, index) in toasts" visible :key="index">
-    <CToastHeader closeButton>
-    <span class="me-auto fw-bold">{{toast.title}}</span>
-    <small>7 min ago</small>
-    </CToastHeader>
-    <CToastBody>
-      {{ toast.content }}
-    </CToastBody>  
-  </CToast>
-</CToaster>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const toasts = ref([])
-  const createToast = () => {
-    toasts.value.push({
-      title: 'new toast',
-      content: 'Lorem ipsum dolor cet emit'
-    })
-  }
-</script>
-<template>
-  <CButton color="primary" @click="createToast">Send a toast</CButton>
-  <CToaster class="p-3" placement="top-end">
-    <CToast v-for="(toast, index) in toasts" visible :key="index">
-      <CToastHeader closeButton>
-      <span class="me-auto fw-bold">{{toast.title}}</span>
-      <small>7 min ago</small>
-      </CToastHeader>
-      <CToastBody>
-        {{ toast.content }}
-      </CToastBody>  
-    </CToast>
-  </CToaster>
-</template>
-```
-
-### Translucent
-
-Toasts are slightly translucent to blend in with what's below them.
-
-::: demo-dark
-<CToast :autohide="false" visible>
-<CToastHeader closeButton>
-<svg
-      class="rounded me-2"
-      width="20"
-      height="20"
-      xmlns="http://www.w3.org/2000/svg"
-      preserveAspectRatio="xMidYMid slice"
-      focusable="false"
-      role="img"
-    >
-<rect width="100%" height="100%" fill="#007aff"></rect>
-</svg>
-<span class="me-auto fw-bold">CoreUI for Vue.js</span>
-<small>7 min ago</small>
-</CToastHeader>
-<CToastBody>Hello, world! This is a toast message.</CToastBody>
-</CToast>
-:::
-
-```vue
-<CToast :autohide="false" visible>
-  <CToastHeader closeButton>
-    <svg
-      class="rounded me-2"
-      width="20"
-      height="20"
-      xmlns="http://www.w3.org/2000/svg"
-      preserveAspectRatio="xMidYMid slice"
-      focusable="false"
-      role="img"
-    >
-      <rect width="100%" height="100%" fill="#007aff"></rect>
-    </svg>
-    <span class="me-auto fw-bold">CoreUI for Vue.js</span>
-    <small>7 min ago</small>
-  </CToastHeader>
-  <CToastBody>Hello, world! This is a toast message.</CToastBody>
-</CToast>
-```
-
-### Stacking
-
-You can stack toasts by wrapping them in a toast container, which will vertically add some spacing.
-
-::: demo
-<CToaster class="position-static">
-<CToast :autohide="false" visible>
-<CToastHeader closeButton>
-<svg
-        class="rounded me-2"
-        width="20"
-        height="20"
-        xmlns="http://www.w3.org/2000/svg"
-        preserveAspectRatio="xMidYMid slice"
-        focusable="false"
-        role="img"
-      >
-<rect width="100%" height="100%" fill="#007aff"></rect>
-</svg>
-<span class="me-auto fw-bold">CoreUI for Vue.js</span>
-<small>7 min ago</small>
-</CToastHeader>
-<CToastBody>Hello, world! This is a toast message.</CToastBody>
-</CToast>
-<CToast :autohide="false" visible>
-<CToastHeader closeButton>
-<svg
-        class="rounded me-2"
-        width="20"
-        height="20"
-        xmlns="http://www.w3.org/2000/svg"
-        preserveAspectRatio="xMidYMid slice"
-        focusable="false"
-        role="img"
-      >
-<rect width="100%" height="100%" fill="#007aff"></rect>
-</svg>
-<span class="me-auto fw-bold">CoreUI for Vue.js</span>
-<small>7 min ago</small>
-</CToastHeader>
-<CToastBody>Hello, world! This is a toast message.</CToastBody>
-</CToast>
-</CToaster>
-:::
-
-```vue
-<CToaster class="position-static">
-  <CToast :autohide="false" visible>
-    <CToastHeader closeButton>
-      <svg
-        class="rounded me-2"
-        width="20"
-        height="20"
-        xmlns="http://www.w3.org/2000/svg"
-        preserveAspectRatio="xMidYMid slice"
-        focusable="false"
-        role="img"
-      >
-        <rect width="100%" height="100%" fill="#007aff"></rect>
-      </svg>
-      <span class="me-auto fw-bold">CoreUI for Vue.js</span>
-      <small>7 min ago</small>
-    </CToastHeader>
-    <CToastBody>Hello, world! This is a toast message.</CToastBody>
-  </CToast>
-  <CToast :autohide="false" visible>
-    <CToastHeader closeButton>
-      <svg
-        class="rounded me-2"
-        width="20"
-        height="20"
-        xmlns="http://www.w3.org/2000/svg"
-        preserveAspectRatio="xMidYMid slice"
-        focusable="false"
-        role="img"
-      >
-        <rect width="100%" height="100%" fill="#007aff"></rect>
-      </svg>
-      <span class="me-auto fw-bold">CoreUI for Vue.js</span>
-      <small>7 min ago</small>
-    </CToastHeader>
-    <CToastBody>Hello, world! This is a toast message.</CToastBody>
-  </CToast>
-</CToaster>
-```
-
-### Custom content
-
-Customize your toasts by removing sub-components, tweaking them with [utilities](https://coreui.io/docs/4.0/utilities/api), or by adding your own markup. Here we've created a simpler toast by removing the default `<CToastHeader>`, adding a custom hide icon from [CoreUI Icons](https://icons.coreui.io), and using some [flexbox utilities](https://coreui.io/docs/4.0/utilities/flex) to adjust the layout.
-
-::: demo
-<CToast :autohide="false" class="align-items-center" visible>
-  <div class="d-flex">
-    <CToastBody>Hello, world! This is a toast message.</CToastBody>
-    <CToastClose class="me-2 m-auto"/>
-  </div>
-</CToast>
-:::
-```vue
-<CToast :autohide="false" class="align-items-center" visible>
-  <div class="d-flex">
-    <CToastBody>Hello, world! This is a toast message.</CToastBody>
-    <CToastClose class="me-2 m-auto"/>
-  </div>
-</CToast>
-```
-
-Alternatively, you can also add additional controls and components to toasts.
-
-::: demo
-<CToast :autohide="false" class="align-items-center" visible>
-  <CToastBody>
-    Hello, world! This is a toast message.
-    <div class="mt-2 pt-2 border-top">
-    <CButton type="button" color="primary" size="sm">
-    Take action
-    </CButton>
-    <CToastClose as="CButton" color="secondary" size="sm" class="ms-1">Close</CToastClose>
-    </div>
-  </CToastBody>
-</CToast>
-:::
-```vue
-<CToast :autohide="false" class="align-items-center" visible>
-  <CToastBody>
-    Hello, world! This is a toast message.
-    <div class="mt-2 pt-2 border-top">
-    <CButton type="button" color="primary" size="sm">
-    Take action
-    </CButton>
-    <CToastClose as="CButton" color="secondary" size="sm" class="ms-1">Close</CToastClose>
-    </div>
-  </CToastBody>
-</CToast>
-```
-
-### Color schemes
-
-Building on the above example, you can create different toast color schemes with our [color](https://coreui.io/docs/4.0/utilities/colors) and [background](https://coreui.io/docs/4.0//utilities/background) utilities. Here we've set `color="primary"` and added `.text-white` class to the `<Ctoast>`, and then set `white` property to our close button. For a crisp edge, we remove the default border with `.border-0`.
-
-::: demo
-<CToast :autohide="false" color="primary" class="text-white align-items-center" visible>
-  <div class="d-flex">
-    <CToastBody>Hello, world! This is a toast message.</CToastBody>
-    <CToastClose class="me-2 m-auto" white />
-  </div>
-</CToast>
-:::
-```vue
-<CToast :autohide="false" color="primary" class="text-white align-items-center" visible>
-  <div class="d-flex">
-    <CToastBody>Hello, world! This is a toast message.</CToastBody>
-    <CToastClose class="me-2 m-auto" white />
-  </div>
-</CToast>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue toasts 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.
-
-<ScssDocs file="_toasts.scss" capture="toast-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CToast :style="vars">...</CToast>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="toast-variables"/>
-
-## API
-
-!!!include(./api/toast/CToast.api.md)!!!
-
-!!!include(./api/toast/CToastClose.api.md)!!!
-
-!!!include(./api/toast/CToastHeader.api.md)!!!
-
-!!!include(./api/toast/CToaster.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const toasts = ref([])
-  const createToast = () => {
-    toasts.value.push({
-      title: 'new toast',
-      content: 'Lorem ipsum dolor cet emit'
-    })
-  }
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/tooltip.md b/packages/docs/components/tooltip.md
deleted file mode 100644
index b10c61e9..00000000
--- a/packages/docs/components/tooltip.md
+++ /dev/null
@@ -1,207 +0,0 @@
----
-title: Vue Tooltip Component and Directive
-name: Tooltip
-description: Documentation and examples for adding Vue Tooltips.
-other_frameworks: tooltip
----
-
-## Examples
-
-### Tooltips on links
-
-Hover over the links below to see tooltips:
-
-::: demo
-<p class="text-body-secondary">
-  Tight pants next level keffiyeh
-  <CLink v-c-tooltip="'Tooltip text'"> you&nbsp;probably </CLink>
-    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
-  <CLink v-c-tooltip="'Tooltip text'"> have&nbsp;a </CLink>
-  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
-  <CLink v-c-tooltip="'Tooltip text'"> whatever&nbsp;keytar </CLink>
-  scenester farm-to-table banksy Austin
-  <CLink v-c-tooltip="'Tooltip text'"> twitter&nbsp;handle </CLink>
-  freegan cred raw denim single-origin coffee viral.
-</p>
-:::
-```vue demo
-<p class="text-body-secondary">
-  Tight pants next level keffiyeh
-  <CLink v-c-tooltip="'Tooltip text'"> you probably </CLink>
-    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
-  <CLink v-c-tooltip="'Tooltip text'"> have a </CLink>
-  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
-  <CLink v-c-tooltip="'Tooltip text'"> whatever keytar </CLink>
-  scenester farm-to-table banksy Austin
-  <CLink v-c-tooltip="'Tooltip text'"> twitter handle </CLink>
-  freegan cred raw denim single-origin coffee viral.
-</p>
-```
-
-### Component
-
-Hover over the buttons below to see the four tooltips directions: top, right, bottom, and left. Directions are mirrored when using CoreUI in RTL.
-
-::: demo
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="top">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on top</CButton>
-  </template>
-</CTooltip>
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="right">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on right</CButton>
-  </template>
-</CTooltip>
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="bottom">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on bottom</CButton>
-  </template>
-</CTooltip>
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="left">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on left</CButton>
-  </template>
-</CTooltip>
-:::
-```vue
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="top">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on top</CButton>
-  </template>
-</CTooltip>
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="right">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on right</CButton>
-  </template>
-</CTooltip>
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="bottom">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on bottom</CButton>
-  </template>
-</CTooltip>
-<CTooltip content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus" placement="left">
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Tooltip on left</CButton>
-  </template>
-</CTooltip>
-```
-
-### Directive
-
-::: demo
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'top'}">Tooltip on top</CButton>
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'right'}">Tooltip on right</CButton>
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'bottom'}">Tooltip on bottom</CButton>
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'left'}">Tooltip on left</CButton>
-:::
-```vue
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'top'}">Tooltip on top</CButton>
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'right'}">Tooltip on right</CButton>
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'bottom'}">Tooltip on bottom</CButton>
-<CButton color="secondary" v-c-tooltip="{content: 'Vivamus sagittis lacus vel augue laoreet rutrum faucibus.', placement: 'left'}">Tooltip on left</CButton>
-```
-
-### Custom tooltips
-
-You can customize the appearance of tooltips using [CSS variables](#css-variables). We set a custom `style` to scope our custom appearance and use it to override some of the local CSS variables.
-
-::: demo
-<CTooltip
-  content="This top tooltip is themed via CSS variables."
-  placement="top"
-  :style="customTooltipStyle"
->
-  <template #toggler="{ id, on }">
-    <CButton color="secondary" :aria-describedby="id" v-on="on">Custom tooltip</CButton>
-  </template>
-</CTooltip>
-:::
-```vue
-<script setup>
-  const customTooltipStyle = {
-    '--cui-tooltip-bg': 'var(--cui-primary)',
-  }
-</script>
-<template>
-  <CTooltip
-    content="This top tooltip is themed via CSS variables."
-    placement="top"
-    :style="customTooltipStyle"
-  >
-    <template #toggler="{ id, on }">
-      <CButton color="secondary" :aria-describedby="id" v-on="on">Custom tooltip</CButton>
-    </template>
-  </CTooltip>
-</template>
-```
-
-## Usage
-
-### Disabled elements
-
-Elements 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"`.
-
-:::demo
-<CTooltip content="Disabled tooltip">
-  <template #toggler="{ id, on }">
-    <span class="d-inline-block" :tabindex="0" :aria-describedby="id" v-on="on">
-      <CButton color="primary" disabled>Disabled button</CButton>
-    </span>
-  </template>
-</CTooltip>
-:::
-```vue
-<CTooltip content="Disabled tooltip">
-  <template #toggler="{ id, on }">
-    <span class="d-inline-block" :tabindex="0" :aria-describedby="id" v-on="on">
-      <CButton color="primary" disabled>Disabled button</CButton>
-    </span>
-  </template>
-</CTooltip>
-```
-
-## Customizing
-
-### CSS variables
-
-Vue toltips 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.
-
-<ScssDocs file="_tooltip.scss" capture="tooltip-css-vars"/>
-
-#### How to use CSS variables
-
-```js
-const vars = { 
-  '--my-css-var': 10,
-  '--my-another-css-var': "red" 
-}
-return <CTooltip :style="vars">...</CTooltip>
-```
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="tooltip-variables"/>
-
-## API
-
-
-!!!include(./api/tooltip/CTooltip.api.md)!!!
-
-<script setup>
-  const customTooltipStyle = {
-    '--cui-tooltip-bg': 'var(--cui-primary)',
-  }
-</script>
\ No newline at end of file
diff --git a/packages/docs/components/widgets.md b/packages/docs/components/widgets.md
deleted file mode 100644
index 9c295123..00000000
--- a/packages/docs/components/widgets.md
+++ /dev/null
@@ -1,1416 +0,0 @@
----
-title: Vue Widgets Components
-name: Widgets
-description:
----
-
-## WidgetStatsA
-
-::: demo
-<CRow>
-<CCol :sm="6">
-<CWidgetStatsA class="mb-3" color="primary">
-<template #value >26K
-<span class="fs-6 fw-normal">
-(-12.4% <CIcon icon="cil-arrow-bottom" />)
-</span>
-</template>
-<template #title>Users</template>
-<template #action>
-<CDropdown placement="bottom-end">
-<CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-<CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-</CDropdownToggle>
-<CDropdownMenu>
-<CDropdownItem href="#">Action</CDropdownItem>
-<CDropdownItem href="#">Another action</CDropdownItem>
-<CDropdownItem href="#">Something else here</CDropdownItem>
-</CDropdownMenu>
-</CDropdown>
-</template>
-<template #chart>
-<CChart
-          type="line"
-          class="mt-3 mx-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'transparent',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointBackgroundColor: '#5856d6',
-                data: [65, 59, 84, 84, 51, 55, 40],
-              },
-            ],
-          }"
-          :options="{
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            maintainAspectRatio: false,
-            scales: {
-              x: {
-                border: {
-                  display: false
-                },
-                grid: {
-                  display: false,
-                  drawBorder: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-              y: {
-                min: 30,
-                max: 89,
-                display: false,
-                grid: {
-                  display: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-            },
-            elements: {
-              line: {
-                borderWidth: 1,
-                tension: 0.4,
-              },
-              point: {
-                radius: 4,
-                hitRadius: 10,
-                hoverRadius: 4,
-              },
-            },
-          }"
-        />
-</template>
-</CWidgetStatsA>
-</CCol>
-<CCol :sm="6">
-<CWidgetStatsA class="mb-3" color="info">
-<template #value >$6.200
-<span class="fs-6 fw-normal">
-(40.9% <CIcon icon="cil-arrow-top" />)
-</span>
-</template>
-<template #title>Income</template>
-<template #action>
-<CDropdown placement="bottom-end">
-<CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-<CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-</CDropdownToggle>
-<CDropdownMenu>
-<CDropdownItem href="#">Action</CDropdownItem>
-<CDropdownItem href="#">Another action</CDropdownItem>
-<CDropdownItem href="#">Something else here</CDropdownItem>
-</CDropdownMenu>
-</CDropdown>
-</template>
-<template #chart>
-<CChart
-          type="line"
-          class="mt-3 mx-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'transparent',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointBackgroundColor: '#39f',
-                data: [1, 18, 9, 17, 34, 22, 11],
-              },
-            ],
-          }"
-          :options="{
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            maintainAspectRatio: false,
-            scales: {
-              x: {
-                border: {
-                  display: false,
-                },
-                grid: {
-                  display: false,
-                  drawBorder: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-              y: {
-                min: -9,
-                max: 39,
-                display: false,
-                grid: {
-                  display: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-            },
-            elements: {
-              line: {
-                borderWidth: 1,
-              },
-              point: {
-                radius: 4,
-                hitRadius: 10,
-                hoverRadius: 4,
-              },
-            },
-          }"
-        />
-</template>
-</CWidgetStatsA>
-</CCol>
-<CCol :sm="6">
-<CWidgetStatsA class="mb-3" color="warning">
-<template #value >2.49%
-<span class="fs-6 fw-normal">
-(84.7% <CIcon icon="cil-arrow-top" />)
-</span>
-</template>
-<template #title>Conversion Rate</template>
-<template #action>
-<CDropdown placement="bottom-end">
-<CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-<CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-</CDropdownToggle>
-<CDropdownMenu>
-<CDropdownItem href="#">Action</CDropdownItem>
-<CDropdownItem href="#">Another action</CDropdownItem>
-<CDropdownItem href="#">Something else here</CDropdownItem>
-</CDropdownMenu>
-</CDropdown>
-</template>
-<template #chart>
-<CChart
-          type="line"
-          class="mt-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'rgba(255,255,255,.2)',
-                borderColor: 'rgba(255,255,255,.55)',
-                data: [78, 81, 80, 45, 34, 12, 40],
-                fill: true,
-              },
-            ],
-          }"
-          :options="{
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            maintainAspectRatio: false,
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-            elements: {
-              line: {
-                borderWidth: 2,
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-                hitRadius: 10,
-                hoverRadius: 4,
-              },
-            },
-          }"
-        />
-</template>
-</CWidgetStatsA>
-</CCol>
-<CCol :sm="6">
-<CWidgetStatsA class="mb-3" color="danger">
-<template #value >44K
-<span class="fs-6 fw-normal">
-(-23.6% <CIcon icon="cil-arrow-bottom" />)
-</span>
-</template>
-<template #title>Sessions</template>
-<template #action>
-<CDropdown placement="bottom-end">
-<CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-<CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-</CDropdownToggle>
-<CDropdownMenu>
-<CDropdownItem href="#">Action</CDropdownItem>
-<CDropdownItem href="#">Another action</CDropdownItem>
-<CDropdownItem href="#">Something else here</CDropdownItem>
-</CDropdownMenu>
-</CDropdown>
-</template>
-<template #chart>
-<CChart
-          type="bar"
-          class="mt-3 mx-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-              'August',
-              'September',
-              'October',
-              'November',
-              'December',
-              'January',
-              'February',
-              'March',
-              'April',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'rgba(255,255,255,.2)',
-                borderColor: 'rgba(255,255,255,.55)',
-                data: [
-                  78, 81, 80, 45, 34, 12, 40, 85, 65, 23, 12, 98, 34, 84, 67,
-                  82,
-                ],
-                barPercentage: 0.6,
-              },
-            ],
-          }"
-          :options="{
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                grid: {
-                  display: false,
-                  drawTicks: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-              y: {
-                border: {
-                  display: false,
-                },
-                grid: {
-                  display: false,
-                  drawBorder: false,
-                  drawTicks: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-            },
-          }"
-        />
-</template>
-</CWidgetStatsA>
-</CCol>
-</CRow>
-:::
-
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsA class="mb-3" color="primary">
-      <template #value
-        >26K
-        <span class="fs-6 fw-normal">
-          (-12.4% <CIcon icon="cil-arrow-bottom" />)
-        </span>
-      </template>
-      <template #title>Users</template>
-      <template #action>
-        <CDropdown placement="bottom-end">
-          <CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-            <CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-          </CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-      </template>
-      <template #chart>
-        <CChart
-          type="line"
-          class="mt-3 mx-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'transparent',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointBackgroundColor: '#5856d6',
-                data: [65, 59, 84, 84, 51, 55, 40],
-              },
-            ],
-          }"
-          :options="{
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            maintainAspectRatio: false,
-            scales: {
-              x: {
-                border: {
-                  display: false,
-                },
-                grid: {
-                  display: false,
-                  drawBorder: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-              y: {
-                min: 30,
-                max: 89,
-                display: false,
-                grid: {
-                  display: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-            },
-            elements: {
-              line: {
-                borderWidth: 1,
-                tension: 0.4,
-              },
-              point: {
-                radius: 4,
-                hitRadius: 10,
-                hoverRadius: 4,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsA>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsA class="mb-3" color="info">
-      <template #value
-        >$6.200
-        <span class="fs-6 fw-normal">
-          (40.9% <CIcon icon="cil-arrow-top" />)
-        </span>
-      </template>
-      <template #title>Income</template>
-      <template #action>
-        <CDropdown placement="bottom-end">
-          <CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-            <CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-          </CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-      </template>
-      <template #chart>
-        <CChart
-          type="line"
-          class="mt-3 mx-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'transparent',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointBackgroundColor: '#39f',
-                data: [1, 18, 9, 17, 34, 22, 11],
-              },
-            ],
-          }"
-          :options="{
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            maintainAspectRatio: false,
-            scales: {
-              x: {
-                border: {
-                  display: false,
-                },
-                grid: {
-                  display: false,
-                  drawBorder: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-              y: {
-                min: -9,
-                max: 39,
-                display: false,
-                grid: {
-                  display: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-            },
-            elements: {
-              line: {
-                borderWidth: 1,
-              },
-              point: {
-                radius: 4,
-                hitRadius: 10,
-                hoverRadius: 4,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsA>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsA class="mb-3" color="warning">
-      <template #value
-        >2.49%
-        <span class="fs-6 fw-normal">
-          (84.7% <CIcon icon="cil-arrow-top" />)
-        </span>
-      </template>
-      <template #title>Conversion Rate</template>
-      <template #action>
-        <CDropdown placement="bottom-end">
-          <CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-            <CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-          </CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-      </template>
-      <template #chart>
-        <CChart
-          type="line"
-          class="mt-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'rgba(255,255,255,.2)',
-                borderColor: 'rgba(255,255,255,.55)',
-                data: [78, 81, 80, 45, 34, 12, 40],
-                fill: true,
-              },
-            ],
-          }"
-          :options="{
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            maintainAspectRatio: false,
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-            elements: {
-              line: {
-                borderWidth: 2,
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-                hitRadius: 10,
-                hoverRadius: 4,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsA>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsA class="mb-3" color="danger">
-      <template #value
-        >44K
-        <span class="fs-6 fw-normal">
-          (-23.6% <CIcon icon="cil-arrow-bottom" />)
-        </span>
-      </template>
-      <template #title>Sessions</template>
-      <template #action>
-        <CDropdown placement="bottom-end">
-          <CDropdownToggle
-            color="transparent"
-            class="p-0 text-white"
-            :caret="false"
-          >
-            <CIcon icon="cil-options" class="text-high-emphasis-inverse" />
-          </CDropdownToggle>
-          <CDropdownMenu>
-            <CDropdownItem href="#">Action</CDropdownItem>
-            <CDropdownItem href="#">Another action</CDropdownItem>
-            <CDropdownItem href="#">Something else here</CDropdownItem>
-          </CDropdownMenu>
-        </CDropdown>
-      </template>
-      <template #chart>
-        <CChart
-          type="bar"
-          class="mt-3 mx-3"
-          style="height: 70px"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-              'August',
-              'September',
-              'October',
-              'November',
-              'December',
-              'January',
-              'February',
-              'March',
-              'April',
-            ],
-            datasets: [
-              {
-                label: 'My First dataset',
-                backgroundColor: 'rgba(255,255,255,.2)',
-                borderColor: 'rgba(255,255,255,.55)',
-                data: [
-                  78, 81, 80, 45, 34, 12, 40, 85, 65, 23, 12, 98, 34, 84, 67,
-                  82,
-                ],
-                barPercentage: 0.6,
-              },
-            ],
-          }"
-          :options="{
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                grid: {
-                  display: false,
-                  drawTicks: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-              y: {
-                border: {
-                  display: false,
-                },
-                grid: {
-                  display: false,
-                  drawBorder: false,
-                  drawTicks: false,
-                },
-                ticks: {
-                  display: false,
-                },
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsA>
-  </CCol>
-</CRow>
-```
-
-## WidgetStatsB
-
-::: demo
-<CRow>
-<CCol :sm="6">
-<CWidgetStatsB
-      class="mb-3"
-      :progress="{ color: 'success', value: 75}"
-    >
-<template #text>Widget helper text</template>
-<template #title>Widget title</template>
-<template #value>89.9%</template>
-</CWidgetStatsB>
-</CCol>
-<CCol :sm="6">
-<CWidgetStatsB
-      class="mb-3"
-      color="primary"
-      inverse
-      :progress="{ value: 75}"
-      text="Widget helper text"
-      title="Widget title"
-      value="12.124"/>
-</CCol>
-</CRow>
-:::
-
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsB
-      class="mb-3"
-      :progress="{ color: 'success', value: 75}"
-    >
-      <template #text>Widget helper text</template>
-      <template #title>Widget title</template>
-      <template #value>89.9%</template>
-    </CWidgetStatsB>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsB
-      class="mb-3"
-      color="primary"
-      inverse
-      :progress="{ value: 75}"
-      text="Widget helper text"
-      title="Widget title"
-      value="12.124"/>
-  </CCol>
-</CRow>
-```
-
-## WidgetStatsC
-
-::: demo
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsC
-      class="mb-3"
-      value="87.500"
-      :progress="{ color: 'info', value: 75 }"
-      title="Visitors"
-    >
-      <template #icon><CIcon icon="cil-people" height="36" /></template>
-      <template #title>Visitors</template>
-    </CWidgetStatsC>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsC
-      class="mb-3"
-      inverse
-      color="info"
-      value="385"
-      :progress="{ value: 75 }"
-      title="New clients"
-    >
-      <template #icon><CIcon icon="cil-user-follow" height="36" /></template>
-    </CWidgetStatsC>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsC
-      class="mb-3"
-      value="87.500"
-      :progress="{ color: 'info', value: 75 }"
-      title="Visitors"
-    >
-      <template #icon><CIcon icon="cil-people" height="36" /></template>
-      <template #title>Visitors</template>
-    </CWidgetStatsC>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsC
-      class="mb-3"
-      inverse
-      color="info"
-      value="385"
-      :progress="{ value: 75 }"
-      title="New clients"
-    >
-      <template #icon><CIcon icon="cil-user-follow" height="36" /></template>
-    </CWidgetStatsC>
-  </CCol>
-</CRow>
-```
-
-## WidgetStatsD
-
-::: demo
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsD
-      class="mb-4"
-      style="--cui-card-cap-bg: #3b5998"
-      :values="[
-        { title: 'friends', value: '89K' },
-        { title: 'feeds', value: '459' },
-      ]"
-    >
-      <template #icon>
-        <CIcon icon="cib-facebook" height="52" class="my-4 text-white"/>
-      </template>
-      <template #chart>
-        <CChart
-          class="position-absolute w-100 h-100"
-          type="line"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                backgroundColor: 'rgba(255,255,255,.1)',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointHoverBackgroundColor: '#fff',
-                borderWidth: 2,
-                data: [65, 59, 84, 84, 51, 55, 40],
-                fill: true,
-              },
-            ],
-          }"
-          :options="{
-            elements: {
-              line: {
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-                hitRadius: 10,
-                hoverRadius: 4,
-                hoverBorderWidth: 3,
-              },
-            },
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsD>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsD
-      class="mb-4"
-      style="--cui-card-cap-bg: #00aced"
-      :values="[
-        { title: 'followers', value: '973k' },
-        { title: 'tweets', value: '1.792' },
-      ]"
-    >
-      <template #icon>
-        <CIcon icon="cib-twitter" height="52" class="my-4 text-white" />
-      </template>
-      <template #chart>
-        <CChart
-          class="position-absolute w-100 h-100"
-          type="line"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                backgroundColor: 'rgba(255,255,255,.1)',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointHoverBackgroundColor: '#fff',
-                borderWidth: 2,
-                data: [1, 13, 9, 17, 34, 41, 38],
-                fill: true,
-              },
-            ],
-          }"
-          :options="{
-            elements: {
-              line: {
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-                hitRadius: 10,
-                hoverRadius: 4,
-                hoverBorderWidth: 3,
-              },
-            },
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsD>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsD
-      class="mb-4"
-      style="--cui-card-cap-bg: #3b5998"
-      :values="[
-        { title: 'friends', value: '89K' },
-        { title: 'feeds', value: '459' },
-      ]"
-    >
-      <template #icon>
-        <CIcon icon="cib-facebook" height="52" class="my-4 text-white"/>
-      </template>
-      <template #chart>
-        <CChart
-          class="position-absolute w-100 h-100"
-          type="line"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                backgroundColor: 'rgba(255,255,255,.1)',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointHoverBackgroundColor: '#fff',
-                borderWidth: 2,
-                data: [65, 59, 84, 84, 51, 55, 40],
-                fill: true,
-              },
-            ],
-          }"
-          :options="{
-            elements: {
-              line: {
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-                hitRadius: 10,
-                hoverRadius: 4,
-                hoverBorderWidth: 3,
-              },
-            },
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsD>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsD
-      class="mb-4"
-      style="--cui-card-cap-bg: #00aced"
-      :values="[
-        { title: 'followers', value: '973k' },
-        { title: 'tweets', value: '1.792' },
-      ]"
-    >
-      <template #icon>
-        <CIcon icon="cib-twitter" height="52" class="my-4 text-white" />
-      </template>
-      <template #chart>
-        <CChart
-          class="position-absolute w-100 h-100"
-          type="line"
-          :data="{
-            labels: [
-              'January',
-              'February',
-              'March',
-              'April',
-              'May',
-              'June',
-              'July',
-            ],
-            datasets: [
-              {
-                backgroundColor: 'rgba(255,255,255,.1)',
-                borderColor: 'rgba(255,255,255,.55)',
-                pointHoverBackgroundColor: '#fff',
-                borderWidth: 2,
-                data: [1, 13, 9, 17, 34, 41, 38],
-                fill: true,
-              },
-            ],
-          }"
-          :options="{
-            elements: {
-              line: {
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-                hitRadius: 10,
-                hoverRadius: 4,
-                hoverBorderWidth: 3,
-              },
-            },
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsD>
-  </CCol>
-</CRow>
-```
-
-## WidgetStatsE
-
-::: demo
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsE>
-      <template #chart>
-        <CChart
-          class="mx-auto"
-          type="bar"
-          style="height: 40px; width: 80px;"
-          :data="{
-            labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S', 'M'],
-            datasets: [
-              {
-                backgroundColor: '#321fdb',
-                borderColor: 'transparent',
-                borderWidth: 1,
-                data: [41, 78, 51, 66, 74, 42, 89, 97, 87, 84, 78, 88, 67, 45, 47],
-              },
-            ],
-          }"
-          :options="{
-            maintainAspectRatio: false,
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-          }"
-        />
-      </template>
-      <template #title>title</template>
-      <template #value>1,123</template>
-    </CWidgetStatsE>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsE title="title" value="1,123">
-      <template #chart>
-        <CChart
-          class="mx-auto"
-          type="line"
-          style="height: 40px; width: 80px;"
-          :data="{
-            labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S', 'M'],
-            datasets: [
-              {
-                backgroundColor: 'transparent',
-                borderColor: '#321fdb',
-                borderWidth: 2,
-                data: [41, 78, 51, 66, 74, 42, 89, 97, 87, 84, 78, 88, 67, 45, 47],
-              },
-            ],
-          }"
-          :options="{
-            maintainAspectRatio: false,
-            elements: {
-              line: {
-                tension: 0.4,
-              },
-              point: {
-                radius: 0,
-              },
-            },
-            plugins: {
-              legend: {
-                display: false,
-              },
-            },
-            scales: {
-              x: {
-                display: false,
-              },
-              y: {
-                display: false,
-              },
-            },
-          }"
-        />
-      </template>
-    </CWidgetStatsE>
-  </CCol>
-</CRow>
-:::
-```vue
-<CWidgetStatsE title="title" value="1,123">
-  <CChart
-    type="bar"
-    style="height: 40px"
-    :data="{
-      labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S', 'M'],
-      datasets: [
-        {
-          backgroundColor: '#321fdb',
-          borderColor: 'transparent',
-          borderWidth: 1,
-          data: [41, 78, 51, 66, 74, 42, 89, 97, 87, 84, 78, 88, 67, 45, 47],
-        },
-      ],
-    }"
-    :options="{
-      maintainAspectRatio: false,
-      plugins: {
-        legend: {
-          display: false,
-        },
-      },
-      scales: {
-        x: {
-          display: false,
-        },
-        y: {
-          display: false,
-        },
-      },
-    }"
-  />
-</CWidgetStatsE>
-```
-
-## WidgetStatsF
-
-::: demo
-<CRow>
- <CCol :sm="6">
-  <CWidgetStatsF color="primary" title="Title" value="$1.999,50">
-    <template #icon>
-      <CIcon icon="cil-settings" size="xl"/>
-    </template>
-  </CWidgetStatsF>
- </CCol>
- <CCol :sm="6">
-  <CWidgetStatsF color="info" title="Title" value="$1.999,50">
-    <template #icon>
-      <CIcon icon="cil-settings" size="xl"/>
-    </template>
-  </CWidgetStatsF>
- </CCol>
-</CRow>
-:::
-
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsF color="primary" title="Title" value="$1.999,50">
-      <template #icon>
-        <CIcon icon="cil-settings" size="xl"/>
-      </template>
-    </CWidgetStatsF>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsF color="info" title="Title" value="$1.999,50">
-      <template #icon>
-        <CIcon icon="cil-settings" size="xl"/>
-      </template>
-    </CWidgetStatsF>
-  </CCol>
-</CRow>
-```
-
-::: demo
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsF color="primary" title="Title" value="$1.999,50">
-      <template #icon>
-        <CIcon icon="cil-settings" size="xl"/>
-      </template>
-      <template #footer>
-        <CLink
-          class="font-weight-bold font-xs text-body-secondary"
-          href="https://coreui.io/"
-          rel="noopener norefferer"
-          target="_blank"
-        >
-          View more
-          <CIcon icon="cil-arrow-right" class="ms-auto" width="16" />
-        </CLink>
-      </template>  
-    </CWidgetStatsF>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsF color="info" title="Title" value="$1.999,50">
-      <template #icon>
-        <CIcon icon="cil-settings" size="xl"/>
-      </template>
-      <template #footer>
-        <CLink
-          class="font-weight-bold font-xs text-body-secondary"
-          href="https://coreui.io/"
-          rel="noopener norefferer"
-          target="_blank"
-        >
-          View more
-          <CIcon icon="cil-arrow-right" class="ms-auto" width="16" />
-        </CLink>
-      </template>  
-    </CWidgetStatsF>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow>
-  <CCol :sm="6">
-    <CWidgetStatsF color="primary" title="Title" value="$1.999,50">
-      <template #icon>
-        <CIcon icon="cil-settings" size="xl"/>
-      </template>
-      <template #footer>
-        <CLink
-          class="font-weight-bold font-xs text-body-secondary"
-          href="https://coreui.io/"
-          rel="noopener norefferer"
-          target="_blank"
-        >
-          View more
-          <CIcon icon="cil-arrow-right" class="ms-auto" width="16" />
-        </CLink>
-      </template>  
-    </CWidgetStatsF>
-  </CCol>
-  <CCol :sm="6">
-    <CWidgetStatsF color="info" title="Title" value="$1.999,50">
-      <template #icon>
-        <CIcon icon="cil-settings" size="xl"/>
-      </template>
-      <template #footer>
-        <CLink
-          class="font-weight-bold font-xs text-body-secondary"
-          href="https://coreui.io/"
-          rel="noopener norefferer"
-          target="_blank"
-        >
-          View more
-          <CIcon icon="cil-arrow-right" class="ms-auto" width="16" />
-        </CLink>
-      </template>  
-    </CWidgetStatsF>
-  </CCol>
-</CRow>
-```
-
-## API
-
-!!!include(./api/widgets/CWidgetStatsA.api.md)!!!
-
-!!!include(./api/widgets/CWidgetStatsB.api.md)!!!
-
-!!!include(./api/widgets/CWidgetStatsC.api.md)!!!
-
-!!!include(./api/widgets/CWidgetStatsD.api.md)!!!
-
-!!!include(./api/widgets/CWidgetStatsE.api.md)!!!
-
-!!!include(./api/widgets/CWidgetStatsF.api.md)!!!
diff --git a/packages/docs/customize/css-variables.md b/packages/docs/customize/css-variables.md
deleted file mode 100644
index 20369742..00000000
--- a/packages/docs/customize/css-variables.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-title: CSS variables
-name: CSS variables
-description: Use CoreUI's CSS custom properties for fast and forward-looking design and development.
----
-
-CoreUI includes around two dozen [CSS custom properties (variables)](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties) in its compiled CSS, with dozens more on the way for improved customization on a per-component basis. 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.
-
-**All our custom properties are prefixed with `cui-`** to avoid conflicts with third party CSS.
-
-## Root variables
-
-Here are the variables we include (note that the `:root` is required) that can be accessed anywhere CoreUI's CSS is loaded. They're located in our `_root.scss` file and included in our compiled dist files.
-
-```css
-:root {
-  --cui-blue: #0d6efd;
-  --cui-indigo: #6610f2;
-  --cui-purple: #6f42c1;
-  --cui-pink: #d63384;
-  --cui-red: #dc3545;
-  --cui-orange: #fd7e14;
-  --cui-yellow: #ffc107;
-  --cui-green: #198754;
-  --cui-teal: #20c997;
-  --cui-cyan: #0dcaf0;
-  --cui-black: #000015;
-  --cui-white: #fff;
-  --cui-gray: #8a93a2;
-  --cui-gray-dark: #636f83;
-  --cui-gray-100: #ebedef;
-  --cui-gray-200: #d8dbe0;
-  --cui-gray-300: #c4c9d0;
-  --cui-gray-400: #b1b7c1;
-  --cui-gray-500: #9da5b1;
-  --cui-gray-600: #8a93a2;
-  --cui-gray-700: #768192;
-  --cui-gray-800: #636f83;
-  --cui-gray-900: #4f5d73;
-  --cui-primary: #321fdb;
-  --cui-secondary: #9da5b1;
-  --cui-success: #2eb85c;
-  --cui-info: #39f;
-  --cui-warning: #f9b115;
-  --cui-danger: #e55353;
-  --cui-light: #ebedef;
-  --cui-dark: #4f5d73;
-  --cui-primary-rgb: 50, 31, 219;
-  --cui-secondary-rgb: 157, 165, 177;
-  --cui-success-rgb: 46, 184, 92;
-  --cui-info-rgb: 51, 153, 255;
-  --cui-warning-rgb: 249, 177, 21;
-  --cui-danger-rgb: 229, 83, 83;
-  --cui-light-rgb: 235, 237, 239;
-  --cui-dark-rgb: 79, 93, 115;
-  --cui-white-rgb: 255, 255, 255;
-  --cui-black-rgb: 0, 0, 21;
-  --cui-body-color-rgb: 44, 56, 74;
-  --cui-body-bg-rgb: 255, 255, 255;
-  --cui-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";
-  --cui-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-  --cui-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
-  --cui-body-font-family: var(--cui-font-sans-serif);
-  --cui-body-font-size: 1rem;
-  --cui-body-font-weight: 400;
-  --cui-body-line-height: 1.5;
-  --cui-body-color: rgba(44, 56, 74, 0.95);
-  --cui-body-bg: #fff;
-  --cui-border-width: 1px;
-  --cui-border-style: solid;
-  --cui-border-color: #d8dbe0;
-  --cui-border-color-translucent: rgba(0, 0, 21, 0.175);
-  --cui-border-radius: 0.375rem;
-  --cui-border-radius-sm: 0.25rem;
-  --cui-border-radius-lg: 0.5rem;
-  --cui-border-radius-xl: 1rem;
-  --cui-border-radius-2xl: 2rem;
-  --cui-border-radius-pill: 50rem;
-  --cui-heading-color: unset;
-  --cui-link-color: #321fdb;
-  --cui-link-hover-color: #2819af;
-  --cui-code-color: #d63384;
-  --cui-highlight-bg: #fff3cd;
-}
-```
-
-## Component variables
-
-CoreUI 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 CoreUI components after Sass compilation.
-
-Whenever 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.
-
-## Prefix
-
-Most 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.
-
-Customize the prefix via the `$prefix` Sass variable. By default, it's set to `cui-` (note the trailing dash).
-
-## Examples
-
-CSS 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.
-
-```css
-body {
-  font: 1rem/1.5 var(--cui-font-sans-serif);
-}
-a {
-  color: var(--cui-blue);
-}
-```
-
-## Grid breakpoints
-
-While 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 mean time, you can use these variables in other CSS situations, as well as in your JavaScript.
diff --git a/packages/docs/customize/options.md b/packages/docs/customize/options.md
deleted file mode 100644
index d2bb8f47..00000000
--- a/packages/docs/customize/options.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: Options
-name: Options
-description: Quickly customize CoreUI for Vue with built-in variables to easily toggle global CSS preferences for controlling style and behavior.
----
-
-Customize CoreUI for Vue 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.
-
-You can find and customize these variables for key global options in CoreUI's `@coreui/coreui/scss/_variables.scss` file.
-
-| Variable                       | Values                             | Description                                                                            |
-| ------------------------------ | ---------------------------------- | -------------------------------------------------------------------------------------- |
-| `$spacer`                      | `1rem` (default), or any value > 0 | Specifies the default spacer value to programmatically generate our [spacer utilities](https://coreui.io/docs/utilities/spacing). |
-| `$enable-rounded`              | `true` (default) or `false`        | Enables predefined `border-radius` styles on various components. |
-| `$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. |
-| `$enable-gradients`            | `true` or `false` (default)        | Enables predefined gradients via `background-image` styles on various components. |
-| `$enable-transitions`          | `true` (default) or `false`        | Enables predefined `transition`s on various components. |
-| `$enable-reduced-motion`       | `true` (default) or `false`        | Enables the [`prefers-reduced-motion` media query](https://coreui.io/docs/getting-started/accessibility#reduced-motion), which suppresses certain animations/transitions based on the users' browser/operating system preferences. |
-| `$enable-grid-classes`         | `true` (default) or `false`        | Enables the generation of CSS classes for the grid system (e.g. `.row`, `.col-md-1`, etc.). |
-| `$enable-container-classes`    | `true` (default) or `false`        | Enables the generation of CSS classes for layout containers. (New in v4.2.0) |
-| `$enable-caret`                | `true` (default) or `false`        | Enables pseudo element caret on `.dropdown-toggle`. |
-| `$enable-button-pointers`      | `true` (default) or `false`        | Add "hand" cursor to non-disabled button elements. |
-| `$enable-rfs`                  | `true` (default) or `false`        | Globally enables [RFS](https://coreui.io/docs/getting-started/rfs). |
-| `$enable-validation-icons`     | `true` (default) or `false`        | Enables `background-image` icons within textual inputs and some custom forms for validation states. |
-| `$enable-negative-margins`     | `true` or `false` (default)        | Enables the generation of [negative margin utilities](https://coreui.io/docs/utilities/spacing#negative-margin). |
-| `$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`. |
-| `$enable-important-utilities`  | `true` (default) or `false`        | Enables the `!important` suffix in utility classes. |
-| `$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](https://coreui.io/docs/getting-started/accessibility#reduced-motion) |
-| `$enable-ltr`                  | `false` or `false` (default)       | Enables Left-to-Right |
-| `$enable-rtl`                  | `true` (default) or `false`        | Enables Right-to-Left |
-
diff --git a/packages/docs/customize/sass.md b/packages/docs/customize/sass.md
deleted file mode 100644
index ec3d933e..00000000
--- a/packages/docs/customize/sass.md
+++ /dev/null
@@ -1,325 +0,0 @@
----
-title: Sass
-name: Sass
-description: Utilize our source Sass files to take advantage of variables, maps, mixins, and functions to help you build faster and customize your project.
-menu: customize
-route: /customize/sass
----
-
-Utilize our source Sass files to take advantage of variables, maps, mixins, and more.
-
-## File structure
-
-Whenever possible, avoid modifying CoreUI's core files. For Sass, that means creating your own stylesheet that imports CoreUI for 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:
-
-```text
-your-project/
-├── scss
-│   └── custom.scss
-└── node_modules/
-    └── @coreui/coreui
-        ├── js
-        └── scss
-```
-
-If 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 CoreUI's source files separate from your own.
-
-```text
-your-project/
-├── scss
-│   └── custom.scss
-└── @coreui/coreui/
-    ├── js
-    └── scss
-```
-
-## Importing
-
-In your `custom.scss`, you'll import CoreUI's source Sass files. You have two options: include all of CoreUI, 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.
-
-```scss
-// Custom.scss
-// Option A: Include all of CoreUI
-
-@import "../node_modules/@coreui/coreui/scss/coreui";
-
-// Then add additional custom code here
-```
-
-```scss
-// Custom.scss
-// Option B: Include parts of CoreUI
-
-// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
-@import "../node_modules/@coreui/coreui/scss/functions";
-
-// 2. Include any default variable overrides here
-
-// 3. Include remainder of required CoreUI stylesheets
-@import "../node_modules/@coreui/coreui/scss/variables";
-
-// 4. Include any default map overrides here
-
-// 5. Include remainder of required parts
-@import "../node_modules/@coreui/coreui/scss/maps";
-@import "../node_modules/@coreui/coreui/scss/mixins";
-@import "../node_modules/@coreui/coreui/scss/root";
-
-// 6. Optionally include any other parts as needed
-@import "../node_modules/@coreui/coreui/scss/utilities";
-@import "../node_modules/@coreui/coreui/scss/reboot";
-@import "../node_modules/@coreui/coreui/scss/type";
-@import "../node_modules/@coreui/coreui/scss/images";
-@import "../node_modules/@coreui/coreui/scss/containers";
-@import "../node_modules/@coreui/coreui/scss/grid";
-@import "../node_modules/@coreui/coreui/scss/helpers";
-
-// 7. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
-@import "../node_modules/@coreui/coreui/scss/utilities/api";
-
-// 8. Add additional custom code here
-```
-
-With 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 CoreUI for Bootstrap under the `// Optional` section as needed. We suggest using the full import stack from our `coreui.scss` file as your starting point.
-
-## Variable defaults
-
-Every Sass variable in CoreUI for Bootstrap includes the `!default` flag allowing you to override the variable's default value in your own Sass without modifying CoreUI'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.
-
-You will find the complete list of CoreUI's variables in `@coreui/coreui/scss/_variables.scss`. Some variables are set to `null`, these variables don't output the property unless they are overridden in your configuration.
-
-Variable overrides must come after our functions are imported, but before the rest of the imports.
-
-Here's an example that changes the `background-color` and `color` for the `<body>` when importing and compiling CoreUI for Bootstrap via npm:
-
-```scss
-// Required
-@import "../node_modules/@coreui/coreui/scss/functions";
-
-// Default variable overrides
-$body-bg: #000;
-$body-color: #111;
-
-// Required
-@import "../node_modules/@coreui/coreui/scss/variables";
-@import "../node_modules/@coreui/coreui/scss/maps";
-@import "../node_modules/@coreui/coreui/scss/mixins";
-@import "../node_modules/@coreui/coreui/scss/root";
-
-// Optional CoreUI components here
-@import "../node_modules/@coreui/coreui/scss/reboot";
-@import "../node_modules/@coreui/coreui/scss/type";
-// etc
-```
-
-Repeat as necessary for any variable in CoreUI, including the global options below.
-
-## Maps and loops
-
-CoreUI for Bootstrap 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.
-
-Some 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.
-
-### Modify map
-
-All 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:
-
-```scss
-$primary: #0074d9;
-$danger: #ff4136;
-```
-
-Later on, these variables are set in CoreUI's `$theme-colors` map:
-
-```scss
-$theme-colors: (
-  "primary": $primary,
-  "danger": $danger
-);
-```
-
-### Add to map
-
-Add 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`.
-
-```scss
-// Create your own map
-$custom-colors: (
-  "custom-color": #900
-);
-
-// Merge the maps
-$theme-colors: map-merge($theme-colors, $custom-colors);
-```
-
-### Remove from map
-
-To remove colors from `$theme-colors`, or any other map, use `map-remove`. Be aware you must insert it between our requirements and options:
-
-```scss
-// Required
-@import "../node_modules/@coreui/coreui/scss/functions";
-@import "../node_modules/@coreui/coreui/scss/variables";
-@import "../node_modules/@coreui/coreui/scss/maps";
-@import "../node_modules/@coreui/coreui/scss/mixins";
-@import "../node_modules/@coreui/coreui/scss/root";
-
-$theme-colors: map-remove($theme-colors, "info", "light", "dark");
-
-// Optional
-@import "../node_modules/@coreui/coreui/scss/reboot";
-@import "../node_modules/@coreui/coreui/scss/type";
-// etc
-```
-
-## Required keys
-
-CoreUI for Bootstrap 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.
-
-For 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.
-
-## Functions
-
-### Colors
-
-Next to the [Sass maps](https://coreui.io/docs/customize/color#color-sass-maps") we have, theme colors can also be used as standalone variables, like `$primary`.
-
-```scss
-.custom-element {
-  color: $gray-100;
-  background-color: $dark;
-}
-```
-
-You can lighten or darken colors with CoreUI'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.
-
-```scss
-// Tint a color: mix a color with white
-@function tint-color($color, $weight) {
-  @return mix(white, $color, $weight);
-}
-
-// Shade a color: mix a color with black
-@function shade-color($color, $weight) {
-  @return mix(black, $color, $weight);
-}
-
-// Shade the color if the weight is positive, else tint it
-@function shift-color($color, $weight) {
-  @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));
-}
-```
-
-In practice, you'd call the function and pass in the color and weight parameters.
-
-```scss
-.custom-element {
-  color: tint-color($primary, 10%);
-}
-
-.custom-element-2 {
-  color: shade-color($danger, 30%);
-}
-```
-
-### Color contrast
-
-In 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.
-
-An additional function we include in CoreUI for Bootstrap is the color contrast function, `color-contrast`. It utilizes the [WCAG 2.0 algorithm](https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests) for calculating contrast thresholds based on [relative luminance](https://www.w3.org/WAI/GL/wiki/Relative_luminance) in a `sRGB` colorspace 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.
-
-For example, to generate color swatches from our `$theme-colors` map:
-
-```scss
-@each $color, $value in $theme-colors {
-  .swatch-#{$color} {
-    color: color-contrast($value);
-  }
-}
-```
-
-It can also be used for one-off contrast needs:
-
-```scss
-.custom-element {
-  color: color-contrast(#000); // returns `color: #fff`
-}
-```
-
-You can also specify a base color with our color map functions:
-
-```scss
-.custom-element {
-  color: color-contrast($dark); // returns `color: #fff`
-}
-```
-
-### Escape SVG
-
-We 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.
-
-### Add and Subtract functions
-
-We 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.
-
-Example where the calc is valid:
-
-```scss
-$border-radius: .25rem;
-$border-width: 1px;
-
-.element {
-  // Output calc(.25rem - 1px) is valid
-  border-radius: calc($border-radius - $border-width);
-}
-
-.element {
-  // Output the same calc(.25rem - 1px) as above
-  border-radius: subtract($border-radius, $border-width);
-}
-```
-
-Example where the calc is invalid:
-
-```scss
-$border-radius: .25rem;
-$border-width: 0;
-
-.element {
-  // Output calc(.25rem - 0) is invalid
-  border-radius: calc($border-radius - $border-width);
-}
-
-.element {
-  // Output .25rem
-  border-radius: subtract($border-radius, $border-width);
-}
-```
-
-## Mixins
-
-Our `@coreui/coreui/scss/mixins/` directory has a ton of mixins that power parts of CoreUI and can also be used across your own project.
-
-### Color schemes
-
-A shorthand mixin for the `prefers-color-scheme` media query is available with support for `light`, `dark`, and custom color schemes.
-
-```scss
-@mixin color-scheme($name) {
-  @media (prefers-color-scheme: #{$name}) {
-    @content;
-  }
-}
-```
-
-```scss
-.custom-element {
-  @include color-scheme(dark) {
-    // Insert dark mode styles here
-  }
-
-  @include color-scheme(custom-named-scheme) {
-    // Insert custom color scheme styles here
-  }
-}
-```
diff --git a/packages/docs/forms/checkbox.md b/packages/docs/forms/checkbox.md
deleted file mode 100644
index 3b6ecb4b..00000000
--- a/packages/docs/forms/checkbox.md
+++ /dev/null
@@ -1,192 +0,0 @@
----
-title: Vue Checkbox Component
-name: Checkbox
-description: Create consistent cross-browser and cross-device checkboxes with our Vue checkbox components.
-other_frameworks: checkbox
----
-
-## Approach
-
-Browser default checkboxes are replaced with the help of `<CFormCheck>`. Checkboxes are for selecting one or several options in a list.
-
-## Checks
-
-::: demo
-<CFormCheck id="flexCheckDefault" label="Default checkbox"/>
-<CFormCheck id="flexCheckChecked" label="Checked checkbox" checked />
-:::
-```vue
-<CFormCheck id="flexCheckDefault" label="Default checkbox"/>
-<CFormCheck id="flexCheckChecked" label="Checked checkbox" checked />
-```
-
-### vModel
-
-Single checkbox, boolean value.
-
-::: demo
-<CFormCheck id="flexCheckDefaultVModel" label="Default checkbox" v-model="checked" />
-<div>Checked: {{checked}}</div>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const checked = ref(true)
-</script>
-<template>
-  <CFormCheck id="flexCheckDefaultVModel" label="Default checkbox" v-model="checked" />
-  <div>Checked: {{checked}}</div>
-</template>
-```
-
-We can also bind multiple checkboxes to the same array.
-
-::: demo
-<CFormCheck id="lucas" value="Lucas" label="Lucas" v-model="checkedNames"/>
-<CFormCheck id="andrew" value="Andrew" label="Andrew" v-model="checkedNames"/>
-<CFormCheck id="anna" value="Anna" label="Anna" v-model="checkedNames"/>
-<div>Checked names: {{checkedNames}}</div>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const checkedNames = ref(['Andrew'])
-</script>
-<template>
-  <CFormCheck id="lucas" value="Lucas" label="Lucas" v-model="checkedNames"/>
-  <CFormCheck id="andrew" value="Andrew" label="Andrew" v-model="checkedNames"/>
-  <CFormCheck id="anna" value="Anna" label="Anna" v-model="checkedNames"/>
-  <div>Checked names: {{checkedNames}}</div>
-</template>
-```
-
-## Indeterminate
-
-Checkboxes can utilize the `:indeterminate` pseudo-class when manually set via `indeterminate` property.
-
-::: demo
-<CFormCheck id="flexCheckIndeterminate" label="Indeterminate checkbox" indeterminate />
-
-:::
-```vue
-<CFormCheck id="flexCheckIndeterminate" label="Indeterminate checkbox" indeterminate />
-```
-
-### Disabled
-
-Add the `disabled` attribute and the associated `<label>`s are automatically styled to match with a lighter color to help indicate the input's state.
-
-::: demo
-<CFormCheck label="Disabled checkbox" disabled/>
-<CFormCheck label="Disabled checked checkbox" checked disabled/>
-:::
-```vue
-<CFormCheck label="Disabled checkbox" disabled/>
-<CFormCheck label="Disabled checked checkbox" checked disabled/>
-```
-
-## Default (stacked)
-
-By default, any number of checkboxes that are immediate sibling will be vertically stacked and appropriately spaced.
-
-::: demo
-<CFormCheck id="defaultCheck1" label="Default checkbox"/>
-<CFormCheck id="defaultCheck2" label="Disabled checkbox" disabled/>
-:::
-```vue
-<CFormCheck id="defaultCheck1" label="Default checkbox"/>
-<CFormCheck id="defaultCheck2" label="Disabled checkbox" disabled/>
-```
-
-## Inline
-
-Group checkboxes on the same horizontal row by adding `inline` boolean property to any `<CFormCheck>`.
-
-::: demo
-<CFormCheck inline id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-:::
-```vue
-<CFormCheck inline id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-```
-
-## Reverse 
-
-Put your checkboxes on the opposite side by adding `reverse` boolean property.
-
-::: demo
-<CFormCheck reverse id="reverseCheckbox1" value="option1" label="Reverse checkbox"/>
-<CFormCheck reverse id="reverseCheckbox2" value="option2" label="Disabled reverse checkbox" disabled/>
-:::
-```vue
-<CFormCheck reverse id="reverseCheckbox1" value="option1" label="Reverse checkbox"/>
-<CFormCheck reverse id="reverseCheckbox2" value="option2" label="Disabled reverse checkbox" disabled/>
-```
-
-## Without labels
-
-Remember to still provide some form of accessible name for assistive technologies (for instance, using `aria-label`).
-
-::: demo
-<CFormCheck id="checkboxNoLabel" value="" aria-label="..."/>
-:::
-```vue
-<CFormCheck id="checkboxNoLabel" value="" aria-label="..."/>
-```
-
-## Toggle buttons
-
-Create button-like checkboxes buttons by using `button` boolean property on the `<CFormCheck>` component. These toggle buttons can further be grouped in a button group if needed.
-
-::: demo
-<CFormCheck :button="{ color: 'primary' }" id="btn-check" autocomplete="off" label="Single toggle"/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary' }" id="btn-check" autocomplete="off" label="Single toggle"/>
-```
-
-::: demo
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-2" autocomplete="off" label="Checked" checked/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-2" autocomplete="off" label="Checked" checked/>
-```
-
-::: demo
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-3" autocomplete="off" label="Disabled" disabled/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-3" autocomplete="off" label="Disabled" disabled/>
-```
-
-### Outlined styles
-
-Different variants of button, such at the various outlined styles, are supported.
-
-::: demo
-<CFormCheck :button="{ color: 'primary', variant: 'outline' }" id="btn-check-outlined" autocomplete="off" label="Single toggle"/>
-<CFormCheck :button="{ color: 'secondary', variant: 'outline' }" id="btn-check-2-outlined" autocomplete="off" label="Checked" checked/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary', variant: 'outline' }" id="btn-check-outlined" autocomplete="off" label="Single toggle"/>
-<CFormCheck :button="{ color: 'secondary', variant: 'outline' }" id="btn-check-2-outlined" autocomplete="off" label="Checked" checked/>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-check-variables" />
-
-## API
-
-!!!include(./api/form/CFormCheck.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const checked = ref(true)
-  const checkedNames = ref(['Andrew'])
-</script>
\ No newline at end of file
diff --git a/packages/docs/forms/checks-radios.md b/packages/docs/forms/checks-radios.md
deleted file mode 100644
index c8e48a72..00000000
--- a/packages/docs/forms/checks-radios.md
+++ /dev/null
@@ -1,248 +0,0 @@
----
-title: Vue Radio Component
-name: Radio
-description: Create consistent cross-browser and cross-device radios with our Vue radio component.
----
-
-## Approach
-
-Browser default checkboxes and radios are replaced with the help of `<CFormCheck>`. Checkboxes are for selecting one or several options in a list, while radios are for selecting one option from many.
-
-## Checks
-
-::: demo
-<CFormCheck id="flexCheckDefault" label="Default checkbox"/>
-<CFormCheck id="flexCheckChecked" label="Checked checkbox" checked />
-
-:::
-```vue
-<CFormCheck id="flexCheckDefault" label="Default checkbox"/>
-<CFormCheck id="flexCheckChecked" label="Checked checkbox" checked />
-```
-
-## Indeterminate
-
-Checkboxes can utilize the `:indeterminate` pseudo-class when manually set via `indeterminate` property.
-
-::: demo
-<CFormCheck id="flexCheckIndeterminate" label="Indeterminate checkbox" indeterminate />
-
-:::
-```vue
-<CFormCheck id="flexCheckIndeterminate" label="Indeterminate checkbox" indeterminate />
-```
-
-### Disabled
-
-Add the `disabled` attribute and the associated `<label>`s are automatically styled to match with a lighter color to help indicate the input's state.
-
-::: demo
-<CFormCheck label="Disabled checkbox" disabled/>
-<CFormCheck label="Disabled checked checkbox" checked disabled/>
-:::
-```vue
-<CFormCheck label="Disabled checkbox" disabled/>
-<CFormCheck label="Disabled checked checkbox" checked disabled/>
-```
-
-## Radios
-
-Add the `disabled` attribute and the associated `<label>`s are automatically styled to match with a lighter color to help indicate the input's state.
-
-::: demo
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault1" label="Default radio"/>
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault2" label="Checked radio" checked/>
-:::
-```vue
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault1" label="Default radio"/>
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault2" label="Checked radio" checked/>
-```
-
-### Disabled
-
-::: demo
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioDisabled" label="Disabled radio" disabled/>
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioCheckedDisabled" label="Disabled checked radio" checked disabled/>
-:::
-```vue
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioDisabled" label="Disabled radio" disabled/>
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioCheckedDisabled" label="Disabled checked radio" checked disabled/>
-```
-
-## Switches
-
-A switch has the markup of a custom checkbox but uses the `switch` boolean properly to render a toggle switch. Switches also support the `disabled` attribute.
-
-::: demo
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch label="Checked switch checkbox input" id="formSwitchCheckChecked" checked/>
-<CFormSwitch label="Disabled switch checkbox input" id="formSwitchCheckDisabled" disabled/>
-<CFormSwitch label="Disabled checked switch checkbox input" id="formSwitchCheckCheckedDisabled" checked disabled/>
-:::
-```vue
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch label="Checked switch checkbox input" id="formSwitchCheckChecked" checked/>
-<CFormSwitch label="Disabled switch checkbox input" id="formSwitchCheckDisabled" disabled/>
-<CFormSwitch label="Disabled checked switch checkbox input" id="formSwitchCheckCheckedDisabled" checked disabled/>
-```
-
-### Sizes
-
-::: demo
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch size="lg" label="Large switch checkbox input" id="formSwitchCheckDefaultLg"/>
-<CFormSwitch size="xl" label="Extra large switch checkbox input" id="formSwitchCheckDefaultXL"/>
-:::
-```vue
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch size="lg" label="Large switch checkbox input" id="formSwitchCheckDefaultLg"/>
-<CFormSwitch size="xl" label="Extra large switch checkbox input" id="formSwitchCheckDefaultXL"/>
-```
-
-## Default (stacked)
-
-By default, any number of checkboxes and radios that are immediate sibling will be vertically stacked and appropriately spaced.
-
-::: demo
-<CFormCheck id="defaultCheck1" label="Default checkbox"/>
-<CFormCheck id="defaultCheck2" label="Disabled checkbox" disabled/>
-:::
-```vue
-<CFormCheck id="defaultCheck1" label="Default checkbox"/>
-<CFormCheck id="defaultCheck2" label="Disabled checkbox" disabled/>
-```
-
-::: demo
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios1" value="option1" label="Default radio" checked/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios2" value="option2" label="Second default radio"/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios3" value="option3" label="Disabled radio" disabled/>
-:::
-```vue
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios1" value="option1" label="Default radio" checked/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios2" value="option2" label="Second default radio"/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios3" value="option3" label="Disabled radio" disabled/>
-```
-
-## Inline
-
-Group checkboxes or radios on the same horizontal row by adding `inline` boolean property to any `<CFormCheck>`.
-
-::: demo
-<CFormCheck inline id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-:::
-```vue
-<CFormCheck inline id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-```
-
-::: demo
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-:::
-```vue
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-```
-
-## Without labels
-
-Remember to still provide some form of accessible name for assistive technologies (for instance, using `aria-label`).
-
-::: demo
-<div>
-    <CFormCheck id="checkboxNoLabel" value="" aria-label="..."/>
-</div>
-<div>
-  <CFormCheck type="radio" name="radioNoLabel" id="radioNoLabel" value="" aria-label="..."/>
-</div>
-:::
-```vue
-<div>
-    <CFormCheck id="checkboxNoLabel" value="" aria-label="..."/>
-</div>
-<div>
-  <CFormCheck type="radio" name="radioNoLabel" id="radioNoLabel" value="" aria-label="..."/>
-</div>
-```
-
-## Toggle buttons
-
-Create button-like checkboxes and radio buttons by using `button` boolean property on the `<CFormCheck>` component. These toggle buttons can further be grouped in a button group if needed.
-
-### Checkbox toggle buttons
-
-::: demo
-<CFormCheck :button="{ color: 'primary' }" id="btn-check" autocomplete="off" label="Single toggle"/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary' }" id="btn-check" autocomplete="off" label="Single toggle"/>
-```
-
-::: demo
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-2" autocomplete="off" label="Checked" checked/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-2" autocomplete="off" label="Checked" checked/>
-```
-
-::: demo
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-3" autocomplete="off" label="Disabled" disabled/>
-:::
-```vue
-<CFormCheck :button="{ color: 'primary' }" id="btn-check-3" autocomplete="off" label="Disabled" disabled/>
-```
-
-### Radio toggle buttons
-
-::: demo
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option1" autocomplete="off" label="Checked" checked/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option2" autocomplete="off" label="Radio"/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option3" autocomplete="off" label="Radio" disabled/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option4" autocomplete="off" label="Radio"/>
-:::
-```vue
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option1" autocomplete="off" label="Checked" checked/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option2" autocomplete="off" label="Radio"/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option3" autocomplete="off" label="Radio" disabled/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option4" autocomplete="off" label="Radio"/>
-```
-
-### Outlined styles
-
-Different variants of button, such at the various outlined styles, are supported.
-
-::: demo
-<div> 
-  <CFormCheck :button="{ color: 'primary', variant: 'outline' }" id="btn-check-outlined" autocomplete="off" label="Single toggle"/>
-</div>
-<div>
-  <CFormCheck :button="{ color: 'secondary', variant: 'outline' }" id="btn-check-2-outlined" autocomplete="off" label="Checked" checked/>
-</div>
-<div>
-  <CFormCheck :button="{ color: 'success', variant: 'outline' }" type="radio" name="options-outlined" id="success-outlined" autocomplete="off" label="Radio" checked/>
-  <CFormCheck :button="{ color: 'danger', variant: 'outline' }" type="radio" name="options-outlined" id="danger-outlined" autocomplete="off" label="Radio"/>
-</div>
-:::
-```vue
-<div> 
-  <CFormCheck :button="{ color: 'primary', variant: 'outline' }" id="btn-check-outlined" autocomplete="off" label="Single toggle"/>
-</div>
-<div>
-  <CFormCheck :button="{ color: 'secondary', variant: 'outline' }" id="btn-check-2-outlined" autocomplete="off" label="Checked" checked/>
-</div>
-<div>
-  <CFormCheck :button="{ color: 'success', variant: 'outline' }" type="radio" name="options-outlined" id="success-outlined" autocomplete="off" label="Radio" checked/>
-  <CFormCheck :button="{ color: 'danger', variant: 'outline' }" type="radio" name="options-outlined" id="danger-outlined" autocomplete="off" label="Radio"/>
-</div>
-```
-
-## API
-
-!!!include(./api/form/CFormCheck.api.md)!!!
-
-!!!include(./api/form/CFormSwitch.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/floating-labels.md b/packages/docs/forms/floating-labels.md
deleted file mode 100644
index 75980909..00000000
--- a/packages/docs/forms/floating-labels.md
+++ /dev/null
@@ -1,256 +0,0 @@
----
-title: Vue Floating labels
-name: Floating labels
-description: Vue floating label component. Create beautifully simple form labels that float over your input fields.
-other_frameworks: floating-labels
----
-
-## Example
-Use `floatingLabel` property on `<CFormInput>`, `<CFormSelect>` or `<CFormTextarea>` to enable floating labels with textual form fields. A `placeholder` is required on each `<CFormInput>`, `<CFormSelect>` and `<CFormTextarea>` as our method of CSS-only floating labels uses the `:placeholder-shown` pseudo-element.
-
-::: demo
-<CFormInput
-  class="mb-3"
-  type="email"
-  id="floatingInput"
-  floatingLabel="Email address"
-  placeholder="name@example.com"
-/>
-<CFormInput
-  type="password"
-  id="floatingPassword"
-  floatingLabel="Password"
-  placeholder="Password"
-/>
-:::
-```vue
-<CFormInput type="email" id="floatingInput" floatingLabel="Email address" placeholder="name@example.com" />
-<CFormInput type="password" id="floatingPassword" floatingLabel="Password" placeholder="Password" />
-```
-
-You can create the same form control by wrapping a pair of `<CFormInput>` and `<CFormLabel>` elements in `<CFormFloating>` to enable floating labels with textual form fields. A `placeholder` is required on each `<CFormInput>` as our method of CSS-only floating labels uses the `:placeholder-shown` pseudo-element. Also, note that the `<CFormInput>` must come first so we can utilize a sibling selector (e.g., `~`).
-
-```vue
-<CFormFloating class="mb-3">
-  <CFormInput type="email" id="floatingInput" placeholder="name@example.com" />
-  <CFormLabel for="floatingInput">Email address</CFormLabel>
-</CFormFloating>
-<CFormFloating>
-  <CFormInput type="password" id="floatingPassword" placeholder="Password" />
-  <CFormLabel for="exampleFormControlPassword">Password</CFormLabel>
-</CFormFloating>
-```
-
-When there's a `value` already defined, `<CFormLabel>`s will automatically adjust to their floated position.
-
-::: demo
-<CFormFloating>
-  <CFormInput
-    type="email"
-    id="floatingInputValue"
-    floatingLabel="Input with value"
-    placeholder="name@example.com"
-    value="test@example.com"
-  />
-</CFormFloating>
-:::
-```vue
-<CFormFloating>
-  <CFormInput
-    type="email"
-    id="floatingInputValue"
-    floatingLabel="Input with value"
-    placeholder="name@example.com"
-    value="test@example.com"
-  />
-</CFormFloating>
-```
-
-Form validation styles also work as expected.
-
-::: demo
-<CFormInput
-  class="mb-3"
-  type="email"
-  id="floatingInputInvalid"
-  floatingLabel="Email addresss"
-  placeholder="name@example.com"
-  valid
-  value="test@example.com"
-/>
-<CFormInput
-  type="email"
-  id="floatingInputInvalid"
-  invalid
-  floatingLabel="Email addresss"
-  placeholder="name@example.com"
-  value="test@example.com"
-/>
-:::
-```vue
-<CFormInput
-  class="mb-3"
-  type="email"
-  id="floatingInputInvalid"
-  floatingLabel="Email addresss"
-  placeholder="name@example.com"
-  valid
-  value="test@example.com"
-/>
-<CFormInput
-  type="email"
-  id="floatingInputInvalid"
-  invalid
-  floatingLabel="Email addresss"
-  placeholder="name@example.com"
-  value="test@example.com"
-/>
-```
-
-## Textareas
-
-By default, `<CFormTextarea>`s will be the same height as `<CFormInput>`s.
-
-::: demo
-<CFormFloating>
-  <CFormTextarea
-    id="floatingTextarea"
-    floatingLabel="Comments"
-    placeholder="Leave a comment here"
-  ></CFormTextarea>
-</CFormFloating>
-:::
-```vue
-<CFormFloating>
-  <CFormTextarea
-    id="floatingTextarea"
-    floatingLabel="Comments"
-    placeholder="Leave a comment here"
-  ></CFormTextarea>
-</CFormFloating>
-```
-
-To set a custom height on your `<CFormTextarea>`, do not use the `rows` attribute. Instead, set an explicit `height` (either inline or via custom CSS).
-
-::: demo
-<CFormFloating>
-  <CFormTextarea
-    placeholder="Leave a comment here"
-    id="floatingTextarea2"
-    floatingLabel="Comments"
-    style="height: 100px"
-  ></CFormTextarea>
-</CFormFloating>
-:::
-```vue
-<CFormFloating>
-  <CFormTextarea
-    placeholder="Leave a comment here"
-    id="floatingTextarea2"
-    floatingLabel="Comments"
-    style="height: 100px"
-  ></CFormTextarea>
-</CFormFloating>
-```
-
-## Selects
-
-Other than `<CFormInput>`, floating labels are only available on `<CFormSelect>`s. They work in the same way, but unlike `<CFormInput>`s, they'll always show the `<CFormLabel>` in its floated state. **Selects with `size` and `multiple` are not supported.**
-
-::: demo
-<CFormFloating>
-  <CFormSelect 
-    id="floatingSelect"
-    floatingLabel="Works with selects" 
-    aria-label="Floating label select example"
-  >
-    <option>Open this select menu</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-</CFormFloating>
-:::
-```vue
-<CFormFloating>
-  <CFormSelect 
-    id="floatingSelect"
-    floatingLabel="Works with selects" 
-    aria-label="Floating label select example"
-  >
-    <option>Open this select menu</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-</CFormFloating>
-```
-
-## Layout
-
-When working with the CoreUI for Bootstrap grid system, be sure to place form elements within column classes.
-
-::: demo
-<CRow :xs="{gutter: 2}">
-  <CCol md>
-    <CFormFloating>
-      <CFormInput 
-        type="email"
-        id="floatingInputGrid"
-        floatingLabel="Email address"
-        placeholder="name@example.com"
-        value="email@example.com"
-      />
-    </CFormFloating>
-  </CCol>
-  <CCol md>
-    <CFormFloating>
-      <CFormSelect 
-        id="floatingSelectGrid"
-        floatingLabel="Works with selects"
-        aria-label="Floating label select example"
-      >
-        <option>Open this select menu</option>
-        <option value="1">One</option>
-        <option value="2">Two</option>
-        <option value="3">Three</option>
-      </CFormSelect>
-    </CFormFloating>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow :xs="{gutter: 2}">
-  <CCol md>
-    <CFormFloating>
-      <CFormInput 
-        type="email"
-        id="floatingInputGrid"
-        floatingLabel="Email address"
-        placeholder="name@example.com"
-        value="email@example.com"
-      />
-    </CFormFloating>
-  </CCol>
-  <CCol md>
-    <CFormFloating>
-      <CFormSelect 
-        id="floatingSelectGrid"
-        floatingLabel="Works with selects"
-        aria-label="Floating label select example"
-      >
-        <option>Open this select menu</option>
-        <option value="1">One</option>
-        <option value="2">Two</option>
-        <option value="3">Three</option>
-      </CFormSelect>
-    </CFormFloating>
-  </CCol>
-</CRow>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-floating-variables" />
\ No newline at end of file
diff --git a/packages/docs/forms/form-control.md b/packages/docs/forms/form-control.md
deleted file mode 100644
index 8d87e3f9..00000000
--- a/packages/docs/forms/form-control.md
+++ /dev/null
@@ -1,207 +0,0 @@
----
-title: Vue Form Controls
-name: Form control
-description: Vue input and textarea components. Give textual form controls like `<input>`s and `<textarea>`s an upgrade with custom styles, sizing, focus states, and more.
----
-
-## Example
-
-::: demo
-<CForm>
-  <div class="mb-3">
-    <CFormLabel for="exampleFormControlInput1">Email address</CFormLabel>
-    <CFormInput type="email" id="exampleFormControlInput1" placeholder="name@example.com"/>
-  </div>
-  <div class="mb-3">
-    <CFormLabel for="exampleFormControlTextarea1">Example textarea</CFormLabel>
-    <CFormTextarea id="exampleFormControlTextarea1" rows="3"></CFormTextarea>
-  </div>
-</CForm>
-:::
-```vue
-<CForm>
-  <div class="mb-3">
-    <CFormLabel for="exampleFormControlInput1">Email address</CFormLabel>
-    <CFormInput type="email" id="exampleFormControlInput1" placeholder="name@example.com"/>
-  </div>
-  <div class="mb-3">
-    <CFormLabel for="exampleFormControlTextarea1">Example textarea</CFormLabel>
-    <CFormTextarea id="exampleFormControlTextarea1" rows="3"></CFormTextarea>
-  </div>
-</CForm>
-```
-
-## Sizing
-
-Set heights using `size` property like `size="lg"` and `size="sm"`.
-
-::: demo
-<CFormInput type="text" size="lg" placeholder="Large input" aria-label="lg input example"/>
-<br/>
-<CFormInput type="text" placeholder="Default input" aria-label="default input example"/>
-<br/>
-<CFormInput type="text" size="sm" placeholder="Small input" aria-label="sm input example"/>
-:::
-```vue
-<CFormInput type="text" size="lg" placeholder="Large input" aria-label="lg input example"/>
-<br/>
-<CFormInput type="text" placeholder="Default input" aria-label="default input example"/>
-<br/>
-<CFormInput type="text" size="sm" placeholder="Small input" aria-label="sm input example"/>
-```
-
-## Disabled
-
-Add the `disabled` boolean attribute on an input to give it a grayed out appearance and remove pointer events.
-
-::: demo
-<CFormInput type="text" placeholder="Disabled input" aria-label="Disabled input example" disabled/>
-<br/>
-<CFormInput type="text" placeholder="Disabled readonly input" aria-label="Disabled input example" disabled readonly/>
-<br/>
-:::
-```vue
-<CFormInput type="text" placeholder="Disabled input" aria-label="Disabled input example" disabled/>
-<br/>
-<CFormInput type="text" placeholder="Disabled readonly input" aria-label="Disabled input example" disabled readonly/>
-<br/>
-```
-
-## Readonly
-
-Add the `readonly` boolean attribute on an input to prevent modification of the input's value. Read-only inputs appear lighter (just like disabled inputs), but retain the standard cursor.
-
-::: demo
-<CFormInput type="text" placeholder="Readonly input here..." aria-label="readonly input example" readonly/>
-:::
-```vue
-<CFormInput type="text" placeholder="Readonly input here..." aria-label="readonly input example" readonly/>
-```
-
-## Readonly plain text
-
-If you want to have `<input readonly>` elements in your form styled as plain text, use the `plain-text` boolean property to remove the default form field styling and preserve the correct margin and padding.
-
-::: demo
-<CRow class="mb-3">
-  <CFormLabel for="staticEmail" class="col-sm-2 col-form-label">Email</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="text" id="staticEmail" value="email@example.com" readonly plain-text/>
-  </div>
-</CRow>
-<CRow class="mb-3">
-  <CFormLabel for="inputPassword" class="col-sm-2 col-form-label">Password</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="password" id="inputPassword"/>
-  </div>
-</CRow>
-:::
-```vue
-<CRow class="mb-3">
-  <CFormLabel for="staticEmail" class="col-sm-2 col-form-label">Email</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="text" id="staticEmail" value="email@example.com" readonly plain-text/>
-  </div>
-</CRow>
-<CRow class="mb-3">
-  <CFormLabel for="inputPassword" class="col-sm-2 col-form-label">Password</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="password" id="inputPassword"/>
-  </div>
-</CRow>
-```
-
-::: demo
-<CForm class="row g-3">
-  <div class="col-auto">
-    <CFormLabel for="staticEmail2" class="visually-hidden">Email</CFormLabel>
-    <CFormInput type="text" id="staticEmail2" value="email@example.com" readonly plain-text/>
-  </div>
-  <div class="col-auto">
-    <CFormLabel for="inputPassword2" class="visually-hidden">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword2" placeholder="Password"/>
-  </div>
-  <div class="col-auto">
-    <CButton type="submit" color="primary" class="mb-3">Confirm identity</CButton>
-  </div>
-</CForm>
-:::
-```vue
-<CForm class="row g-3">
-  <div class="col-auto">
-    <CFormLabel for="staticEmail2" class="visually-hidden">Email</CFormLabel>
-    <CFormInput type="text" id="staticEmail2" value="email@example.com" readonly plain-text/>
-  </div>
-  <div class="col-auto">
-    <CFormLabel for="inputPassword2" class="visually-hidden">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword2" placeholder="Password"/>
-  </div>
-  <div class="col-auto">
-    <CButton type="submit" color="primary" class="mb-3">Confirm identity</CButton>
-  </div>
-</CForm>
-```
-
-## File input
-
-::: demo
-<div class="mb-3">
-  <CFormLabel for="formFile">Default file input example</CFormLabel>
-  <CFormInput type="file" id="formFile"/>
-</div>
-<div class="mb-3">
-  <CFormLabel for="formFileMultiple">Multiple files input example</CFormLabel>
-  <CFormInput type="file" id="formFileMultiple" multiple/>
-</div>
-<div class="mb-3">
-  <CFormLabel for="formFileDisabled">Disabled file input example</CFormLabel>
-  <CFormInput type="file" id="formFileDisabled" disabled/>
-</div>
-<div class="mb-3">
-  <CFormLabel for="formFileSm">Small file input example</CFormLabel>
-  <CFormInput type="file" size="sm" id="formFileSm"/>
-</div>
-<div>
-  <CFormLabel for="formFileLg">Large file input example</CFormLabel>
-  <CFormInput type="file" size="lg" id="formFileLg"/>
-</div>
-:::
-```vue
-<div class="mb-3">
-  <CFormLabel for="formFile">Default file input example</CFormLabel>
-  <CFormInput type="file" id="formFile"/>
-</div>
-<div class="mb-3">
-  <CFormLabel for="formFileMultiple">Multiple files input example</CFormLabel>
-  <CFormInput type="file" id="formFileMultiple" multiple/>
-</div>
-<div class="mb-3">
-  <CFormLabel for="formFileDisabled">Disabled file input example</CFormLabel>
-  <CFormInput type="file" id="formFileDisabled" disabled/>
-</div>
-<div class="mb-3">
-  <CFormLabel for="formFileSm">Small file input example</CFormLabel>
-  <CFormInput type="file" size="sm" id="formFileSm"/>
-</div>
-<div>
-  <CFormLabel for="formFileLg">Large file input example</CFormLabel>
-  <CFormInput type="file" size="lg" id="formFileLg"/>
-</div>
-```
-
-## Color
-
-::: demo
-<CFormLabel for="exampleColorInput">Color picker</CFormLabel>
-<CFormInput type="color" id="exampleColorInput" value="#563d7c" title="Choose your color" />
-:::
-```vue
-<CFormLabel for="exampleColorInput">Color picker</CFormLabel>
-<CFormInput type="color" id="exampleColorInput" value="#563d7c" title="Choose your color" />
-```
-
-## API
-
-!!!include(./api/form/CFormInput.api.md)!!!
-
-!!!include(./api/form/CFormTextarea.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/input-group.md b/packages/docs/forms/input-group.md
deleted file mode 100644
index d3a4d523..00000000
--- a/packages/docs/forms/input-group.md
+++ /dev/null
@@ -1,547 +0,0 @@
----
-title: Vue Input Group Component
-name: Input group
-description: Easily extend form controls by adding text, buttons, or button groups on either side of textual inputs, custom selects, and custom file inputs.
-other_frameworks: input-group
----
-
-## Basic example
-
-Place 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 `<CFormLabel>`s outside the input group.
-
-::: demo
-<CInputGroup class="mb-3">
-  <CInputGroupText id="basic-addon1">@</CInputGroupText>
-  <CFormInput placeholder="Username" aria-label="Username" aria-describedby="basic-addon1"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput placeholder="Recipient's username" aria-label="Recipient's username" aria-describedby="basic-addon2"/>
-  <CInputGroupText id="basic-addon2">@example.com</CInputGroupText>
-</CInputGroup>
-<CFormLabel for="basic-url">Your vanity URL</CFormLabel>
-<CInputGroup class="mb-3">
-  <CInputGroupText id="basic-addon3">https://example.com/users/</CInputGroupText>
-  <CFormInput id="basic-url" aria-describedby="basic-addon3"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CInputGroupText>$</CInputGroupText>
-  <CFormInput aria-label="Amount (to the nearest dollar)"/>
-  <CInputGroupText>.00</CInputGroupText>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput placeholder="Username" aria-label="Username"/>
-  <CInputGroupText>@</CInputGroupText>
-  <CFormInput placeholder="Server" aria-label="Server"/>
-</CInputGroup>
-<CInputGroup>
-  <CInputGroupText>With textarea</CInputGroupText>
-  <CFormTextarea aria-label="With textarea"></CFormTextarea>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CInputGroupText id="basic-addon1">@</CInputGroupText>
-  <CFormInput placeholder="Username" aria-label="Username" aria-describedby="basic-addon1"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput placeholder="Recipient's username" aria-label="Recipient's username" aria-describedby="basic-addon2"/>
-  <CInputGroupText id="basic-addon2">@example.com</CInputGroupText>
-</CInputGroup>
-<CFormLabel for="basic-url">Your vanity URL</CFormLabel>
-<CInputGroup class="mb-3">
-  <CInputGroupText id="basic-addon3">https://example.com/users/</CInputGroupText>
-  <CFormInput id="basic-url" aria-describedby="basic-addon3"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CInputGroupText>$</CInputGroupText>
-  <CFormInput aria-label="Amount (to the nearest dollar)"/>
-  <CInputGroupText>.00</CInputGroupText>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput placeholder="Username" aria-label="Username"/>
-  <CInputGroupText>@</CInputGroupText>
-  <CFormInput placeholder="Server" aria-label="Server"/>
-</CInputGroup>
-<CInputGroup>
-  <CInputGroupText>With textarea</CInputGroupText>
-  <CFormTextarea aria-label="With textarea"></CFormTextarea>
-</CInputGroup>
-```
-
-## Wrapping
-
-Input 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`.
-
-::: demo
-<CInputGroup class="flex-nowrap">
-  <CInputGroupText id="addon-wrapping">@</CInputGroupText>
-  <CFormInput placeholder="Username" aria-label="Username" aria-describedby="addon-wrapping"/>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="flex-nowrap">
-  <CInputGroupText id="addon-wrapping">@</CInputGroupText>
-  <CFormInput placeholder="Username" aria-label="Username" aria-describedby="addon-wrapping"/>
-</CInputGroup>
-```
-
-## Sizing
-
-Add the relative form sizing classes to the `<CInputGroup>` itself and contents within will automatically resize—no need for repeating the form control size classes on each element.
-
-**Sizing on the individual input group elements isn't supported.**
-
-::: demo
-<CInputGroup size="sm" class="mb-3">
-  <CInputGroupText id="inputGroup-sizing-sm">Small</CInputGroupText>
-  <CFormInput aria-label="Sizing example input" aria-describedby="inputGroup-sizing-sm"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CInputGroupText id="inputGroup-sizing-default">Default</CInputGroupText>
-  <CFormInput aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default"/>
-</CInputGroup>
-<CInputGroup size="lg">
-  <CInputGroupText id="inputGroup-sizing-lg">Large</CInputGroupText>
-  <CFormInput aria-label="Sizing example input" aria-describedby="inputGroup-sizing-lg"/>
-</CInputGroup>
-:::
-```vue
-<CInputGroup size="sm" class="mb-3">
-  <CInputGroupText id="inputGroup-sizing-sm">Small</CInputGroupText>
-  <CFormInput aria-label="Sizing example input" aria-describedby="inputGroup-sizing-sm"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CInputGroupText id="inputGroup-sizing-default">Default</CInputGroupText>
-  <CFormInput aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default"/>
-</CInputGroup>
-<CInputGroup size="lg">
-  <CInputGroupText id="inputGroup-sizing-lg">Large</CInputGroupText>
-  <CFormInput aria-label="Sizing example input" aria-describedby="inputGroup-sizing-lg"/>
-</CInputGroup>
-```
-
-## Checkboxes and radios
-
-Place any checkbox or radio option within an input group's addon instead of text.
-
-::: demo
-<CInputGroup class="mb-3">
-  <CInputGroupText>
-    <CFormCheck type="checkbox" value="" aria-label="Checkbox for following text input"/>
-  </CInputGroupText>
-  <CFormInput aria-label="Text input with checkbox"/>
-</CInputGroup>
-<CInputGroup>
-  <CInputGroupText>
-    <CFormCheck type="radio" value="" aria-label="Radio button for following text input"/>
-  </CInputGroupText>
-  <CFormInput aria-label="Text input with radio button"/>
-</CInputGroup>
-
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CInputGroupText>
-    <CFormCheck type="checkbox" value="" aria-label="Checkbox for following text input"/>
-  </CInputGroupText>
-  <CFormInput aria-label="Text input with checkbox"/>
-</CInputGroup>
-<CInputGroup>
-  <CInputGroupText>
-    <CFormCheck type="radio" value="" aria-label="Radio button for following text input"/>
-  </CInputGroupText>
-  <CFormInput aria-label="Text input with radio button"/>
-</CInputGroup>
-```
-
-## Multiple inputs
-
-While multiple `<CFormInput>`s are supported visually, validation styles are only available for input groups with a single `<CFormInput>`.
-
-::: demo
-<CInputGroup>
-  <CInputGroupText>First and last name</CInputGroupText>
-  <CFormInput aria-label="First name"/>
-  <CFormInput aria-label="Last name"/>
-</CInputGroup>
-:::
-```vue
-<CInputGroup>
-  <CInputGroupText>First and last name</CInputGroupText>
-  <CFormInput aria-label="First name"/>
-  <CFormInput aria-label="Last name"/>
-</CInputGroup>
-```
-
-## Multiple addons
-
-Multiple add-ons are supported and can be mixed with checkbox and radio input versions.
-
-::: demo
-<CInputGroup class="mb-3">
-  <CInputGroupText>$</CInputGroupText>
-  <CInputGroupText>0.00</CInputGroupText>
-  <CFormInput aria-label="Dollar amount (with dot and two decimal places)"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput aria-label="Dollar amount (with dot and two decimal places)"/>
-  <CInputGroupText>$</CInputGroupText>
-  <CInputGroupText>0.00</CInputGroupText>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CInputGroupText>$</CInputGroupText>
-  <CInputGroupText>0.00</CInputGroupText>
-  <CFormInput aria-label="Dollar amount (with dot and two decimal places)"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput aria-label="Dollar amount (with dot and two decimal places)"/>
-  <CInputGroupText>$</CInputGroupText>
-  <CInputGroupText>0.00</CInputGroupText>
-</CInputGroup>
-```
-
-## Button addons
-
-::: demo
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline" id="button-addon1">Button</CButton>
-  <CFormInput placeholder="" aria-label="Example text with button addon" aria-describedby="button-addon1"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput placeholder="Recipient's username" aria-label="Recipient's username" aria-describedby="button-addon2"/>
-  <CButton type="button" color="secondary" variant="outline" id="button-addon2">Button</CButton>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CFormInput placeholder="" aria-label="Example text with two button addons"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput placeholder="Recipient's username" aria-label="Recipient's username with two button addons"/>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline" id="button-addon1">Button</CButton>
-  <CFormInput placeholder="" aria-label="Example text with button addon" aria-describedby="button-addon1"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput placeholder="Recipient's username" aria-label="Recipient's username" aria-describedby="button-addon2"/>
-  <CButton type="button" color="secondary" variant="outline" id="button-addon2">Button</CButton>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CFormInput placeholder="" aria-label="Example text with two button addons"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput placeholder="Recipient's username" aria-label="Recipient's username with two button addons"/>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-</CInputGroup>
-```
-
-## Buttons with dropdowns
-
-::: demo
-<CInputGroup class="mb-3">
-  <CDropdown variant="input-group"> 
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CFormInput aria-label="Text input with dropdown button"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput aria-label="Text input with dropdown button"/>
-  <CDropdown alignment="end" variant="input-group"> 
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CInputGroup>
-<CInputGroup>
-  <CDropdown variant="input-group"> 
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CFormInput aria-label="Text input with 2 dropdown buttons"/>
-  <CDropdown alignment="end" variant="input-group"> 
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CInputGroup>
-
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CDropdown variant="input-group"> 
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CFormInput aria-label="Text input with dropdown button"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput aria-label="Text input with dropdown button"/>
-  <CDropdown alignment="end" variant="input-group">
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CInputGroup>
-<CInputGroup>
-  <CDropdown variant="input-group">
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CFormInput aria-label="Text input with 2 dropdown buttons"/>
-  <CDropdown alignment="end" variant="input-group">
-    <CDropdownToggle color="secondary" variant="outline">Dropdown</CDropdownToggle>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CInputGroup>
-```
-
-## Segmented buttons
-
-::: demo
-<CInputGroup class="mb-3">
-  <CDropdown variant="input-group">
-    <CButton type="button" color="secondary" variant="outline">Action</CButton>
-    <CDropdownToggle color="secondary" variant="outline" split/>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CFormInput aria-label="Text input with segmented dropdown button"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput aria-label="Text input with segmented dropdown button"/>
-  <CDropdown alignment="end" variant="input-group">
-    <CButton type="button" color="secondary" variant="outline">Action</CButton>
-    <CDropdownToggle color="secondary" variant="outline" split/>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CDropdown variant="input-group">
-    <CButton type="button" color="secondary" variant="outline">Action</CButton>
-    <CDropdownToggle color="secondary" variant="outline" split/>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-  <CFormInput aria-label="Text input with segmented dropdown button"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput aria-label="Text input with segmented dropdown button"/>
-  <CDropdown alignment="end" variant="input-group">
-    <CButton type="button" color="secondary" variant="outline">Action</CButton>
-    <CDropdownToggle color="secondary" variant="outline" split/>
-    <CDropdownMenu>
-      <CDropdownItem href="#">Action</CDropdownItem>
-      <CDropdownItem href="#">Another action</CDropdownItem>
-      <CDropdownItem href="#">Something else here</CDropdownItem>
-      <CDropdownDivider/>
-      <CDropdownItem href="#">Separated link</CDropdownItem>
-    </CDropdownMenu>
-  </CDropdown>
-</CInputGroup>
-```
-
-## Custom forms
-
-Input groups include support for custom selects and custom file inputs. Browser default versions of these are not supported.
-
-### Custom select
-
-::: demo
-<CInputGroup class="mb-3">
-  <CInputGroupText as="label" for="inputGroupSelect01">Options</CInputGroupText>
-  <CFormSelect id="inputGroupSelect01">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormSelect id="inputGroupSelect02">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-  <CInputGroupText as="label" for="inputGroupSelect02">Options</CInputGroupText>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CFormSelect id="inputGroupSelect03" aria-label="Example select with button addon">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-</CInputGroup>
-<CInputGroup>
-  <CFormSelect id="inputGroupSelect04" aria-label="Example select with button addon">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CInputGroupText as="label" for="inputGroupSelect01">Options</CInputGroupText>
-  <CFormSelect id="inputGroupSelect01">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormSelect id="inputGroupSelect02">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-  <CInputGroupText as="label" for="inputGroupSelect02">Options</CInputGroupText>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-  <CFormSelect id="inputGroupSelect03" aria-label="Example select with button addon">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-</CInputGroup>
-<CInputGroup>
-  <CFormSelect id="inputGroupSelect04" aria-label="Example select with button addon">
-    <option>Choose...</option>
-    <option value="1">One</option>
-    <option value="2">Two</option>
-    <option value="3">Three</option>
-  </CFormSelect>
-  <CButton type="button" color="secondary" variant="outline">Button</CButton>
-</CInputGroup>
-```
-
-### Custom file input
-
-::: demo
-<CInputGroup class="mb-3">
-  <CInputGroupText as="label" for="inputGroupFile01">Upload</CInputGroupText>
-  <CFormInput type="file" id="inputGroupFile01"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput type="file" id="inputGroupFile02"/>
-  <CInputGroupText as="label" for="inputGroupFile02">Upload</CInputGroupText>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline" id="inputGroupFileAddon03">Button</CButton>
-  <CFormInput type="file" id="inputGroupFile03" aria-describedby="inputGroupFileAddon03" aria-label="Upload"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput type="file" id="inputGroupFile04" aria-describedby="inputGroupFileAddon04" aria-label="Upload"/>
-  <CButton type="button" color="secondary" variant="outline" id="inputGroupFileAddon04">Button</CButton>
-</CInputGroup>
-:::
-```vue
-<CInputGroup class="mb-3">
-  <CInputGroupText as="label" for="inputGroupFile01">Upload</CInputGroupText>
-  <CFormInput type="file" id="inputGroupFile01"/>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CFormInput type="file" id="inputGroupFile02"/>
-  <CInputGroupText as="label" for="inputGroupFile02">Upload</CInputGroupText>
-</CInputGroup>
-<CInputGroup class="mb-3">
-  <CButton type="button" color="secondary" variant="outline" id="inputGroupFileAddon03">Button</CButton>
-  <CFormInput type="file" id="inputGroupFile03" aria-describedby="inputGroupFileAddon03" aria-label="Upload"/>
-</CInputGroup>
-<CInputGroup>
-  <CFormInput type="file" id="inputGroupFile04" aria-describedby="inputGroupFileAddon04" aria-label="Upload"/>
-  <CButton type="button" color="secondary" variant="outline" id="inputGroupFileAddon04">Button</CButton>
-</CInputGroup>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="input-group-variables" />
-
-## API
-
-!!!include(./api/form/CInputGroup.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/input.md b/packages/docs/forms/input.md
deleted file mode 100644
index 71bafe1f..00000000
--- a/packages/docs/forms/input.md
+++ /dev/null
@@ -1,259 +0,0 @@
----
-title: Vue Form Input
-name: Form input
-description: Vue input components. Give textual form `<input>`s an upgrade with custom styles, sizing, focus states, validation, and more.
-other_frameworks: input
----
-
-## Example
-
-::: demo
-<CForm>
-  <CFormInput
-    type="email"
-    id="exampleFormControlInput1"
-    label="Email address"
-    placeholder="name@example.com"
-    text="Must be 8-20 characters long."
-    aria-describedby="exampleFormControlInputHelpInline"
-  />
-</CForm>
-:::
-```vue
-<CForm>
-  <CFormInput
-    type="email"
-    id="exampleFormControlInput1"
-    label="Email address"
-    placeholder="name@example.com"
-    text="Must be 8-20 characters long."
-    aria-describedby="exampleFormControlInputHelpInline"
-  />
-</CForm>
-```
-
-If you need to add custom classs to form's components, or need to add some custom elements you can add each form component separately. Please check the example below.
-
-```vue
-<CForm>
-  <CFormLabel for="exampleFormControlInput1">Email address</CFormLabel>
-  <CFormInput type="email" id="exampleFormControlInput1" placeholder="name@example.com" aria-describedby="exampleFormControlInputHelpInline" />
-  <CFormText as="span" id="exampleFormControlInputHelpInline">
-    Must be 8-20 characters long.
-  </CFormText>
-</CForm>
-```
-
-You can also use slots.
-
-```vue
-<CFormInput
-  type="email"
-  id="exampleFormControlInput1"
-  placeholder="name@example.com"
-  aria-describedby="exampleFormControlInputHelpInline"
->
-  <template #label>Email address</template>
-  <template #text>Must be 8-20 characters long.</template>
-</CFormInput>
-```
-
-## Sizing
-
-Set heights using `size` property like `size="lg"` and `size="sm"`.
-
-::: demo
-<CFormInput
-  type="text"
-  class="mb-3"
-  size="lg"
-  placeholder="Large input"
-  aria-label="lg input example"
-/>
-<CFormInput
-  type="text"
-  class="mb-3"
-  placeholder="Default input"
-  aria-label="default input example"
-/>
-<CFormInput
-  type="text"
-  class="mb-3"
-  size="sm"
-  placeholder="Small input"
-  aria-label="sm input example"
-/>
-:::
-```vue
-<CFormInput type="text" size="lg" placeholder="Large input" aria-label="lg input example"/>
-<CFormInput type="text" placeholder="Default input" aria-label="default input example"/>
-<CFormInput type="text" size="sm" placeholder="Small input" aria-label="sm input example"/>
-```
-
-## Disabled
-
-Add the `disabled` boolean attribute on an input to give it a grayed out appearance and remove pointer events.
-
-::: demo
-<CFormInput type="text" placeholder="Disabled input" aria-label="Disabled input example" disabled/>
-<br/>
-<CFormInput type="text" placeholder="Disabled readonly input" aria-label="Disabled input example" disabled readonly/>
-<br/>
-:::
-```vue
-<CFormInput type="text" placeholder="Disabled input" aria-label="Disabled input example" disabled/>
-<br/>
-<CFormInput type="text" placeholder="Disabled readonly input" aria-label="Disabled input example" disabled readonly/>
-<br/>
-```
-
-## Readonly
-
-Add the `readonly` boolean attribute on an input to prevent modification of the input's value. Read-only inputs appear lighter (just like disabled inputs), but retain the standard cursor.
-
-::: demo
-<CFormInput type="text" placeholder="Readonly input here..." aria-label="readonly input example" readonly/>
-:::
-```vue
-<CFormInput type="text" placeholder="Readonly input here..." aria-label="readonly input example" readonly/>
-```
-
-## Readonly plain text
-
-If you want to have `<input readonly>` elements in your form styled as plain text, use the `plain-text` boolean property to remove the default form field styling and preserve the correct margin and padding.
-
-::: demo
-<CRow class="mb-3">
-  <CFormLabel for="staticEmail" class="col-sm-2 col-form-label">Email</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="text" id="staticEmail" value="email@example.com" readonly plain-text/>
-  </div>
-</CRow>
-<CRow class="mb-3">
-  <CFormLabel for="inputPassword" class="col-sm-2 col-form-label">Password</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="password" id="inputPassword"/>
-  </div>
-</CRow>
-:::
-```vue
-<CRow class="mb-3">
-  <CFormLabel for="staticEmail" class="col-sm-2 col-form-label">Email</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="text" id="staticEmail" value="email@example.com" readonly plain-text/>
-  </div>
-</CRow>
-<CRow class="mb-3">
-  <CFormLabel for="inputPassword" class="col-sm-2 col-form-label">Password</CFormLabel>
-  <div class="col-sm-10">
-    <CFormInput type="password" id="inputPassword"/>
-  </div>
-</CRow>
-```
-
-::: demo
-<CForm class="row g-3">
-  <div class="col-auto">
-    <CFormLabel for="staticEmail2" class="visually-hidden">Email</CFormLabel>
-    <CFormInput type="text" id="staticEmail2" value="email@example.com" readonly plain-text/>
-  </div>
-  <div class="col-auto">
-    <CFormLabel for="inputPassword2" class="visually-hidden">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword2" placeholder="Password"/>
-  </div>
-  <div class="col-auto">
-    <CButton type="submit" color="primary" class="mb-3">Confirm identity</CButton>
-  </div>
-</CForm>
-:::
-```vue
-<CForm class="row g-3">
-  <div class="col-auto">
-    <CFormLabel for="staticEmail2" class="visually-hidden">Email</CFormLabel>
-    <CFormInput type="text" id="staticEmail2" value="email@example.com" readonly plain-text/>
-  </div>
-  <div class="col-auto">
-    <CFormLabel for="inputPassword2" class="visually-hidden">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword2" placeholder="Password"/>
-  </div>
-  <div class="col-auto">
-    <CButton type="submit" color="primary" class="mb-3">Confirm identity</CButton>
-  </div>
-</CForm>
-```
-
-## File input
-
-::: demo
-<div class="mb-3">
-  <CFormInput type="file" id="formFile" label="Default file input example" />
-</div>
-<div class="mb-3">
-  <CFormInput type="file" id="formFileMultiple" label="Multiple files input example" multiple />
-</div>
-<div class="mb-3">
-  <CFormInput type="file" id="formFileDisabled" label="Disabled file input example" disabled />
-</div>
-<div class="mb-3">
-  <CFormInput type="file" size="sm" id="formFileSm" label="Small file input example" />
-</div>
-<div>
-  <CFormInput type="file" size="lg" id="formFileLg" label="Large file input example" />
-</div>
-:::
-```vue
-<CFormInput type="file" id="formFile" label="Default file input example" />
-<CFormInput type="file" id="formFileMultiple" label="Multiple files input example" multiple />
-<CFormInput type="file" id="formFileDisabled" label="Disabled file input example" disabled />
-<CFormInput type="file" size="sm" id="formFileSm" label="Small file input example" />
-<CFormInput type="file" size="lg" id="formFileLg" label="Large file input example" />
-```
-
-## Color
-
-::: demo
-  <CFormInput
-    type="color"
-    id="exampleColorInput"
-    label="Color picker"
-    title="Choose your color"
-    value="#563d7c"
-  />
-:::
-```vue
-<CFormInput
-  type="color"
-  id="exampleColorInput"
-  label="Color picker"
-  title="Choose your color"
-  value="#563d7c"
-/>
-```
-
-## Customizing
-
-### SASS variables
-
-`$input-*` are shared across most of our form controls (and not buttons).
-
-<ScssDocs file="_variables.scss" capture="form-input-variables" />
-
-`$form-label-*` and `$form-text-*` are for our `<CFormLabel />`s and `<CFormText />` component.
-
-<ScssDocs file="_variables.scss" capture="form-label-variables" />
-
-<ScssDocs file="_variables.scss" capture="form-text-variables" />
-
-`$form-file-*` are for file input.
-
-<ScssDocs file="_variables.scss" capture="form-file-variables" />
-
-## API
-
-!!!include(./api/form/CFormInput.api.md)!!!
-
-!!!include(./api/form/CFormFeedback.api.md)!!!
-
-!!!include(./api/form/CFormLabel.api.md)!!!
-
-!!!include(./api/form/CFormText.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/layout.md b/packages/docs/forms/layout.md
deleted file mode 100644
index eed21307..00000000
--- a/packages/docs/forms/layout.md
+++ /dev/null
@@ -1,482 +0,0 @@
----
-title: Vue Form Layout
-name: Layout
-description: Give your forms some structure—from inline to horizontal to custom grid implementations—with our form layout options.
----
-
-## Forms
-
-Every group of form fields should reside in a `<CForm>` element. CoreUI provides no default styling for the `<CForm>` element, but there are some powerful browser features that are provided by default.
-
-- 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.
-- `<CButton>`s within a `<CForm>` default to `type="submit"`, so strive to be specific and always include a `type`.
-- You can disable every form element within a form with the `disabled` attribute on the `<CForm>`.
-
-Since CoreUI 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.
-
-## Utilities
-
-[Margin utilities](https://coreui.io/docs/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.
-
-## Form grid
-
-More complex forms can be built using our grid classes. Use these for form layouts that require multiple columns, varied widths, and additional alignment options.
-
-::: demo
-<CRow>
-  <CCol xs>
-    <CFormInput placeholder="First name" aria-label="First name"/>
-  </CCol>
-  <CCol xs>
-    <CFormInput placeholder="Last name" aria-label="Last name"/>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow>
-  <CCol xs>
-    <CFormInput placeholder="First name" aria-label="First name"/>
-  </CCol>
-  <CCol xs>
-    <CFormInput placeholder="Last name" aria-label="Last name"/>
-  </CCol>
-</CRow>
-```
-
-## Gutters
-
-By adding [gutter modifier classes](https://coreui.io/docs/layout/gutters/), you can have control over the gutter width in as well the inline as block direction.
-
-::: demo
-<CRow class="g-3">
-  <CCol xs>
-    <CFormInput placeholder="First name" aria-label="First name"/>
-  </CCol>
-  <CCol xs>
-    <CFormInput placeholder="Last name" aria-label="Last name"/>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow class="g-3">
-  <CCol xs>
-    <CFormInput placeholder="First name" aria-label="First name"/>
-  </CCol>
-  <CCol xs>
-    <CFormInput placeholder="Last name" aria-label="Last name"/>
-  </CCol>
-</CRow>
-```
-
-More complex layouts can also be created with the grid system.
-
-::: demo
-<CForm class="row g-3">
-  <CCol md="6">
-    <CFormLabel for="inputEmail4">Email</CFormLabel>
-    <CFormInput type="email" id="inputEmail4"/>
-  </CCol>
-  <CCol md="6">
-    <CFormLabel for="inputPassword4">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword4"/>
-  </CCol>
-  <CCol xs="12">
-    <CFormLabel for="inputAddress">Address</CFormLabel>
-    <CFormInput id="inputAddress" placeholder="1234 Main St"/>
-  </CCol>
-  <CCol xs="12">
-    <CFormLabel for="inputAddress2">Address 2</CFormLabel>
-    <CFormInput id="inputAddress2" placeholder="Apartment, studio, or floor"/>
-  </CCol>
-  <CCol md="6">
-    <CFormLabel for="inputCity">City</CFormLabel>
-    <CFormInput id="inputCity"/>
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="inputState">State</CFormLabel>
-    <CFormSelect id="inputState">
-      <option>Choose...</option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="2">
-    <CFormLabel for="inputZip">Zip</CFormLabel>
-    <CFormInput id="inputZip"/>
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck type="checkbox" id="gridCheck" label="Check me out"/>
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Sign in</CButton>
-  </CCol>
-</CForm>
-:::
-```vue
-<CForm class="row g-3">
-  <CCol md="6">
-    <CFormLabel for="inputEmail4">Email</CFormLabel>
-    <CFormInput type="email" id="inputEmail4"/>
-  </CCol>
-  <CCol md="6">
-    <CFormLabel for="inputPassword4">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword4"/>
-  </CCol>
-  <CCol xs="12">
-    <CFormLabel for="inputAddress">Address</CFormLabel>
-    <CFormInput id="inputAddress" placeholder="1234 Main St"/>
-  </CCol>
-  <CCol xs="12">
-    <CFormLabel for="inputAddress2">Address 2</CFormLabel>
-    <CFormInput id="inputAddress2" placeholder="Apartment, studio, or floor"/>
-  </CCol>
-  <CCol md="6">
-    <CFormLabel for="inputCity">City</CFormLabel>
-    <CFormInput id="inputCity"/>
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="inputState">State</CFormLabel>
-    <CFormSelect id="inputState">
-      <option>Choose...</option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="2">
-    <CFormLabel for="inputZip">Zip</CFormLabel>
-    <CFormInput id="inputZip"/>
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck type="checkbox" id="gridCheck" label="Check me out"/>
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Sign in</CButton>
-  </CCol>
-</CForm>
-```
-
-## Horizontal form
-
-Create 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 `<CFormLabel>`s as well so they're vertically centered with their associated form controls.
-
-At 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.
-
-::: demo
-<CForm>
-  <CRow class="mb-3">
-    <CFormLabel for="inputEmail3" class="col-sm-2 col-form-label">Email</CFormLabel>
-    <CCol sm="10">
-      <CFormInput type="email" id="inputEmail3"/>
-    </CCol>
-  </CRow>
-  <CRow class="mb-3">
-    <CFormLabel for="inputPassword3" class="col-sm-2 col-form-label">Password</CFormLabel>
-    <CCol sm="10">
-      <CFormInput type="password" id="inputPassword3"/>
-    </CCol>
-  </CRow>
-  <fieldset class="row mb-3">
-    <legend class="col-form-label col-sm-2 pt-0">Radios</legend>
-    <CCol sm="10">
-      <CFormCheck type="radio" name="gridRadios" id="gridRadios1" value="option1" label="First radio" checked/>
-      <CFormCheck type="radio" name="gridRadios" id="gridRadios2" value="option2" label="Second radio"/>
-      <CFormCheck type="radio" name="gridRadios" id="gridRadios3" value="option3" label="Third disabled radio" disabled/>
-    </CCol>
-  </fieldset>
-  <CRow class="mb-3">
-    <div class="col-sm-10 offset-sm-2">
-      <CFormCheck type="checkbox" id="gridCheck1" label="Example checkbox"/>
-    </div>
-  </CRow>
-  <CButton color="primary" type="submit">Sign in</CButton>
-</CForm>
-:::
-```vue
-<CForm>
-  <CRow class="mb-3">
-    <CFormLabel for="inputEmail3" class="col-sm-2 col-form-label">Email</CFormLabel>
-    <CCol sm="10">
-      <CFormInput type="email" id="inputEmail3"/>
-    </CCol>
-  </CRow>
-  <CRow class="mb-3">
-    <CFormLabel for="inputPassword3" class="col-sm-2 col-form-label">Password</CFormLabel>
-    <CCol sm="10">
-      <CFormInput type="password" id="inputPassword3"/>
-    </CCol>
-  </CRow>
-  <fieldset class="row mb-3">
-    <legend class="col-form-label col-sm-2 pt-0">Radios</legend>
-    <CCol sm="10">
-      <CFormCheck type="radio" name="gridRadios" id="gridRadios1" value="option1" label="First radio" checked/>
-      <CFormCheck type="radio" name="gridRadios" id="gridRadios2" value="option2" label="Second radio"/>
-      <CFormCheck type="radio" name="gridRadios" id="gridRadios3" value="option3" label="Third disabled radio" disabled/>
-    </CCol>
-  </fieldset>
-  <CRow class="mb-3">
-    <div class="col-sm-10 offset-sm-2">
-      <CFormCheck type="checkbox" id="gridCheck1" label="Example checkbox"/>
-    </div>
-  </CRow>
-  <CButton color="primary" type="submit">Sign in</CButton>
-</CForm>
-```
-
-### Horizontal form label sizing
-
-Be sure to use `.col-form-label-sm` or `.col-form-label-lg` to your `<CFormLabel>`s or `<legend>`s to correctly follow the size of `.form-control-lg` and `.form-control-sm`.
-
-::: demo
-<CRow class="mb-3">
-  <CFormLabel for="colFormLabelSm" class="col-sm-2 col-form-label col-form-label-sm">Email</CFormLabel>
-  <CCol sm="10">
-    <CFormInput type="email" class="form-control form-control-sm" id="colFormLabelSm" placeholder="col-form-label-sm"/>
-  </CCol>
-</CRow>
-<CRow class="mb-3">
-  <CFormLabel for="colFormLabel" class="col-sm-2 col-form-label">Email</CFormLabel>
-  <CCol sm="10">
-    <CFormInput type="email" id="colFormLabel" placeholder="col-form-label"/>
-  </CCol>
-</CRow>
-<CRow>
-  <CFormLabel for="colFormLabelLg" class="col-sm-2 col-form-label col-form-label-lg">Email</CFormLabel>
-  <CCol sm="10">
-    <CFormInput type="email" class="form-control form-control-lg" id="colFormLabelLg" placeholder="col-form-label-lg"/>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow class="mb-3">
-  <CFormLabel for="colFormLabelSm" class="col-sm-2 col-form-label col-form-label-sm">Email</CFormLabel>
-  <CCol sm="10">
-    <CFormInput type="email" class="form-control form-control-sm" id="colFormLabelSm" placeholder="col-form-label-sm"/>
-  </CCol>
-</CRow>
-<CRow class="mb-3">
-  <CFormLabel for="colFormLabel" class="col-sm-2 col-form-label">Email</CFormLabel>
-  <CCol sm="10">
-    <CFormInput type="email" id="colFormLabel" placeholder="col-form-label"/>
-  </CCol>
-</CRow>
-<CRow>
-  <CFormLabel for="colFormLabelLg" class="col-sm-2 col-form-label col-form-label-lg">Email</CFormLabel>
-  <CCol sm="10">
-    <CFormInput type="email" class="form-control form-control-lg" id="colFormLabelLg" placeholder="col-form-label-lg"/>
-  </CCol>
-</CRow>
-```
-
-## Column sizing
-
-As shown in the previous examples, our grid system allows you to place any number of `<CCol>`s within a `<CRow>`. 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 `<CCol>`s equally split the rest, with specific column classes like `<CCol sm="7">`.
-
-::: demo
-<CRow class="g-3">
-  <CCol sm="7">
-    <CFormInput placeholder="City" aria-label="City"/>
-  </CCol>
-  <CCol sm>
-    <CFormInput placeholder="State" aria-label="State"/>
-  </CCol>
-  <CCol sm>
-    <CFormInput placeholder="Zip" aria-label="Zip"/>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow class="g-3">
-  <CCol sm="7">
-    <CFormInput placeholder="City" aria-label="City"/>
-  </CCol>
-  <CCol sm>
-    <CFormInput placeholder="State" aria-label="State"/>
-  </CCol>
-  <CCol sm>
-    <CFormInput placeholder="Zip" aria-label="Zip"/>
-  </CCol>
-</CRow>
-```
-
-## Auto-sizing
-
-The example below uses a flexbox utility to vertically center the contents and changes `<CCol>` to `<CCol xs="auto">` so that your columns only take up as much space as needed. Put another way, the column sizes itself based on the contents.
-
-::: demo
-<CForm class="row gy-2 gx-3 align-items-center">
-  <CCol xs="auto">
-    <CFormLabel class="visually-hidden" for="autoSizingInput">Name</CFormLabel>
-    <CFormInput id="autoSizingInput" placeholder="Jane Doe"/>
-  </CCol>
-  <CCol xs="auto">
-    <CFormLabel class="visually-hidden" for="autoSizingInputGroup">Username</CFormLabel>
-    <CInputGroup>
-      <CInputGroupText>@</CInputGroupText>
-      <CFormInput id="autoSizingInputGroup" placeholder="Username"/>
-    </CInputGroup>
-  </CCol>
-  <CCol xs="auto">
-    <CFormLabel class="visually-hidden" for="autoSizingSelect">Preference</CFormLabel>
-    <CFormSelect id="autoSizingSelect">
-      <option>Choose...</option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </CCol>
-  <CCol xs="auto">
-    <CFormCheck type="checkbox" id="autoSizingCheck" label="Remember me"/>
-  </CCol>
-  <CCol xs="auto">
-    <CButton color="primary" type="submit">Submit</CButton>
-  </CCol>
-</CForm>
-:::
-```vue
-<CForm class="row gy-2 gx-3 align-items-center">
-  <CCol xs="auto">
-    <CFormLabel class="visually-hidden" for="autoSizingInput">Name</CFormLabel>
-    <CFormInput id="autoSizingInput" placeholder="Jane Doe"/>
-  </CCol>
-  <CCol xs="auto">
-    <CFormLabel class="visually-hidden" for="autoSizingInputGroup">Username</CFormLabel>
-    <CInputGroup>
-      <CInputGroupText>@</CInputGroupText>
-      <CFormInput id="autoSizingInputGroup" placeholder="Username"/>
-    </CInputGroup>
-  </CCol>
-  <CCol xs="auto">
-    <CFormLabel class="visually-hidden" for="autoSizingSelect">Preference</CFormLabel>
-    <CFormSelect id="autoSizingSelect">
-      <option>Choose...</option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </CCol>
-  <CCol xs="auto">
-    <CFormCheck type="checkbox" id="autoSizingCheck" label="Remember me"/>
-  </CCol>
-  <CCol xs="auto">
-    <CButton color="primary" type="submit">Submit</CButton>
-  </CCol>
-</CForm>
-```
-
-You can then remix that once again with size-specific column classes.
-
-::: demo
-<CForm class="row gx-3 gy-2 align-items-center">
-  <CCol sm="3">
-    <CFormLabel class="visually-hidden" for="specificSizeInputName">Name</CFormLabel>
-    <CFormInput id="specificSizeInputName" placeholder="Jane Doe"/>
-  </CCol>
-  <CCol sm="3">
-    <CFormLabel class="visually-hidden" for="specificSizeInputGroupUsername">Username</CFormLabel>
-    <CInputGroup>
-      <CInputGroupText>@</CInputGroupText>
-      <CFormInput id="specificSizeInputGroupUsername" placeholder="Username"/>
-    </CInputGroup>
-  </CCol>
-  <CCol sm="3">
-    <CFormLabel class="visually-hidden" for="specificSizeSelect">Preference</CFormLabel>
-    <CFormSelect id="specificSizeSelect">
-      <option>Choose...</option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </CCol>
-  <CCol xs="auto">
-    <CFormCheck type="checkbox" id="autoSizingCheck2" label="Remember me"/>
-  </CCol>
-  <CCol xs="auto">
-    <CButton color="primary" type="submit">Submit</CButton>
-  </CCol>
-</CForm>
-:::
-```vue
-<CForm class="row gx-3 gy-2 align-items-center">
-  <CCol sm="3">
-    <CFormLabel class="visually-hidden" for="specificSizeInputName">Name</CFormLabel>
-    <CFormInput id="specificSizeInputName" placeholder="Jane Doe"/>
-  </CCol>
-  <CCol sm="3">
-    <CFormLabel class="visually-hidden" for="specificSizeInputGroupUsername">Username</CFormLabel>
-    <CInputGroup>
-      <CInputGroupText>@</CInputGroupText>
-      <CFormInput id="specificSizeInputGroupUsername" placeholder="Username"/>
-    </CInputGroup>
-  </CCol>
-  <CCol sm="3">
-    <CFormLabel class="visually-hidden" for="specificSizeSelect">Preference</CFormLabel>
-    <CFormSelect id="specificSizeSelect">
-      <option>Choose...</option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </CCol>
-  <CCol xs="auto">
-    <CFormCheck type="checkbox" id="autoSizingCheck2" label="Remember me"/>
-  </CCol>
-  <CCol xs="auto">
-    <CButton color="primary" type="submit">Submit</CButton>
-  </CCol>
-</CForm>
-```
-
-## Inline forms
-
-Use the `<CCol xs="auto">` class to create horizontal layouts. By adding [gutter modifier classes](https://coreui.io/docs/layout/gutters/), we will have gutters in horizontal and vertical directions. The `.align-items-center` aligns the form elements to the middle, making the `<CFormCheck>` align properly.
-
-::: demo
-<CForm class="row row-cols-lg-auto g-3 align-items-center">
-  <CCol xs="12">
-    <CFormLabel class="visually-hidden" for="inlineFormInputGroupUsername">Username</CFormLabel>
-    <CInputGroup>
-      <CInputGroupText>@</CInputGroupText>
-      <CFormInput id="inlineFormInputGroupUsername" placeholder="Username"/>
-    </CInputGroup>
-  </CCol>
-  <CCol xs="12">
-    <CFormLabel class="visually-hidden" for="inlineFormSelectPref">Preference</CFormLabel>
-    <CFormSelect id="inlineFormSelectPref">
-      <option>Choose...</option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck type="checkbox" id="inlineFormCheck" label="Remember me"/>
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit</CButton>
-  </CCol>
-</CForm>
-:::
-```vue
-<CForm class="row row-cols-lg-auto g-3 align-items-center">
-  <CCol xs="12">
-    <CFormLabel class="visually-hidden" for="inlineFormInputGroupUsername">Username</CFormLabel>
-    <CInputGroup>
-      <CInputGroupText>@</CInputGroupText>
-      <CFormInput id="inlineFormInputGroupUsername" placeholder="Username"/>
-    </CInputGroup>
-  </CCol>
-  <CCol xs="12">
-    <CFormLabel class="visually-hidden" for="inlineFormSelectPref">Preference</CFormLabel>
-    <CFormSelect id="inlineFormSelectPref">
-      <option>Choose...</option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck type="checkbox" id="inlineFormCheck" label="Remember me"/>
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit</CButton>
-  </CCol>
-</CForm>
-```
diff --git a/packages/docs/forms/overview.md b/packages/docs/forms/overview.md
deleted file mode 100644
index d37133f6..00000000
--- a/packages/docs/forms/overview.md
+++ /dev/null
@@ -1,182 +0,0 @@
----
-title: Vue Form Components
-name: Overview
-description: Examples and usage guidelines for form control styles, layout options, and custom components for creating a wide variety of forms.
----
-
-## Overview
-
-CoreUI’s form controls expand on our Rebooted form styles with classes. Use these classes to opt into their customized displays for a more consistent rendering across browsers and devices.
-
-Be 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.
-
-Here’s a quick example to demonstrate CoreUI’s form styles. Keep reading for documentation on required classes, form layout, and more.
-
-::: demo
-<CForm>
-  <div class="mb-3">
-    <CFormLabel for="exampleInputEmail1">Email address</CFormLabel>
-    <CFormInput type="email" id="exampleInputEmail1" aria-describedby="emailHelp" />
-    <CFormText id="emailHelp">We'll never share your email with anyone else.</CFormText>
-  </div>
-  <div class="mb-3">
-    <CFormLabel for="exampleInputPassword1">Email Password</CFormLabel>
-    <CFormInput type="password" id="exampleInputPassword1" />
-  </div>
-  <CFormCheck
-    class="mb-3"
-    label="Check me out"
-  />
-  <CButton type="submit" color="primary">
-    Submit
-  </CButton>
-</CForm>
-:::
-```vue
-<CForm>
-  <div class="mb-3">
-    <CFormLabel for="exampleInputEmail1">Email address</CFormLabel>
-    <CFormInput type="email" id="exampleInputEmail1" aria-describedby="emailHelp" />
-    <CFormText id="emailHelp">We'll never share your email with anyone else.</CFormText>
-  </div>
-  <div class="mb-3">
-    <CFormLabel for="exampleInputPassword1">Email Password</CFormLabel>
-    <CFormInput type="password" id="exampleInputPassword1" />
-  </div>
-  <CFormCheck
-    class="mb-3"
-    label="Check me out"
-  />
-  <CButton type="submit" color="primary">
-    Submit
-  </CButton>
-</CForm>
-```
-
-## Form text
-
-Block-level or inline-level form text can be created using `<CFormText>`.
-
-Associating form text with form controls
-Form 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.
-
-Form text below inputs can be styled with `<CFormText>`. If a block-level element will be used, a top margin is added for easy spacing from the inputs above.
-
-::: demo
-<CForm>
-  <div class="mb-3">
-    <CFormLabel for="inputPassword5">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword5" aria-describedby="passwordHelpBlock" />
-    <CFormText id="passwordHelpBlock">
-      Your password must be 8-20 characters long, contain letters and numbers, and must not
-      contain spaces, special characters, or emoji.
-    </CFormText>
-  </div>
-</CForm>
-
-:::
-```vue
-<CForm>
-  <div class="mb-3">
-    <CFormLabel for="inputPassword5">Password</CFormLabel>
-    <CFormInput type="password" id="inputPassword5" aria-describedby="passwordHelpBlock" />
-    <CFormText id="passwordHelpBlock">
-      Your password must be 8-20 characters long, contain letters and numbers, and must not
-      contain spaces, special characters, or emoji.
-    </CFormText>
-  </div>
-</CForm>
-
-```
-
-Inline text can use any typical inline HTML element (be it a `<span>`, `<small>`, or something else) with nothing more than the `.form-text` class.
-
-::: demo
-<CRow class="g-3 align-items-center">
-  <CCol xs="auto">
-    <CFormLabel for="inputPassword6" class="col-form-label">
-      Password
-    </CFormLabel>
-  </CCol>
-  <CCol xs="auto">
-    <CFormInput type="password" id="inputPassword6" aria-describedby="passwordHelpInline" />
-  </CCol>
-  <CCol xs="auto">
-    <CFormText as="span" id="passwordHelpInline">
-      Must be 8-20 characters long.
-    </CFormText>
-  </CCol>
-</CRow>
-:::
-```vue
-<CRow class="g-3 align-items-center">
-  <CCol xs="auto">
-    <CFormLabel for="inputPassword6" class="col-form-label">
-      Password
-    </CFormLabel>
-  </CCol>
-  <CCol xs="auto">
-    <CFormInput type="password" id="inputPassword6" aria-describedby="passwordHelpInline" />
-  </CCol>
-  <CCol xs="auto">
-    <CFormText as="span" id="passwordHelpInline">
-      Must be 8-20 characters long.
-    </CFormText>
-  </CCol>
-</CRow>
-```
-
-## Disabled forms
-
-Add the `disabled` boolean attribute on an input to prevent user interactions and make it appear lighter.
-
-```vue
-<CFormLabel id="disabledInput" type="text" placeholder="Disabled input here..." disabled />
-```
-
-Add 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.
-
-However, if your form also includes custom button-like elements such as `<CButton>...</CButton>`, 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.
-
-::: demo
-<CForm>
-  <fieldset disabled>
-    <legend>Disabled fieldset example</legend>
-    <div class="mb-3">
-      <CFormLabel for="disabledTextInput">Disabled input</CFormLabel>
-      <CFormInput id="disabledTextInput" placeholder="Disabled input" />
-    </div>
-    <div class="mb-3">
-      <CFormLabel for="disabledSelect">Disabled select menu</CFormLabel>
-      <CFormSelect id="disabledSelect">
-        <option>Disabled select</option>
-      </CFormSelect>
-    </div>
-    <div class="mb-3">
-      <CFormCheck id="disabledFieldsetCheck" label="Can't check this" disabled />
-    </div>
-    <CButton color="primary" type="submit">Submit</CButton>
-  </fieldset>
-</CForm>
-:::
-```vue
-<CForm>
-  <fieldset disabled>
-    <legend>Disabled fieldset example</legend>
-    <div class="mb-3">
-      <CFormLabel for="disabledTextInput">Disabled input</CFormLabel>
-      <CFormInput id="disabledTextInput" placeholder="Disabled input" />
-    </div>
-    <div class="mb-3">
-      <CFormLabel for="disabledSelect">Disabled select menu</CFormLabel>
-      <CFormSelect id="disabledSelect">
-        <option>Disabled select</option>
-      </CFormSelect>
-    </div>
-    <div class="mb-3">
-      <CFormCheck id="disabledFieldsetCheck" label="Can't check this" disabled />
-    </div>
-    <CButton color="primary" type="submit">Submit</CButton>
-  </fieldset>
-</CForm>
-```
diff --git a/packages/docs/forms/radio.md b/packages/docs/forms/radio.md
deleted file mode 100644
index c52d2a02..00000000
--- a/packages/docs/forms/radio.md
+++ /dev/null
@@ -1,158 +0,0 @@
----
-title: Vue Checkbox & Radio Components
-name: Checks & radios
-description: Create consistent cross-browser and cross-device checkboxes and radios with our Vue checkbox, radio, and switch components.
-other_frameworks: radio
----
-
-## Approach
-
-Browser default radios are replaced with the help of `<CFormCheck radio>`. Radios are for selecting one option from many.
-
-## Radios
-
-Add the `disabled` attribute and the associated `<label>`s are automatically styled to match with a lighter color to help indicate the input's state.
-
-::: demo
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault1" label="Default radio"/>
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault2" label="Checked radio" checked/>
-:::
-```vue
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault1" label="Default radio"/>
-<CFormCheck type="radio" name="flexRadioDefault" id="flexRadioDefault2" label="Checked radio" checked/>
-```
-
-### vModel
-
-::: demo
-<CFormCheck type="radio" id="flexRadioVModel1" inline label="One" value="One" v-model="picked"/>
-<CFormCheck type="radio" id="flexRadioVModel2" inline label="Two" value="Two" v-model="picked"/>
-<CFormCheck type="radio" id="flexRadioVModel3" inline label="Three" value="Three" v-model="picked"/>
-<CFormCheck type="radio" id="flexRadioVModel4" inline label="Four" value="Four" v-model="picked"/>
-<CFormCheck type="radio" id="flexRadioVModel5" inline label="Five" value="Five" v-model="picked"/>
-<div>Picked: {{ picked }}</div>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const picked = ref('Four')
-</script>
-<template>
-  <CFormCheck type="radio" id="flexRadioVModel1" inline label="One" value="One" v-model="picked"/>
-  <CFormCheck type="radio" id="flexRadioVModel2" inline label="Two" value="Two" v-model="picked"/>
-  <CFormCheck type="radio" id="flexRadioVModel3" inline label="Three" value="Three" v-model="picked"/>
-  <CFormCheck type="radio" id="flexRadioVModel4" inline label="Four" value="Four" v-model="picked"/>
-  <CFormCheck type="radio" id="flexRadioVModel5" inline label="Five" value="Five" v-model="picked"/>
-  <div>Picked: {{ picked }}</div>
-</template>
-```
-
-### Disabled
-
-::: demo
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioDisabled" label="Disabled radio" disabled/>
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioCheckedDisabled" label="Disabled checked radio" checked disabled/>
-:::
-```vue
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioDisabled" label="Disabled radio" disabled/>
-<CFormCheck type="radio" name="flexRadioDisabled" id="flexRadioCheckedDisabled" label="Disabled checked radio" checked disabled/>
-```
-
-## Default (stacked)
-
-By default, any number of radios that are immediate sibling will be vertically stacked and appropriately spaced.
-
-::: demo
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios1" value="option1" label="Default radio" checked/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios2" value="option2" label="Second default radio"/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios3" value="option3" label="Disabled radio" disabled/>
-:::
-```vue
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios1" value="option1" label="Default radio" checked/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios2" value="option2" label="Second default radio"/>
-<CFormCheck type="radio" name="exampleRadios" id="exampleRadios3" value="option3" label="Disabled radio" disabled/>
-```
-
-## Inline
-
-Group radios on the same horizontal row by adding `inline` boolean property to any `<CFormCheck>`.
-
-::: demo
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-:::
-```vue
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox1" value="option1" label="1"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox2" value="option2" label="2"/>
-<CFormCheck inline type="radio" name="inlineRadioOptions" id="inlineCheckbox3" value="option3" label="3 (disabled)" disabled/>
-```
-
-## Reverse 
-
-Put your radios on the opposite side by adding `reverse` boolean property.
-
-::: demo
-<CFormCheck reverse type="radio" id="reverseOption1" value="option1" label="Reverse radio"/>
-<CFormCheck reverse type="radio" id="reverseOption2" value="option2" label="Disabled reverse radio" disabled/>
-:::
-```vue
-<CFormCheck reverse type="radio" id="reverseOption1" value="option1" label="Reverse radio"/>
-<CFormCheck reverse type="radio" id="reverseOption2" value="option2" label="Disabled reverse radio" disabled/>
-```
-
-## Without labels
-
-Remember to still provide some form of accessible name for assistive technologies (for instance, using `aria-label`).
-
-::: demo
-<CFormCheck type="radio" name="radioNoLabel" id="radioNoLabel" value="" aria-label="..."/>
-:::
-```vue
-<CFormCheck type="radio" name="radioNoLabel" id="radioNoLabel" value="" aria-label="..."/>
-```
-
-## Toggle buttons
-
-Create button-like radio buttons by using `button` boolean property on the `<CFormCheck>` component. These toggle buttons can further be grouped in a button group if needed.
-
-::: demo
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option1" autocomplete="off" label="Checked" checked/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option2" autocomplete="off" label="Radio"/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option3" autocomplete="off" label="Radio" disabled/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option4" autocomplete="off" label="Radio"/>
-:::
-```vue
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option1" autocomplete="off" label="Checked" checked/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option2" autocomplete="off" label="Radio"/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option3" autocomplete="off" label="Radio" disabled/>
-<CFormCheck :button="{ color: 'secondary' }" type="radio" name="options" id="option4" autocomplete="off" label="Radio"/>
-```
-
-### Outlined styles
-
-Different variants of button, such at the various outlined styles, are supported.
-
-::: demo
-<CFormCheck :button="{ color: 'success', variant: 'outline' }" type="radio" name="options-outlined" id="success-outlined" autocomplete="off" label="Radio" checked/>
-<CFormCheck :button="{ color: 'danger', variant: 'outline' }" type="radio" name="options-outlined" id="danger-outlined" autocomplete="off" label="Radio"/>
-:::
-```vue
-<CFormCheck :button="{ color: 'success', variant: 'outline' }" type="radio" name="options-outlined" id="success-outlined" autocomplete="off" label="Radio" checked/>
-<CFormCheck :button="{ color: 'danger', variant: 'outline' }" type="radio" name="options-outlined" id="danger-outlined" autocomplete="off" label="Radio"/>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-check-variables" />
-
-## API
-
-!!!include(./api/form/CFormCheck.api.md)!!!
-
-<script setup>
-  import { ref } from 'vue'
-  const picked = ref('Four')
-</script>
diff --git a/packages/docs/forms/range.md b/packages/docs/forms/range.md
deleted file mode 100644
index 39b1d0d9..00000000
--- a/packages/docs/forms/range.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-title: Vue Range Component
-name: Range
-description: Vue range component. Use our custom range inputs for consistent cross-browser styling and built-in customization.
-other_frameworks: range
----
-
-## Overview
-
-Create custom `<input type="range">` controls with `<CFormRange>`. The track (the background) and thumb (the value) are both styled to appear the same across browsers. As only Edge Legacy and 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.
-
-::: demo
-<CFormRange id="customRange1" label="Example range" />
-:::
-```vue
-<CFormRange id="customRange1" label="Example range" />
-```
-
-## Disabled
-
-Add the `disabled` boolean attribute on an input to give it a grayed out appearance and remove pointer events.
-
-::: demo
-<CFormRange id="disabledRange" disabled label="Disabled range" />
-:::
-```vue
-<CFormRange id="disabledRange" disabled label="Disabled range" />
-```
-
-## Min and max
-
-Range 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.
-
-::: demo
-<CFormRange label="Example range" :min="0" :max="5" :value="3" id="customRange2"/>
-:::
-```vue
-<CFormRange label="Example range" :min="0" :max="5" :value="3" id="customRange2"/>
-```
-
-## Steps
-
-By 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"`.
-
-::: demo
-<CFormRange label="Example range" :min="0" :max="5" :step="0.5" :value="3" id="customRange3"/> 
-:::
-```vue
-<CFormRange label="Example range" :min="0" :max="5" :step="0.5" :value="3" id="customRange3"/> 
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-range-variables" />
-
-## API
-
-!!!include(./api/form/CFormRange.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/select.md b/packages/docs/forms/select.md
deleted file mode 100644
index 9e666cbf..00000000
--- a/packages/docs/forms/select.md
+++ /dev/null
@@ -1,139 +0,0 @@
----
-title: Vue Select Component
-name: Select
-description: Vue select component. Customize the native `<select>`s with custom CSS that changes the element's initial appearance.
-other_frameworks: select
----
-
-## Default
-
-::: demo
-<CFormSelect
-aria-label="Default select example"
-:options="[
-'Open this select menu',
-{ label: 'One', value: '1' },
-{ label: 'Two', value: '2' },
-{ label: 'Three', value: '3', disabled: true }]"></CFormSelect>
-:::
-```vue
-<CFormSelect
-  aria-label="Default select example"
-  :options="[
-    'Open this select menu',
-    { label: 'One', value: '1' },
-    { label: 'Two', value: '2' },
-    { label: 'Three', value: '3', disabled: true }
-  ]">
-</CFormSelect>
-
-// You can also add options manually
-<CFormSelect aria-label="Default select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3" disabled>Three</option>
-</CFormSelect>
-```
-
-## Sizing
-
-You may also choose from small and large custom selects to match our similarly sized text inputs.
-
-::: demo
-<CFormSelect size="lg" class="mb-3" aria-label="Large select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-<CFormSelect size="sm" class="mb-3" aria-label="Small select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-:::
-```vue
-<CFormSelect size="lg" class="mb-3" aria-label="Large select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-<CFormSelect size="sm" class="mb-3" aria-label="Small select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-```
-
-The `multiple` attribute is also supported:
-
-::: demo
-<CFormSelect size="lg" multiple aria-label="Multiple select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-:::
-```vue
-<CFormSelect size="lg" multiple aria-label="Multiple select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-```
-
-As is the `html-size` property:
-
-::: demo
-<CFormSelect :html-size="3" multiple aria-label="size 3 select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-:::
-```vue
-<CFormSelect :html-size="3" multiple aria-label="size 3 select example">
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-```
-
-## Disabled
-
-Add the `disabled` boolean attribute on a select to give it a grayed out appearance and remove pointer events.
-
-::: demo
-<CFormSelect aria-label="Disabled select example" disabled>
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-:::
-```vue
-<CFormSelect aria-label="Disabled select example" disabled>
-  <option>Open this select menu</option>
-  <option value="1">One</option>
-  <option value="2">Two</option>
-  <option value="3">Three</option>
-</CFormSelect>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-select-variables" />
-
-## API
-
-!!!include(./api/form/CFormSelect.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/switch.md b/packages/docs/forms/switch.md
deleted file mode 100644
index 657ceef2..00000000
--- a/packages/docs/forms/switch.md
+++ /dev/null
@@ -1,65 +0,0 @@
----
-title: Vue Switch Component
-name: Switch
-description: Create consistent cross-browser and cross-device switch component.
-other_frameworks: switch
----
-
-## About
-
-Vue Switch Components are a type of UI component that allows users to toggle between two states, usually represented as "on" or "off", "enabled" or "disabled", or "checked" or "unchecked".
-
-When a user interacts with the component by clicking or tapping on it, the switch toggles its state, triggering an action or changing the appearance of the component. This type of component is often used in forms, settings panels, and other places where users need to turn something on or off or choose between two options.
-
-## Example
-
-::: demo
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch label="Checked switch checkbox input" id="formSwitchCheckChecked" checked/>
-<CFormSwitch label="Disabled switch checkbox input" id="formSwitchCheckDisabled" disabled/>
-<CFormSwitch label="Disabled checked switch checkbox input" id="formSwitchCheckCheckedDisabled" checked disabled/>
-:::
-```vue
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch label="Checked switch checkbox input" id="formSwitchCheckChecked" checked/>
-<CFormSwitch label="Disabled switch checkbox input" id="formSwitchCheckDisabled" disabled/>
-<CFormSwitch label="Disabled checked switch checkbox input" id="formSwitchCheckCheckedDisabled" checked disabled/>
-```
-
-## Sizing
-
-Larger or smaller react switches? Add `size="lg"` or `size="xl"` for additional sizes.
-
-::: demo
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch size="lg" label="Large switch checkbox input" id="formSwitchCheckDefaultLg"/>
-<CFormSwitch size="xl" label="Extra large switch checkbox input" id="formSwitchCheckDefaultXL"/>
-:::
-```vue
-<CFormSwitch label="Default switch checkbox input" id="formSwitchCheckDefault"/>
-<CFormSwitch size="lg" label="Large switch checkbox input" id="formSwitchCheckDefaultLg"/>
-<CFormSwitch size="xl" label="Extra large switch checkbox input" id="formSwitchCheckDefaultXL"/>
-```
-
-## Reverse 
-
-Put your switches on the opposite side by adding `reverse` boolean property.
-
-::: demo
-<CFormSwitch reverse type="radio" id="reverseFormSwitch1" label="Reverse switch"/>
-<CFormSwitch reverse type="radio" id="reverseFormSwitch2" label="Disabled reverse switch" disabled/>
-:::
-```vue
-<CFormSwitch reverse type="radio" id="reverseFormSwitch1" label="Reverse switch"/>
-<CFormSwitch reverse type="radio" id="reverseFormSwitch2" label="Disabled reverse switch" disabled/>
-```
-
-## Customizing
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-switch-variables" />
-
-## API
-
-!!!include(./api/form/CFormSwitch.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/textarea.md b/packages/docs/forms/textarea.md
deleted file mode 100644
index c238c297..00000000
--- a/packages/docs/forms/textarea.md
+++ /dev/null
@@ -1,106 +0,0 @@
----
-title: Vue Form Text Component
-name: Form control
-description: Vue textarea components. Give textual form `<textarea>`s an upgrade with custom styles, sizing, focus states, validation, and more.
-other_frameworks: textarea
----
-
-## Example
-
-::: demo
-<CFormTextarea
-  id="exampleFormControlTextarea1"
-  label="Example textarea"
-  rows="3"
-  text="Must be 8-20 words long."></CFormTextarea>
-:::
-```vue
-<CFormTextarea
-  id="exampleFormControlTextarea1"
-  label="Example textarea"
-  rows="3"
-  text="Must be 8-20 words long."
-></CFormTextarea>
-</CForm>
-```
-
-If you need to add custom classs to form's components, or need to add some custom elements you can add each form component separately. Please check the example below.
-
-```vue
-<CFormLabel for="exampleFormControlTextarea1">Example textarea</CFormLabel>
-<CFormTextarea id="exampleFormControlTextarea1" rows="3"></CFormTextarea>
-<CFormText as="span" id="passwordHelpInline">Must be 8-20 words long.</CFormText>
-```
-
-You can also use slots.
-
-```vue
-<CFormTextarea id="exampleFormControlTextarea1" rows="3">
-  <template #label>Example textarea</template>
-  <template #text>Must be 8-20 word long.</template>
-</CFormTextarea>
-```
-
-## Disabled
-
-Add the `disabled` boolean attribute on an input to give it a grayed out appearance and remove pointer events.
-
-::: demo
-<CFormTextarea
-  class="mb-3"
-  placeholder="Disabled textarea"
-  aria-label="Disabled textarea example"
-  disabled></CFormTextarea>
-:::
-```vue
-<CFormTextarea
-  class="mb-3"
-  placeholder="Disabled textarea"
-  aria-label="Disabled textarea example"
-  disabled>
-</CFormTextarea>
-```
-
-## Readonly
-
-Add the `readonly` boolean attribute on an textarea to prevent modification of the textarea's value. Read-only textareas appear lighter (just like disabled textareas), but retain the standard cursor.
-
-::: demo
-<CFormTextarea
-  placeholder="Readonly textarea"
-  aria-label="Readonly textarea example"
-  disabled
-  readonly></CFormTextarea>
-:::
-```vue
-<CFormTextarea
-  placeholder="Readonly textarea"
-  aria-label="Readonly textarea example"
-  disabled
-  readonly
-></CFormTextarea>
-```
-
-## Customizing
-
-### SASS variables
-
-`$input-*` are shared across most of our form controls (and not buttons).
-
-<ScssDocs file="_variables.scss" capture="form-input-variables" />
-
-`$form-label-*` and `$form-text-*` are for our `<CFormLabel />`s and `<CFormText />` component.
-
-<ScssDocs file="_variables.scss" capture="form-label-variables" />
-
-<ScssDocs file="_variables.scss" capture="form-text-variables" />
-
-## API
-
-!!!include(./api/form/CFormTextarea.api.md)!!!
-
-!!!include(./api/form/CFormFeedback.api.md)!!!
-
-!!!include(./api/form/CFormLabel.api.md)!!!
-
-!!!include(./api/form/CFormText.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/forms/validation.md b/packages/docs/forms/validation.md
deleted file mode 100644
index 3dff05d3..00000000
--- a/packages/docs/forms/validation.md
+++ /dev/null
@@ -1,850 +0,0 @@
----
-title: Vue Form Validation
-name: Validation
-description: Provide valuable, actionable feedback to your users with HTML5 form validation, via browser default behaviors or custom styles and JavaScript.
----
-
-## Example
-
-For custom CoreUI form validation messages, you'll need to add the `novalidate` boolean property to your `<CForm>`. 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.
-
-Custom feedback styles apply custom colors, borders, focus styles, and background icons to better communicate feedback.
-
-::: demo
-<CForm
-  class="row g-3 needs-validation"
-  novalidate
-  :validated="validatedCustom01"
-  @submit="handleSubmitCustom01"
->
-  <CCol md="4">
-    <CFormInput
-      feedbackValid="Looks good!"
-      id="validationCustom01"
-      label="First name"
-      required
-      value="Mark"
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormInput 
-      feedbackValid="Looks good!"
-      id="validationCustom02" 
-      label="Email" value="Otto" 
-      required
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="validationCustomUsername">Username</CFormLabel>
-    <CInputGroup class="has-validation">
-      <CInputGroupText id="inputGroupPrepend">@</CInputGroupText>
-      <CFormInput 
-        id="validationCustomUsername"
-        aria-describedby="inputGroupPrepend" 
-        feedbackInvalid="Please choose a username."
-        required
-      />
-    </CInputGroup>
-  </CCol>
-  <CCol md="6">
-    <CFormInput 
-      feedbackInvalid="Please provide a valid city."
-      id="validationCustom03"
-      label="City"
-      required
-    />
-  </CCol>
-  <CCol md="3">
-    <CFormSelect
-      aria-describedby="validationCustom04Feedback"
-      feedbackInvalid="Please select a valid state."
-      id="validationCustom04"
-      label="State"
-      required
-    >
-      <option selected="" disabled="" value="">
-        Choose...
-      </option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="3">
-    <CFormInput 
-      feedbackInvalid="Please provide a valid zip."
-      id="validationCustom05"
-      label="Zip"
-      required
-    />
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck
-      feedbackInvalid="You must agree before submitting."
-      id="invalidCheck"
-      label="Agree to terms and conditions"
-      required
-      type="checkbox"
-    />
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit form</CButton>
-  </CCol>
-</CForm>
-:::
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const validatedCustom01 = ref()
-  const handleSubmitCustom01 = (event) => {
-    const form = event.currentTarget
-    if (form.checkValidity() === false) {
-      event.preventDefault()
-      event.stopPropagation()
-    }
-    validatedCustom01.value = true
-  }
-</script>
-<template>
-  <CForm 
-    class="row g-3 needs-validation" 
-    novalidate 
-    :validated="validatedCustom01" 
-    @submit="handleSubmitCustom01"
-  >
-    <CCol md="4">
-      <CFormInput
-        feedbackValid="Looks good!"
-        id="validationCustom01"
-        label="First name"
-        required
-        value="Mark"
-      />
-    </CCol>
-    <CCol md="4">
-      <CFormInput 
-        feedbackValid="Looks good!"
-        id="validationCustom02" 
-        label="Email" value="Otto" 
-        required
-      />
-    </CCol>
-    <CCol md="4">
-      <CFormLabel for="validationCustomUsername">Username</CFormLabel>
-      <CInputGroup class="has-validation">
-        <CInputGroupText id="inputGroupPrepend">@</CInputGroupText>
-        <CFormInput 
-          id="validationCustomUsername"
-          aria-describedby="inputGroupPrepend" 
-          feedbackInvalid="Please choose a username."
-          required
-        />
-      </CInputGroup>
-    </CCol>
-    <CCol md="6">
-      <CFormInput 
-        feedbackInvalid="Please provide a valid city."
-        id="validationCustom03"
-        label="City"
-        required
-      />
-    </CCol>
-    <CCol md="3">
-      <CFormSelect
-        aria-describedby="validationCustom04Feedback"
-        feedbackInvalid="Please select a valid state."
-        id="validationCustom04"
-        label="State"
-        required
-      >
-        <option selected="" disabled="" value="">
-          Choose...
-        </option>
-        <option>...</option>
-      </CFormSelect>
-    </CCol>
-    <CCol md="3">
-      <CFormInput 
-        feedbackInvalid="Please provide a valid zip."
-        id="validationCustom05"
-        label="Zip"
-        required
-      />
-    </CCol>
-    <CCol xs="12">
-      <CFormCheck
-        feedbackInvalid="You must agree before submitting."
-        id="invalidCheck"
-        label="Agree to terms and conditions"
-        required
-        type="checkbox"
-      />
-    </CCol>
-    <CCol xs="12">
-      <CButton color="primary" type="submit">Submit form</CButton>
-    </CCol>
-  </CForm>
-</template>
-```
-
-## Browser defaults
-
-Not 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.
-
-While these feedback styles cannot be styled with CSS, you can still customize the feedback text through JavaScript.
-
-::: demo
-<CForm class="row g-3">
-  <CCol md="4">
-    <CFormInput
-      feedbackValid="Looks good!"
-      id="validationDefault01"
-      label="First name"
-      required
-      value="Mark"
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormInput 
-      feedbackValid="Looks good!"
-      id="validationDefault02" 
-      label="Email" value="Otto" 
-      required
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="validationDefaultUsername">Username</CFormLabel>
-    <CInputGroup class="has-validation">
-      <CInputGroupText id="inputGroupPrepend">@</CInputGroupText>
-      <CFormInput 
-        id="validationDefaultUsername"
-        aria-describedby="inputGroupPrepend" 
-        feedbackInvalid="Please choose a username."
-        required
-      />
-    </CInputGroup>
-  </CCol>
-  <CCol md="6">
-    <CFormInput 
-      feedbackInvalid="Please provide a valid city."
-      id="validationDefault03"
-      label="City"
-      required
-    />
-  </CCol>
-  <CCol md="3">
-    <CFormSelect
-      aria-describedby="validationDefault04Feedback"
-      feedbackInvalid="Please select a valid state."
-      id="validationDefault04"
-      label="State"
-      required
-    >
-      <option selected="" disabled="" value="">Choose...</option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="3">
-    <CFormInput 
-      feedbackInvalid="Please provide a valid zip."
-      id="validationDefault05"
-      label="Zip"
-      required
-    />
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck
-      feedbackInvalid="You must agree before submitting."
-      id="invalidCheck"
-      label="Agree to terms and conditions"
-      required
-      type="checkbox"
-    />
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit form</CButton>
-  </CCol>
-</CForm>
-:::
-
-```vue
-<CForm class="row g-3">
-  <CCol md="4">
-    <CFormInput
-      feedbackValid="Looks good!"
-      id="validationDefault01"
-      label="First name"
-      required
-      value="Mark"
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormInput 
-      feedbackValid="Looks good!"
-      id="validationDefault02" 
-      label="Email" value="Otto" 
-      required
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="validationDefaultUsername">Username</CFormLabel>
-    <CInputGroup class="has-validation">
-      <CInputGroupText id="inputGroupPrepend">@</CInputGroupText>
-      <CFormInput 
-        id="validationDefaultUsername"
-        aria-describedby="inputGroupPrepend" 
-        feedbackInvalid="Please choose a username."
-        required
-      />
-    </CInputGroup>
-  </CCol>
-  <CCol md="6">
-    <CFormInput 
-      feedbackInvalid="Please provide a valid city."
-      id="validationDefault03"
-      label="City"
-      required
-    />
-  </CCol>
-  <CCol md="3">
-    <CFormSelect
-      aria-describedby="validationDefault04Feedback"
-      feedbackInvalid="Please select a valid state."
-      id="validationDefault04"
-      label="State"
-      required
-    >
-      <option selected="" disabled="" value="">
-        Choose...
-      </option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="3">
-    <CFormInput 
-      feedbackInvalid="Please provide a valid zip."
-      id="validationDefault05"
-      label="Zip"
-      required
-    />
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck
-      feedbackInvalid="You must agree before submitting."
-      id="invalidCheck"
-      label="Agree to terms and conditions"
-      required
-      type="checkbox"
-    />
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit form</CButton>
-  </CCol>
-</CForm>
-```
-
-## Custom validation
-
-In case you require custom or server-side validation, you can indicate invalid and valid form fields with `invalid` and `valid` boolean properties.
-
-For 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).
-
-::: demo
-<CForm class="row g-3 needs-validation">
-  <CCol md="4">
-    <CFormInput
-      feedback="Looks good!"
-      id="validationServer01"
-      label="Email"
-      required
-      valid
-      value="name@surname.com"
-      />
-  </CCol>
-  <CCol md="4">
-    <CFormInput
-      feedback="Looks good!"
-      id="validationServer02"
-      label="Repeat email"
-      required
-      valid
-      value="name@surname.com"
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="validationServerUsername">Username</CFormLabel>
-    <CInputGroup class="has-validation">
-      <CInputGroupText id="inputGroupPrepend03">@</CInputGroupText>
-        <CFormInput
-          aria-describedby="inputGroupPrepend03"
-          feedback="Please choose a username."
-          id="validationServerUsername"
-          invalid
-          required
-        />
-    </CInputGroup>
-  </CCol>
-  <CCol md="6">
-    <CFormInput
-      feedback="Please provide a valid city."
-      id="validationServer03"
-      invalid
-      label="City"
-      required
-    />
-  </CCol>
-  <CCol md="3">
-    <CFormSelect
-      feedback="Please provide a valid city."
-      id="validationServer04"
-      invalid
-      label="State"
-    >
-      <option disabled>Choose...</option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="3">
-    <CFormInput
-      feedback="Please provide a valid zip."
-      id="validationServer05"
-      invalid
-      label="zip"
-      required
-    />
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck
-      feedbackInvalid="You must agree before submitting."
-      id="invalidCheck"
-      invalid
-      label="Agree to terms and conditions"
-      required
-      type="checkbox"
-    />
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit form</CButton>
-  </CCol>
-</CForm>
-:::
-
-```vue
-<CForm class="row g-3 needs-validation">
-  <CCol md="4">
-    <CFormInput
-      feedback="Looks good!"
-      id="validationServer01"
-      label="Email"
-      required
-      valid
-      value="name@surname.com"
-      />
-  </CCol>
-  <CCol md="4">
-    <CFormInput
-      feedback="Looks good!"
-      id="validationServer02"
-      label="Repeat email"
-      required
-      valid
-      value="name@surname.com"
-    />
-  </CCol>
-  <CCol md="4">
-    <CFormLabel for="validationServerUsername">Username</CFormLabel>
-    <CInputGroup class="has-validation">
-      <CInputGroupText id="inputGroupPrepend03">@</CInputGroupText>
-        <CFormInput
-          aria-describedby="inputGroupPrepend03"
-          feedback="Please choose a username."
-          id="validationServerUsername"
-          invalid
-          required
-        />
-    </CInputGroup>
-  </CCol>
-  <CCol md="6">
-    <CFormInput
-      feedback="Please provide a valid city."
-      id="validationServer03"
-      invalid
-      label="City"
-      required
-    />
-  </CCol>
-  <CCol md="3">
-    <CFormSelect
-      feedback="Please provide a valid city."
-      id="validationServer04"
-      invalid
-      label="State"
-    >
-      <option disabled>Choose...</option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="3">
-    <CFormInput
-      feedback="Please provide a valid zip."
-      id="validationServer05"
-      invalid
-      label="zip"
-      required
-    />
-  </CCol>
-  <CCol xs="12">
-    <CFormCheck
-      feedbackInvalid="You must agree before submitting."
-      id="invalidCheck"
-      invalid
-      label="Agree to terms and conditions"
-      required
-      type="checkbox"
-    />
-  </CCol>
-  <CCol xs="12">
-    <CButton color="primary" type="submit">Submit form</CButton>
-  </CCol>
-</CForm>
-```
-
-## Supported elements
-
-Validation styles are available for the following form controls and components:
-
-- `<CFormCheck>`s
-- `<CFormInput>`s
-- `<CFormSelect>`s
-- `<CFormTextarea>`s
-
-::: demo
-<CForm :validated="true">
-  <div class="mb-3">
-    <CFormTextarea
-      feedbackInvalid="Please enter a message in the textarea."
-      id="validationTextarea"
-      label="Textarea"
-      placeholder="Required example textarea"
-      required
-    />
-  </div>
-  <CFormCheck
-    class="mb-3"
-    id="validationFormCheck1"
-    label="Check this checkbox"
-    feedbackInvalid="Example invalid feedback text"
-    required
-  />
-  <CFormCheck
-    type="radio"
-    name="radio-stacked"
-    id="validationFormCheck2"
-    label="Check this checkbox"
-    required
-  />
-  <CFormCheck
-    class="mb-3"
-    type="radio"
-    name="radio-stacked"
-    id="validationFormCheck3"
-    label="Or toggle this other radio"
-    feedbackInvalid="More example invalid feedback text"
-    required
-  />
-  <div class="mb-3">
-    <CFormSelect
-      feedbackInvalid="Example invalid select feedback"
-      aria-label="select example"
-      required
-    >
-      <option selected="" value="">
-        Open this select menu
-      </option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </div>
-  <div class="mb-3">
-    <CFormInput
-      type="file"
-      id="validationTextarea"
-      feedbackInvalid="Example invalid form file feedback"
-      aria-label="file example"
-      required
-    />
-  </div>
-  <div class="mb-3">
-    <CButton type="submit" color="primary" disabled>Submit form</CButton>
-  </div>
-</CForm>
-:::
-```vue
-<CForm :validated="true">
-  <div class="mb-3">
-    <CFormTextarea
-      feedbackInvalid="Please enter a message in the textarea."
-      id="validationTextarea"
-      label="Textarea"
-      placeholder="Required example textarea"
-      required
-    />
-  </div>
-  <CFormCheck
-    class="mb-3"
-    id="validationFormCheck1"
-    label="Check this checkbox"
-    feedbackInvalid="Example invalid feedback text"
-    required
-  />
-  <CFormCheck
-    type="radio"
-    name="radio-stacked"
-    id="validationFormCheck2"
-    label="Check this checkbox"
-    required
-  />
-  <CFormCheck
-    class="mb-3"
-    type="radio"
-    name="radio-stacked"
-    id="validationFormCheck3"
-    label="Or toggle this other radio"
-    feedbackInvalid="More example invalid feedback text"
-    required
-  />
-  <div class="mb-3">
-    <CFormSelect
-      feedbackInvalid="Example invalid select feedback"
-      aria-label="select example"
-      required
-    >
-      <option selected="" value="">
-        Open this select menu
-      </option>
-      <option value="1">One</option>
-      <option value="2">Two</option>
-      <option value="3">Three</option>
-    </CFormSelect>
-  </div>
-  <div class="mb-3">
-    <CFormInput
-      type="file"
-      id="validationTextarea"
-      feedbackInvalid="Example invalid form file feedback"
-      aria-label="file example"
-      required
-    />
-  </div>
-  <div class="mb-3">
-    <CButton type="submit" color="primary" disabled>Submit form</CButton>
-  </div>
-</CForm>
-```
-
-## Tooltips
-
-If your form layout allows it, you can swap the text for the tooltip 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.
-
-::: demo
-<CForm class="row g-3 needs-validation" novalidate :validated="validatedTooltip01" @submit="handleSubmitTooltip01">
-  <CCol md="4" class="position-relative">
-    <CFormInput
-      feedbackValid="Looks good!"
-      id="validationTooltip01"
-      label="First name"
-      required
-      tooltipFeedback
-      value="Mark"
-    />
-  </CCol>
-  <CCol md="4" class="position-relative">
-    <CFormInput
-      feedbackValid="Looks good!"
-      id="validationTooltip02"
-      label="Last name"
-      required
-      tooltipFeedback
-      value="Otto"
-    />
-  </CCol>
-  <CCol md="4" class="position-relative">
-    <CFormLabel for="validationTooltipUsername">Username</CFormLabel>
-    <CInputGroup class="has-validation">
-      <CInputGroupText id="inputGroupPrepend">@</CInputGroupText>
-      <CFormInput
-        aria-describedby="inputGroupPrependFeedback"
-        feedbackInvalid="Please choose a username."
-        id="validationTooltipUsername"
-        required
-        tooltipFeedback
-      />
-    </CInputGroup>
-  </CCol>
-  <CCol md="6" class="position-relative">
-    <CFormInput
-      aria-describedby="validationTooltip03Feedback"
-      feedbackInvalid="Please provide a valid city."
-      id="validationTooltip03"
-      label="City"
-      required
-      tooltipFeedback
-    />
-  </CCol>
-  <CCol md="3" class="position-relative">
-    <CFormSelect
-      aria-describedby="validationTooltip04Feedback"
-      feedbackInvalid="Please select a valid state."
-      id="validationTooltip04"
-      label="State"
-      required
-      tooltipFeedback
-    >
-      <option selected="" disabled="" value="">Choose...</option>
-      <option>...</option>
-    </CFormSelect>
-  </CCol>
-  <CCol md="3" class="position-relative">
-    <CFormInput
-      aria-describedby="validationTooltip05Feedback"
-      feedbackInvalid="Please provide a valid zip."
-      id="validationTooltip05"
-      label="Zip"
-      required
-      tooltipFeedback
-    />
-  </CCol>
-  <CCol xs="12" class="position-relative">
-    <CButton color="primary" type="submit">Submit form</CButton>
-  </CCol>
-</CForm>
-:::
-
-```vue
-<script setup>
-  import { ref } from 'vue'
-  const validatedTooltip01 = ref()
-  const handleSubmitTooltip01 = (event) => {
-    const form = event.currentTarget
-    if (form.checkValidity() === false) {
-      event.preventDefault()
-      event.stopPropagation()
-    }
-    
-    validatedTooltip01.value = true
-  }
-</script>
-<template>
-  <CForm
-    class="row g-3 needs-validation"
-    novalidate
-    :validated="validatedTooltip01"
-    @submit="handleSubmitTooltip01"
-  >
-    <CCol md="4" class="position-relative">
-      <CFormLabel for="validationTooltip01">Email</CFormLabel>
-      <CFormInput id="validationTooltip01" value="Mark" required />
-      <CFormFeedback tooltip valid> Looks good! </CFormFeedback>
-    </CCol>
-    <CCol md="4" class="position-relative">
-      <CFormLabel for="validationTooltip02">Email</CFormLabel>
-      <CFormInput id="validationTooltip02" value="Otto" required />
-      <CFormFeedback tooltip valid> Looks good! </CFormFeedback>
-    </CCol>
-    <CCol md="4" class="position-relative">
-      <CFormLabel for="validationTooltipUsername">Username</CFormLabel>
-      <CInputGroup class="has-validation">
-        <CInputGroupText id="inputGroupPrepend">@</CInputGroupText>
-        <CFormInput
-          id="validationTooltipUsername"
-          value=""
-          aria-describedby="inputGroupPrepend"
-          required
-        />
-        <CFormFeedback tooltip invalid> Please choose a username. </CFormFeedback>
-      </CInputGroup>
-    </CCol>
-    <CCol md="6" class="position-relative">
-      <CFormLabel for="validationTooltip03">City</CFormLabel>
-      <CFormInput id="validationTooltip03" required />
-      <CFormFeedback tooltip invalid> Please provide a valid city. </CFormFeedback>
-    </CCol>
-    <CCol md="3" class="position-relative">
-      <CFormLabel for="validationTooltip04">City</CFormLabel>
-      <CFormSelect id="validationTooltip04" required>
-        <option disabled value="">Choose...</option>
-        <option>...</option>
-      </CFormSelect>
-      <CFormFeedback tooltip invalid> Please provide a valid city. </CFormFeedback>
-    </CCol>
-    <CCol md="3" class="position-relative">
-      <CFormLabel for="validationTooltip05">City</CFormLabel>
-      <CFormInput id="validationTooltip05" required />
-      <CFormFeedback tooltip invalid> Please provide a valid zip. </CFormFeedback>
-    </CCol>
-    <CCol xs="12" class="position-relative">
-      <CButton color="primary" type="submit">Submit form</CButton>
-    </CCol>
-  </CForm>
-</template>
-```
-
-## Customizing
-
-### CSS variables
-
-CoreUI for Vue components 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.
-
-<ScssDocs file="_root.scss" capture="root-form-validation-variables"/>
-
-These variables are also color mode adaptive, meaning they change color while in dark mode.
-
-### SASS variables
-
-<ScssDocs file="_variables.scss" capture="form-feedback-variables" />
-
-<ScssDocs file="_variables.scss" capture="form-validation-colors" />
-
-<ScssDocs file="_variables-dark.scss" capture="form-validation-colors-dark" />
-
-### SASS mixins
-
-Two mixins are combined, through our loop, to generate our form validation feedback styles.
-
-<ScssDocs file="mixins/_forms.scss" capture="form-validation-mixins" />
-
-### SASS maps
-
-This is the validation Sass map from `_variables.scss`. Override or extend this to generate different or additional states.
-
-<ScssDocs file="_variables.scss" capture="form-validation-states" />
-
-Maps of `$form-validation-states` can contain three optional parameters to override tooltips and focus styles.
-
-### SASS loops
-
-Used 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.
-
-<ScssDocs file="forms/_validation.scss" capture="form-validation-states-loop" />
-
-<script setup>
-  import { ref } from 'vue'
-  const validatedCustom01 = ref()
-  const validatedTooltip01 = ref()
-  const handleSubmitCustom01 = (event) => {
-    const form = event.currentTarget
-    if (form.checkValidity() === false) {
-      event.preventDefault()
-      event.stopPropagation()
-    }
-    validatedCustom01.value = true
-  }
-  const handleSubmitTooltip01 = (event) => {
-    const form = event.currentTarget
-    if (form.checkValidity() === false) {
-      event.preventDefault()
-      event.stopPropagation()
-    }
-    
-    validatedTooltip01.value = true
-  }
-</script>
diff --git a/packages/docs/getting-started/accessibility.md b/packages/docs/getting-started/accessibility.md
deleted file mode 100644
index b1998024..00000000
--- a/packages/docs/getting-started/accessibility.md
+++ /dev/null
@@ -1,59 +0,0 @@
----
-title: Accessibility
-name: Accessibility
-description: A brief overview of CoreUI for Vue features and limitations for the creation of accessible content.
----
-
-CoreUI for Vue 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.
-
-## Overview and limitations
-
-The overall accessibility of any project built with CoreUI for Vue 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 CoreUI for Vue that fulfill [<abbr title="Web Content Accessibility Guidelines">WCAG</abbr> 2.1](https://www.w3.org/TR/WCAG21/) (A/AA/AAA), [Section 508](https://www.section508.gov/), and similar accessibility standards and requirements.
-
-### Structural markup
-
-CoreUI for Vue 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 CoreUI for Vue itself and illustrate appropriate semantic markup, including ways in which potential accessibility concerns can be addressed.
-
-### Interactive components
-
-CoreUI for Vue 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).
-
-Because CoreUI for Vue 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.
-
-### Color contrast
-
-Some combinations of colors that currently make up CoreUI for Vue 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.1 text color contrast ratio of 4.5:1](https://www.w3.org/TR/WCAG21/#contrast-minimum) and the [WCAG 2.1 non-text color contrast ratio of 3:1](https://www.w3.org/TR/WCAG21/#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.
-
-### Visually hidden content
-
-Content 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.
-
-```html
-<p class="text-danger">
-  <span class="visually-hidden">Danger: </span>
-  This action is not reversible
-</p>
-```
-
-For 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, CoreUI's `.visually-hidden-focusable` is a standalone class, and must not be used in combination with the `.visually-hidden` class.**
-
-```html
-<a class="visually-hidden-focusable" href="#content">Skip to main content</a>
-```
-
-### Reduced motion
-
-CoreUI for Vue includes support for the [`prefers-reduced-motion` media feature](https://drafts.csswg.org/mediaqueries-5/#prefers-reduced-motion). In browsers/environments that allow the user to specify their preference for reduced motion, most CSS transition effects in CoreUI for Vue (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.
-
-On 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`), CoreUI for Vue enables smooth scrolling using the `scroll-behavior` property.
-
-## Additional resources
-
-- [Web Content Accessibility Guidelines (WCAG) 2.1](https://www.w3.org/TR/WCAG21/)
-- [The A11Y Project](https://www.a11yproject.com/)
-- [MDN accessibility documentation](https://developer.mozilla.org/en-US/docs/Web/Accessibility)
-- [Tenon.io Accessibility Checker](https://tenon.io/)
-- [Color Contrast Analyser (CCA)](https://developer.paciellogroup.com/resources/contrastanalyser/)
-- ["HTML Codesniffer" bookmarklet for identifying accessibility issues](https://github.com/squizlabs/HTML_CodeSniffer)
-- [Microsoft Accessibility Insights](https://accessibilityinsights.io/)
-- [Deque Axe testing tools](https://www.deque.com/axe/)
diff --git a/packages/docs/getting-started/introduction.md b/packages/docs/getting-started/introduction.md
deleted file mode 100644
index 405a039e..00000000
--- a/packages/docs/getting-started/introduction.md
+++ /dev/null
@@ -1,122 +0,0 @@
----
-title: Introduction
-name: Introduction
-description: CoreUI for Vue.js is UI Component library written in TypeScript, and ready for your next Vue.js project. Learn how to include CoreUI for Vue.js in your project.
-menu: Getting started
----
-
-## Installation
-
-### Npm
-
-<CTabs :activeItemKey="1">
-  <CTabList class="docs-code-tabs" variant="underline-border">
-    <CTab :itemKey="1">CoreUI</CTab>
-    <CTab :itemKey="2">CoreUI PRO</CTab>
-  </CTabList>
-  <CTabContent class="docs-code-tab-content">
-    <CTabPanel :itemKey="1">
-    
-```bash
-npm install @coreui/vue @coreui/coreui
-```
-</CTabPanel>
-    <CTabPanel :itemKey="2">
-
-```bash
-npm install @coreui/vue-pro @coreui/coreui-pro
-```
-</CTabPanel>
-  </CTabContent>
-</CTabs>
-
-
-### Yarn
-
-<CTabs :activeItemKey="1">
-  <CTabList class="docs-code-tabs" variant="underline-border">
-    <CTab :itemKey="1">CoreUI</CTab>
-    <CTab :itemKey="2">CoreUI PRO</CTab>
-  </CTabList>
-  <CTabContent class="docs-code-tab-content">
-    <CTabPanel :itemKey="1">
-    
-```bash
-yarn add @coreui/vue @coreui/coreui
-```
-</CTabPanel>
-    <CTabPanel :itemKey="2">
-
-```bash
-yarn add @coreui/vue-pro @coreui/coreui-pro
-```
-</CTabPanel>
-  </CTabContent>
-</CTabs>
-
-## Using components
-
-<CTabs :activeItemKey="1">
-  <CTabList class="docs-code-tabs" variant="underline-border">
-    <CTab :itemKey="1">CoreUI</CTab>
-    <CTab :itemKey="2">CoreUI PRO</CTab>
-  </CTabList>
-  <CTabContent class="docs-code-tab-content">
-    <CTabPanel :itemKey="1">
-    
-```js
-import { CAlert } from '@coreui/vue';
-```
-</CTabPanel>
-    <CTabPanel :itemKey="2">
-
-```js
-import { CAlert } from '@coreui/vue-pro';
-```
-</CTabPanel>
-  </CTabContent>
-</CTabs>
-
-
-## Stylesheets
-
-Vue components are styled using the `@coreui/coreui` or `@coreui/coreui-pro` CSS library, but you can also use them with the bootstrap CSS library. That is possible because the `@coreui/coreui` library is compatible with Bootstrap, it just extends its functionalities. The only exceptions are custom CoreUI and CoreUI PRO components, which don't exist in the Bootstrap ecosystem.
-
-### CoreUI CSS files
-
-###### Basic usage
-
-<CTabs :activeItemKey="1">
-  <CTabList class="docs-code-tabs" variant="underline-border">
-    <CTab :itemKey="1">CoreUI</CTab>
-    <CTab :itemKey="2">CoreUI PRO</CTab>
-  </CTabList>
-  <CTabContent class="docs-code-tab-content">
-    <CTabPanel :itemKey="1">
-    
-```js
-import '@coreui/coreui/dist/css/coreui.min.css'
-```
-</CTabPanel>
-    <CTabPanel :itemKey="2">
-
-```js
-import '@coreui/coreui-pro/dist/css/coreui.min.css'
-```
-</CTabPanel>
-  </CTabContent>
-</CTabs>
-
-### Bootstrap CSS files
-
-###### Installation
-
-```bash
-npm install bootstrap
-```
-
-###### Basic usage
-
-```js
-import 'bootstrap/dist/css/bootstrap.min.css'
-```
diff --git a/packages/docs/layout/breakpoints.md b/packages/docs/layout/breakpoints.md
deleted file mode 100644
index 40612dfb..00000000
--- a/packages/docs/layout/breakpoints.md
+++ /dev/null
@@ -1,211 +0,0 @@
----
-title: Breakpoints
-name: Breakpoints
-description: Breakpoints are the triggers in CoreUI for Vue.js for how your layout responsive changes across device or viewport sizes.
-menu: Layout
----
-
-## Core concepts
-
-- **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.
-
-- **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.
-
-- **Mobile first, responsive design is the goal.** CoreUI'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.
-
-## Available breakpoints
-
-CoreUI for Vue.js 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.
-
-<table class="table">
-  <thead>
-    <tr>
-      <th>Breakpoint</th>
-      <th>Class infix</th>
-      <th>Dimensions</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>X-Small</td>
-      <td><em>None</em></td>
-      <td>&lt;576px</td>
-    </tr>
-    <tr>
-      <td>Small</td>
-      <td><code>sm</code></td>
-      <td>&ge;576px</td>
-    </tr>
-    <tr>
-      <td>Medium</td>
-      <td><code>md</code></td>
-      <td>&ge;768px</td>
-    </tr>
-    <tr>
-      <td>Large</td>
-      <td><code>lg</code></td>
-      <td>&ge;992px</td>
-    </tr>
-    <tr>
-      <td>Extra large</td>
-      <td><code>xl</code></td>
-      <td>&ge;1200px</td>
-    </tr>
-    <tr>
-      <td>Extra extra large</td>
-      <td><code>xxl</code></td>
-      <td>&ge;1400px</td>
-    </tr>
-  </tbody>
-</table>
-
-Each 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.
-
-These breakpoints are customizable via Sass—you'll find them in a Sass map in our `_variables.scss` stylesheet.
-
-```scss
-$grid-breakpoints: (
-  xs: 0,
-  sm: 576px,
-  md: 768px,
-  lg: 992px,
-  xl: 1200px,
-  xxl: 1400px
-);
-```
-
-For more information and examples on how to modify our Sass maps and variables, please refer to [the Sass section of the Grid documentation](https://coreui.io/docs/4.0/layout/grid#sass).
-
-## Media queries
-
-Since CoreUI for Vue.js is developed to be mobile first, we use a handful of [media queries](https://developer.mozilla.org/en-US/docs/Web/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.
-
-### Min-width
-
-CoreUI for Vue.js primarily uses the following media query ranges—or breakpoints—in our source Sass files for our layout, grid system, and components.
-
-```scss
-// Source mixins
-
-// No media query necessary for xs breakpoint as it's effectively `@media (min-width: 0) { ... }`
-@include media-breakpoint-up(sm) { ... }
-@include media-breakpoint-up(md) { ... }
-@include media-breakpoint-up(lg) { ... }
-@include media-breakpoint-up(xl) { ... }
-@include media-breakpoint-up(xxl) { ... }
-
-// Usage
-
-// Example: Hide starting at `min-width: 0`, and then show at the `sm` breakpoint
-.custom-class {
-  display: none;
-}
-@include media-breakpoint-up(sm) {
-  .custom-class {
-    display: block;
-  }
-}
-```
-
-These Sass mixins translate in our compiled CSS using the values declared in our Sass variables. For example:
-
-```scss
-// X-Small devices (portrait phones, less than 576px)
-// No media query for `xs` since this is the default in CoreUI
-
-// Small devices (landscape phones, 576px and up)
-@media (min-width: 576px) { ... }
-
-// Medium devices (tablets, 768px and up)
-@media (min-width: 768px) { ... }
-
-// Large devices (desktops, 992px and up)
-@media (min-width: 992px) { ... }
-
-// X-Large devices (large desktops, 1200px and up)
-@media (min-width: 1200px) { ... }
-
-// XX-Large devices (larger desktops, 1400px and up)
-@media (min-width: 1400px) { ... }
-```
-
-### Max-width
-
-We occasionally use media queries that go in the other direction (the given screen size *or smaller*):
-
-```scss
-// No media query necessary for xs breakpoint as it's effectively `@media (max-width: 0) { ... }`
-@include media-breakpoint-down(sm) { ... }
-@include media-breakpoint-down(md) { ... }
-@include media-breakpoint-down(lg) { ... }
-@include media-breakpoint-down(xl) { ... }
-@include media-breakpoint-down(xxl) { ... }
-
-// Example: Style from medium breakpoint and down
-@include media-breakpoint-down(md) {
-  .custom-class {
-    display: block;
-  }
-}
-```
-
-These mixins take those declared breakpoints, subtract `.02px` from them, and use them as our `max-width` values. For example:
-
-```scss
-// X-Small devices (portrait phones, less than 576px)
-@media (max-width: 575.98px) { ... }
-
-// Small devices (landscape phones, less than 768px)
-@media (max-width: 767.98px) { ... }
-
-// Medium devices (tablets, less than 992px)
-@media (max-width: 991.98px) { ... }
-
-// Large devices (desktops, less than 1200px)
-@media (max-width: 1199.98px) { ... }
-
-// X-Large devices (large desktops, less than 1400px)
-@media (max-width: 1399.98px) { ... }
-
-// XX-Large devices (larger desktops)
-// No media query since the xxl breakpoint has no upper bound on its width
-```
-
-<Callout color="warning">
-  <strong>Why subtract .02px?</strong> Browsers don’t currently support <a href="https://www.w3.org/TR/mediaqueries-4/#range-context">range context queries</a>, so we work around the limitations of <a href="https://www.w3.org/TR/mediaqueries-4/#mq-min-max"><code>min-</code> and <code>max-</code> prefixes</a> and viewports with fractional widths (which can occur under certain conditions on high-dpi devices, for instance) by using values with higher precision.
-</Callout>
-
-### Single breakpoint
-
-There are also media queries and mixins for targeting a single segment of screen sizes using the minimum and maximum breakpoint widths.
-
-```scss
-@include media-breakpoint-only(xs) { ... }
-@include media-breakpoint-only(sm) { ... }
-@include media-breakpoint-only(md) { ... }
-@include media-breakpoint-only(lg) { ... }
-@include media-breakpoint-only(xl) { ... }
-@include media-breakpoint-only(xxl) { ... }
-```
-
-For example the `@include media-breakpoint-only(md) { ... }` will result in :
-
-```scss
-@media (min-width: 768px) and (max-width: 991.98px) { ... }
-```
-
-### Between breakpoints
-
-Similarly, media queries may span multiple breakpoint widths:
-
-```scss
-@include media-breakpoint-between(md, xl) { ... }
-```
-
-Which results in:
-
-```scss
-// Example
-// Apply styles starting from medium devices and up to extra large devices
-@media (min-width: 768px) and (max-width: 1199.98px) { ... }
-```
diff --git a/packages/docs/layout/columns.md b/packages/docs/layout/columns.md
deleted file mode 100644
index 944b8979..00000000
--- a/packages/docs/layout/columns.md
+++ /dev/null
@@ -1,528 +0,0 @@
----
-title: Columns
-name: Columns
-description: Learn how to modify columns with a handful of options for alignment, ordering, and offsetting thanks to our flexbox grid system.
-menu: Layout
-route: "/layout/columns"
----
-
-## How they work
-
-- **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](./../grid#row-columns). You choose how columns grow, shrink, or otherwise change.
-
-- **When building grid layouts, all content goes in columns.** The hierarchy of CoreUI's grid goes from [container](./../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.
-
-- **CoreUI for Vue.js includes predefined components for creating fast, responsive layouts.** With [six breakpoints](./../breakpoints) and a dozen columns at each grid tier, we have dozens of components already built for you to create your desired layouts. This can be disabled via Sass if you wish.
-
-## Alignment
-
-Use flexbox alignment utilities to vertically and horizontally align columns.
-
-### Vertical alignment
-
-::: demo
-<div class="docs-example-row docs-example-row-flex-cols">
-  <CContainer>
-    <CRow class="align-items-start">
-      <CCol>
-        One of three columns
-      </CCol>
-      <CCol>
-        One of three columns
-      </CCol>
-      <CCol>
-        One of three columns
-      </CCol>
-    </CRow>
-    <CRow class="align-items-center">
-      <CCol>
-        One of three columns
-      </CCol>
-      <CCol>
-        One of three columns
-      </CCol>
-      <CCol>
-        One of three columns
-      </CCol>
-    </CRow>
-    <CRow class="align-items-end">
-      <CCol>
-        One of three columns
-      </CCol>
-      <CCol>
-        One of three columns
-      </CCol>
-      <CCol>
-        One of three columns
-      </CCol>
-    </CRow>
-  </CContainer>
-</div> 
-:::
-```vue
-<CContainer>
-  <CRow class="align-items-start">
-    <CCol>
-      One of three columns
-    </CCol>
-    <CCol>
-      One of three columns
-    </CCol>
-    <CCol>
-      One of three columns
-    </CCol>
-  </CRow>
-  <CRow class="align-items-center">
-    <CCol>
-      One of three columns
-    </CCol>
-    <CCol>
-      One of three columns
-    </CCol>
-    <CCol>
-      One of three columns
-    </CCol>
-  </CRow>
-  <CRow class="align-items-end">
-    <CCol>
-      One of three columns
-    </CCol>
-    <CCol>
-      One of three columns
-    </CCol>
-    <CCol>
-      One of three columns
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row docs-example-row-flex-cols">
-  <CContainer>
-    <CRow>
-      <CCol class="align-self-start">
-        One of three columns
-      </CCol>
-      <CCol class="align-self-center">
-        One of three columns
-      </CCol>
-      <CCol class="align-self-end">
-        One of three columns
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol class="align-self-start">
-      One of three columns
-    </CCol>
-    <CCol class="align-self-center">
-      One of three columns
-    </CCol>
-    <CCol class="align-self-end">
-      One of three columns
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-### Horizontal alignment
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow class="justify-content-start">
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-    </CRow>
-    <CRow class="justify-content-center">
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-    </CRow>
-    <CRow class="justify-content-end">
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-    </CRow>
-    <CRow class="justify-content-around">
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-    </CRow>
-    <CRow class="justify-content-between">
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-    </CRow>
-    <CRow class="justify-content-evenly">
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-      <CCol xs="4">
-        One of two columns
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow class="justify-content-start">
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-  </CRow>
-  <CRow class="justify-content-center">
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-  </CRow>
-  <CRow class="justify-content-end">
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-  </CRow>
-  <CRow class="justify-content-around">
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-  </CRow>
-  <CRow class="justify-content-between">
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-  </CRow>
-  <CRow class="justify-content-evenly">
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-    <CCol xs="4">
-      One of two columns
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-### Column wrapping
-
-If more than 12 columns are placed within a single row, each group of extra columns will, as one unit, wrap onto a new line.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol xs="9">.col-9</CCol>
-      <CCol xs="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.</CCol>
-      <CCol xs="6">.col-6<br/>Subsequent columns continue along the new line.</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol xs="9">.col-9</CCol>
-    <CCol xs="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.</CCol>
-    <CCol xs="6">.col-6<br/>Subsequent columns continue along the new line.</CCol>
-  </CRow>
-</CContainer>
-```
-
-### Column breaks
-
-Breaking 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 `<CRow>`s, but not every implementation method can account for this.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-      <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-      <div class="w-100"></div>
-      <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-      <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-    <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-    <div class="w-100"></div>
-    <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-    <CCol xs="6" sm="3">.col-6 .col-sm-3</CCol>
-  </CRow>
-</CContainer>
-```
-
-You may also apply this break at specific breakpoints with our [responsive display utilities](https://coreui.io/docs/utilities/display).
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-      <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-      <div class="w-100 d-none d-md-block"></div>
-      <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-      <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-    <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-    <div class="w-100 d-none d-md-block"></div>
-    <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-    <CCol xs="6" sm="4">.col-6 .col-sm-4</CCol>
-  </CRow>
-</CContainer>
-```
-
-## Reordering
-
-### Order props
-
-Use `xs|sm|md|lg|xl|xxl="{ order: 1-5 }"` props for controlling the **visual order** of your content. These props are responsive, so you can set the `order` by breakpoint (e.g., `xs="{ order: 1}" md="{ order: 2}"`). Includes support for `1` through `5` across all six grid tiers.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol>
-        First in DOM, no order applied
-      </CCol>
-      <CCol xs="{ span: true, order: 5 }">
-        Second in DOM, with a larger order
-      </CCol>
-      <CCol xs="{ span: true, order: 1 }">
-        Third in DOM, with an order of 1
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol>
-      First in DOM, no order applied
-    </CCol>
-    <CCol xs="{ span: true, order: 5 }">
-      Second in DOM, with a larger order
-    </CCol>
-    <CCol xs="{ span: true, order: 1 }">
-      Third in DOM, with an order of 1
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-There are also responsive `xs|sm|md|lg|xl|xxl="{ order: 'first' }"` and `xs|sm|md|lg|xl|xxl="{ order: 'last' }"` props that change the `order` of an element by applying `order: -1` and `order: 6`, respectively. These values can also be intermixed with the numbered `xs|sm|md|lg|xl|xxl="{ order: 1-5 }"` values as needed.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol xs="{ span: true, order: 'last' }">
-        First in DOM, ordered last
-      </CCol>
-      <CCol>
-        Second in DOM, unordered
-      </CCol>
-      <CCol xs="{ span: true, order: 'first' }">
-        Third in DOM, ordered first
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol xs="{ span: true, order: 'last' }">
-      First in DOM, ordered last
-    </CCol>
-    <CCol>
-      Second in DOM, unordered
-    </CCol>
-    <CCol xs="{ span: true, order: 'first' }">
-      Third in DOM, ordered first
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-### Offsetting columns
-
-You can offset grid columns in two ways: our responsive `xs|sm|md|lg|xl|xxl="{ offset: 0-12 }"` grid props and our [margin utilities](https://coreui.io/docs/utilities/spacing). Grid props are sized to match columns while margins are more useful for quick layouts where the width of the offset is variable.
-
-#### Offset prop
-
-Move columns to the right using `md="{ offset: * }"` props. These props increase the left margin of a column by `*` columns. For example, `md="{ offset: 4 }"` moves `.col-md-4` over four columns.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol md="4">.col-md-4</CCol>
-      <CCol md="{ span: 4, offset: 4 }">.col-md-4 .offset-md-4</CCol>
-    </CRow>
-    <CRow>
-      <CCol md="{ span: 3, offset: 3 }">.col-md-3 .offset-md-3</CCol>
-      <CCol md="{ span: 3, offset: 3 }">.col-md-3 .offset-md-3</CCol>
-    </CRow>
-    <CRow>
-      <CCol md="{ span: 6, offset: 3 }">.col-md-6 .offset-md-3</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol md="4">.col-md-4</CCol>
-    <CCol md="{ span: 4, offset: 4 }">.col-md-4 .offset-md-4</CCol>
-  </CRow>
-  <CRow>
-    <CCol md="{ span: 3, offset: 3 }">.col-md-3 .offset-md-3</CCol>
-    <CCol md="{ span: 3, offset: 3 }">.col-md-3 .offset-md-3</CCol>
-  </CRow>
-  <CRow>
-    <CCol md="{ span: 6, offset: 3 }">.col-md-6 .offset-md-3</CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol sm="5" md="6">.col-sm-5 .col-md-6</CCol>
-      <CCol sm="{ span: 5, offset: 2 }" md="{ span: 6, offset: 0 }">.col-sm-5 .offset-sm-2 .col-md-6 .offset-md-0</CCol>
-    </CRow>
-    <CRow>
-      <CCol sm="6" md="5" lg="6">.col-sm-6 .col-md-5 .col-lg-6</CCol>
-      <CCol sm="6" md="{ span: 5, offset: 2 }" lg="{ span: 6, offset: 0 }">.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol sm="5" md="6">.col-sm-5 .col-md-6</CCol>
-    <CCol sm="{ span: 5, offset: 2 }" md="{ span: 6, offset: 0 }">.col-sm-5 .offset-sm-2 .col-md-6 .offset-md-0</CCol>
-  </CRow>
-  <CRow>
-    <CCol sm="6" md="5" lg="6">.col-sm-6 .col-md-5 .col-lg-6</CCol>
-    <CCol sm="6" md="{ span: 5, offset: 2 }" lg="{ span: 6, offset: 0 }">.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0</CCol>
-  </CRow>
-</CContainer>
-```
-
-
-#### Margin utilities
-
-You can use margin utilities like `.me-auto` to force sibling columns away from one another.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol md="4">.col-md-4</CCol>
-      <CCol md="4" class="ms-auto">.col-md-4 .ms-auto</CCol>
-    </CRow>
-    <CRow>
-      <CCol md="3" class="ms-md-auto">.col-md-3 .ms-md-auto</CCol>
-      <CCol md="3" class="ms-md-auto">.col-md-3 .ms-md-auto</CCol>
-    </CRow>
-    <CRow>
-      <CCol xs="auto" class="me-auto">.col-auto .me-auto</CCol>
-      <CCol xs="auto">.col-auto</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol md="4">.col-md-4</CCol>
-    <CCol md="4" class="ms-auto">.col-md-4 .ms-auto</CCol>
-  </CRow>
-  <CRow>
-    <CCol md="3" class="ms-md-auto">.col-md-3 .ms-md-auto</CCol>
-    <CCol md="3" class="ms-md-auto">.col-md-3 .ms-md-auto</CCol>
-  </CRow>
-  <CRow>
-    <CCol xs="auto" class="me-auto">.col-auto .me-auto</CCol>
-    <CCol xs="auto">.col-auto</CCol>
-  </CRow>
-</CContainer>
-```
-
-## Standalone column component
-
-The `<CCol>` component can also be used outside a `<CRow>` to give an element a specific width. Whenever column component are used as non direct children of a row, the paddings are omitted.
-
-::: demo
-<CCol xs="3" class="bg-light p-3 border">
-  .col-3: width of 25%
-</CCol>
-<CCol sm="9" class="bg-light p-3 border">
-  .col-sm-9: width of 75% above sm breakpoint
-</CCol>
-:::
-```vue
-<CCol xs="3" class="bg-light p-3 border">
-  .col-3: width of 25%
-</CCol>
-<CCol sm="9" class="bg-light p-3 border">
-  .col-sm-9: width of 75% above sm breakpoint
-</CCol>
-```
-
-## API
-
-!!!include(./api/grid/CCol.api.md)!!!
diff --git a/packages/docs/layout/containers.md b/packages/docs/layout/containers.md
deleted file mode 100644
index 4db2ce73..00000000
--- a/packages/docs/layout/containers.md
+++ /dev/null
@@ -1,166 +0,0 @@
----
-name: Containers
-title: Containers
-description: Containers are a fundamental building block of CoreUI for Vue.js that contain, pad, and align your content within a given device or viewport.
----
-
-## How they work
-
-Containers are the most basic layout element in CoreUI for Vue.js 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.
-
-CoreUI for Vue.js comes with three different containers:
-
-- `<CContainer>`, which sets a `max-width` at each responsive breakpoint
-- `<CContainer fluid>`, which is `width: 100%` at all breakpoints
-- `<CContainer {sm|md|lg|xl|xxl}>`, which is `width: 100%` until the specified breakpoint
-
-The table below illustrates how each container's `max-width` compares to the original `<CContainer>` and `<CContainer fluid>` across each breakpoint.
-
-<table class="table">
-  <thead>
-    <tr>
-      <td class="border-dark"></td>
-      <th scope="col">
-        Extra small<br/>
-        <span class="fw-normal">&lt;576px</span>
-      </th>
-      <th scope="col">
-        Small<br/>
-        <span class="fw-normal">&ge;576px</span>
-      </th>
-      <th scope="col">
-        Medium<br/>
-        <span class="fw-normal">&ge;768px</span>
-      </th>
-      <th scope="col">
-        Large<br/>
-        <span class="fw-normal">&ge;992px</span>
-      </th>
-      <th scope="col">
-        X-Large<br/>
-        <span class="fw-normal">&ge;1200px</span>
-      </th>
-      <th scope="col">
-        XX-Large<br/>
-        <span class="fw-normal">&ge;1400px</span>
-      </th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td>540px</td>
-      <td>720px</td>
-      <td>960px</td>
-      <td>1140px</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer sm&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td>540px</td>
-      <td>720px</td>
-      <td>960px</td>
-      <td>1140px</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer md&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td>720px</td>
-      <td>960px</td>
-      <td>1140px</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer lg&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td>960px</td>
-      <td>1140px</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer xl&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td>1140px</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer xxl&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th scope="row" class="fw-normal"><code>&lt;CContainer fluid&gt;</code></th>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-      <td class="text-body-secondary">100%</td>
-    </tr>
-  </tbody>
-</table>
-
-## Default container
-
-Our default `<CContainer>` class is a responsive, fixed-width container, meaning its `max-width` changes at each breakpoint.
-
-::: demo
-<CContainer>
-  Content here
-</CContainer>
-:::
-```vue
-<CContainer>
-  Content here
-</CContainer>
-```
-
-## Responsive containers
-
-Responsive 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, `<CContainer sm>` is 100% wide to start until the `sm` breakpoint is reached, where it will scale up with `md`, `lg`, `xl`, and `xxl`.
-
-::: demo
-<CContainer sm>100% wide until small breakpoint</CContainer>
-<CContainer md>100% wide until medium breakpoint</CContainer>
-<CContainer lg>100% wide until large breakpoint</CContainer>
-<CContainer xl>100% wide until extra large breakpoint</CContainer>
-<CContainer xxl>100% wide until extra extra large breakpoint</CContainer>
-:::
-```vue
-<CContainer sm>100% wide until small breakpoint</CContainer>
-<CContainer md>100% wide until medium breakpoint</CContainer>
-<CContainer lg>100% wide until large breakpoint</CContainer>
-<CContainer xl>100% wide until extra large breakpoint</CContainer>
-<CContainer xxl>100% wide until extra extra large breakpoint</CContainer>
-```
-
-## Fluid containers
-
-Use `<CContainer fluid>` for a full width container, spanning the entire width of the viewport.
-
-::: demo
-<CContainer fluid>
-  Content here
-</CContainer>
-:::
-```vue
-<CContainer fluid>
-  Content here
-</CContainer>
-```
-## API
-
-!!!include(./api/grid/CContainer.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/layout/grid.md b/packages/docs/layout/grid.md
deleted file mode 100644
index 2f129a0e..00000000
--- a/packages/docs/layout/grid.md
+++ /dev/null
@@ -1,587 +0,0 @@
----
-title: Grid
-name: Grid
-description: 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.
----
-
-## Example
-
-CoreUI'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.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol sm="auto">
-        One of three columns
-      </CCol>
-      <CCol sm="auto">
-        One of three columns
-      </CCol>
-      <CCol sm="auto">
-        One of three columns
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol sm="auto">
-      One of three columns
-    </CCol>
-    <CCol sm="auto">
-      One of three columns
-    </CCol>
-    <CCol sm="auto">
-      One of three columns
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-The 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 `<CContainer>`.
-
-## How it works
-
-Breaking it down, here's how the grid system comes together:
-
-- **Our grid supports [six responsive breakpoints](./breakpoints).**  Breakpoints are based on `min-width` media queries, meaning they affect that breakpoint and all those above it (e.g., `sm="4"` applies to `sm`, `md`, `lg`, `xl`, and `xxl`). This means you can control container and column sizing and behavior by each breakpoint.
-
-- **Containers center and horizontally pad your content.** Use `<CContainer>` for a responsive pixel width, `<CContainer fluid>` for `width: 100%` across all viewports and devices, or a responsive container (e.g., `<CContainer md>`) for a combination of fluid and pixel widths.
-
-- **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](../gutters) to change the spacing of your content.
-
-- **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., `CCol xs="4"` spans four). `width`s are set in percentages so you always have the same relative sizing.
-
-- **Gutters are also responsive and customizable.** [Gutter classes are available](../gutters) across all breakpoints, with all the same sizes as our [margin and padding spacing](https://coreui.io/docs/utilities/spacing/). Change horizontal gutters with `xs|sm|md|lg|xl|xxl="{ gutterX: * }"` classes, vertical gutters with `xs|sm|md|lg|xl|xxl="{ gutterY: * }"`, or all gutters with `xs|sm|md|lg|xl|xxl="{ gutter: * }"` classes. `xs|sm|md|lg|xl|xxl="{ gutter: 0 }"` is also available to remove gutters.
-
-<!-- - **Sass variables, maps, and mixins power the grid.** If you don't want to use the predefined grid classes in CoreUI, you can use our [grid's source Sass](#sass) 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. -->
-
-Be 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).
-
-## Grid options
-
-CoreUI's grid system can adapt across all six default breakpoints, and any breakpoints you customize. The six default grid tiers are as follow:
-
-- Extra small (xs)
-- Small (sm)
-- Medium (md)
-- Large (lg)
-- Extra large (xl)
-- Extra extra large (xxl)
-
-As noted above, each of these breakpoints have their own container, unique class prefix, and modifiers. Here's how the grid changes across these breakpoints:
-
-<table class="table mb-4">
-  <thead>
-    <tr>
-      <th scope="col"></th>
-      <th scope="col">
-        xs<br/>
-        <span class="fw-normal">&lt;576px</span>
-      </th>
-      <th scope="col">
-        sm<br/>
-        <span class="fw-normal">&ge;576px</span>
-      </th>
-      <th scope="col">
-        md<br/>
-        <span class="fw-normal">&ge;768px</span>
-      </th>
-      <th scope="col">
-        lg<br/>
-        <span class="fw-normal">&ge;992px</span>
-      </th>
-      <th scope="col">
-        xl<br/>
-        <span class="fw-normal">&ge;1200px</span>
-      </th>
-      <th scope="col">
-        xxl<br/>
-        <span class="fw-normal">&ge;1400px</span>
-      </th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th class="text-nowrap" scope="row">Container <code class="fw-normal">max-width</code></th>
-      <td>None (auto)</td>
-      <td>540px</td>
-      <td>720px</td>
-      <td>960px</td>
-      <td>1140px</td>
-      <td>1320px</td>
-    </tr>
-    <tr>
-      <th class="text-nowrap" scope="row">Class prefix</th>
-      <td><code>&lt;CCol xs=&gt;</code></td>
-      <td><code>&lt;CCol sm=&gt;</code></td>
-      <td><code>&lt;CCol md=&gt;</code></td>
-      <td><code>&lt;CCol lg=&gt;</code></td>
-      <td><code>&lt;CCol xl=&gt;</code></td>
-      <td><code>&lt;CCol xxl=&gt;</code></td>
-    </tr>
-    <tr>
-      <th class="text-nowrap" scope="row"># of columns</th>
-      <td colspan="6">12</td>
-    </tr>
-    <tr>
-      <th class="text-nowrap" scope="row">Gutter width</th>
-      <td colspan="6">1.5rem (.75rem on left and right)</td>
-    </tr>
-    <tr>
-      <th class="text-nowrap" scope="row">Custom gutters</th>
-      <td colspan="6"><a href="./layout/gutters">Yes</a></td>
-    </tr>
-    <tr>
-      <th class="text-nowrap" scope="row">Nestable</th>
-      <td colspan="6"><a href="#nesting">Yes</a></td>
-    </tr>
-    <tr>
-      <th class="text-nowrap" scope="row">Column ordering</th>
-      <td colspan="6"><a href="./layout/columns">Yes</a></td>
-    </tr>
-  </tbody>
-</table>
-
-## Auto-layout columns
-
-Utilize breakpoint-specific column classes for easy column sizing without an explicit numbered class like `<CCol sm={6}>`.
-
-### Equal-width
-
-For 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.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol>
-        1 of 2
-      </CCol>
-      <CCol>
-        2 of 2
-      </CCol>
-    </CRow>
-    <CRow>
-      <CCol>
-        1 of 3
-      </CCol>
-      <CCol>
-        2 of 3
-      </CCol>
-      <CCol>
-        3 of 3
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol>
-      1 of 2
-    </CCol>
-    <CCol>
-      2 of 2
-    </CCol>
-  </CRow>
-  <CRow>
-    <CCol>
-      1 of 3
-    </CCol>
-    <CCol>
-      2 of 3
-    </CCol>
-    <CCol>
-      3 of 3
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-### Setting one column width
-
-Auto-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.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol>
-        1 of 3
-      </CCol>
-      <CCol xs="6">
-        2 of 3 (wider)
-      </CCol>
-      <CCol>
-        3 of 3
-      </CCol>
-    </CRow>
-    <CRow>
-      <CCol>
-        1 of 3
-      </CCol>
-      <CCol xs="6">
-        2 of 3 (wider)
-      </CCol>
-      <CCol>
-        3 of 3
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol>
-      1 of 3
-    </CCol>
-    <CCol xs="6">
-      2 of 3 (wider)
-    </CCol>
-    <CCol>
-      3 of 3
-    </CCol>
-  </CRow>
-  <CRow>
-    <CCol>
-      1 of 3
-    </CCol>
-    <CCol xs="6">
-      2 of 3 (wider)
-    </CCol>
-    <CCol>
-      3 of 3
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-### Variable width content
-
-Use `<CCol {breakpoint}="auto"` props to size columns based on the natural width of their content.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <div class="row justify-content-md-center">
-      <CCol xs lg="2">
-        1 of 3
-      </CCol>
-      <CCol md="auto">
-        Variable width content
-      </CCol>
-      <CCol xs lg="2">
-        3 of 3
-      </CCol>
-    </div>
-    <CRow>
-      <CCol>
-        1 of 3
-      </CCol>
-      <CCol md="auto">
-        Variable width content
-      </CCol>
-      <CCol xs lg="2">
-        3 of 3
-      </CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <div class="row justify-content-md-center">
-    <CCol xs lg="2">
-      1 of 3
-    </CCol>
-    <CCol md="auto">
-      Variable width content
-    </CCol>
-    <CCol xs lg="2">
-      3 of 3
-    </CCol>
-  </div>
-  <CRow>
-    <CCol>
-      1 of 3
-    </CCol>
-    <CCol md="auto">
-      Variable width content
-    </CCol>
-    <CCol xs lg="2">
-      3 of 3
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-## Responsive classes
-
-CoreUI'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.
-
-### All breakpoints
-
-For grids that are the same from the smallest of devices to the largest, use the `<CCol>` and `<CCol xs={*}>` classes. Specify a numbered class when you need a particularly sized column; otherwise, feel free to stick to `<CCol>`.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol>col</CCol>
-      <CCol>col</CCol>
-      <CCol>col</CCol>
-      <CCol>col</CCol>
-    </CRow>
-    <CRow>
-      <CCol xs="8">col-8</CCol>
-      <CCol xs="4">col-4</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol>col</CCol>
-    <CCol>col</CCol>
-    <CCol>col</CCol>
-    <CCol>col</CCol>
-  </CRow>
-  <CRow>
-    <CCol xs="8">col-8</CCol>
-    <CCol xs="4">col-4</CCol>
-  </CRow>
-</CContainer>
-```
-
-### Stacked to horizontal
-
-Using a single set of `<CCol sm={*}>` classes, you can create a basic grid system that starts out stacked and becomes horizontal at the small breakpoint (`sm`).
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol sm="8">col-sm-8</CCol>
-      <CCol sm="4">col-sm-4</CCol>
-    </CRow>
-    <CRow>
-      <CCol sm>col-sm</CCol>
-      <CCol sm>col-sm</CCol>
-      <CCol sm>col-sm</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol sm="8">col-sm-8</CCol>
-    <CCol sm="4">col-sm-4</CCol>
-  </CRow>
-  <CRow>
-    <CCol sm>col-sm</CCol>
-    <CCol sm>col-sm</CCol>
-    <CCol sm>col-sm</CCol>
-  </CRow>
-</CContainer>
-```
-
-### Mix and match
-
-Don'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.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow>
-      <CCol md="8">.col-md-8</CCol>
-      <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-    </CRow>
-    <CRow>
-      <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-      <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-      <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-    </CRow>
-    <CRow>
-      <CCol xs="6">.col-6</CCol>
-      <CCol xs="6">.col-6</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow>
-    <CCol md="8">.col-md-8</CCol>
-    <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-  </CRow>
-  <CRow>
-    <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-    <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-    <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-  </CRow>
-  <CRow>
-    <CCol xs="6">.col-6</CCol>
-    <CCol xs="6">.col-6</CCol>
-  </CRow>
-</CContainer>
-```
-
-### Row columns
-
-Use the responsive `:{breakpoint}="{ cols: * }"` classes to quickly set the number of columns that best render your content and layout. Whereas normal `<CCol xs="*">` classes apply to the individual columns (e.g., `<CCol xs="4">`), the row columns classes are set on the parent `<CRow>` as a shortcut. With `:{breakpoint}="{ cols: 'auto' }"` you can give the columns their natural width.
-
-Use these row columns classes to quickly create basic grid layouts or to control your card layouts.
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow :xs="{ cols: 2 }">
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols: 2 }">
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow :xs="{ cols: 3 }">
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols: 3 }">
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow :xs="{ cols: 'auto' }">
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols: 'auto' }">
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow :xs="{ cols: 4 }">
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols: 4 }">
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow :xs="{ cols: 4 }">
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol xs="6">Column</CCol>
-      <CCol>Column</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols: 4 }">
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol xs="6">Column</CCol>
-    <CCol>Column</CCol>
-  </CRow>
-</CContainer>
-```
-
-::: demo
-<div class="docs-example-row">
-  <CContainer>
-    <CRow :xs="{ cols: 1 }" :sm="{ cols: 2 }" :md="{ cols: 4 }">
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-      <CCol>Column</CCol>
-    </CRow>
-  </CContainer>
-</div>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols: 1 }" :sm="{ cols: 2 }" :md="{ cols: 4 }">
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-    <CCol>Column</CCol>
-  </CRow>
-</CContainer>
-```
-
-## API
-
-!!!include(./api/grid/CContainer.api.md)!!!
-
-!!!include(./api/grid/CRow.api.md)!!!
-
-!!!include(./api/grid/CCol.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/layout/gutters.md b/packages/docs/layout/gutters.md
deleted file mode 100644
index 1c144fa0..00000000
--- a/packages/docs/layout/gutters.md
+++ /dev/null
@@ -1,259 +0,0 @@
----
-name: Gutters
-title: Gutters
-description: Gutters are the padding between your columns, used to responsively space and align content in the CoreUI for Vue.js grid system.
----
-
-## How they work
-
-- **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.
-
-- **Gutters start at `1.5rem` (`24px`) wide.** This allows us to match our grid to the [padding and margin spacers](https://coreui.io/docs/utilities/spacing) scale.
-
-- **Gutters can be responsively adjusted.** Use breakpoint-specific gutter props to modify horizontal gutters, vertical gutters, and all gutters.
-
-## Horizontal gutters
-
-`:{breakpoint}="{ gutterX: * }"` props can be used to control the horizontal gutter widths. The `<CContainer>` or `<CContainer 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`:
-
-::: demo
-<CContainer class="px-4">
-  <CRow :xs="{ gutterX: 5 }">
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-:::
-```vue
-<CContainer class="px-4">
-  <CRow :xs="{ gutterX: 5 }">
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-An alternative solution is to add a wrapper around the `<CRow>` with the `.overflow-hidden` class:
-
-::: demo
-<CContainer class="overflow-hidden">
-  <CRow :xs="{ gutterX: 5 }">
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-:::
-```vue
-<CContainer class="overflow-hidden">
-  <CRow :xs="{ gutterX: 5 }">
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-## Vertical gutters
-
-`:{breakpoint}="{ gutterY: * }"` props can be used to control the vertical gutter widths. Like the horizontal gutters, the vertical gutters can cause some overflow below the `<CRow>` at the end of a page. If this occurs, you add a wrapper around `<CRow>` with the `.overflow-hidden` class:
-
-::: demo
-<CContainer class="overflow-hidden">
-  <CRow :xs="{ gutterY: 5 }">
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-:::
-```vue
-<CContainer class="overflow-hidden">
-  <CRow :xs="{ gutterY: 5 }">
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-## Horizontal & vertical gutters
-
-`:{breakpoint}="{ gutter: * }"` props can be used to control the horizontal gutter widths, for the following example we use a smaller gutter width, so there won't be a need to add the `.overflow-hidden` wrapper class.
-
-::: demo
-<CContainer>
-  <CRow :xs="{ gutter: 2 }">
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ gutter: 2 }">
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-    <CCol :xs="{ span: 6 }">
-      <div class="p-3 border bg-light">Custom column padding</div>
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-## Row columns gutters
-
-Gutter props can also be added to [row columns](../layout/grid#row-columns). In the following example, we use responsive row columns and responsive gutter props.
-
-::: demo
-<CContainer>
-  <CRow :xs="{ cols:2, gutter: 2 }" :lg="{ cols: 5, gutter: 3}">
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-  </CRow>
-</CContainer>
-:::
-```vue
-<CContainer>
-  <CRow :xs="{ cols:2, gutter: 2 }" :lg="{ cols: 5, gutter: 3}">
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-    <CCol>
-      <div class="p-3 border bg-light">Row column</div>
-    </CCol>
-  </CRow>
-</CContainer>
-```
-
-## No gutters
-
-The gutters between columns in our predefined grid props can be removed with `:{breakpoint}="{ gutter: 0 }"`. This removes the negative `margin`s from `<CRow>` and the horizontal `padding` from all immediate children columns.
-
-**Need an edge-to-edge design?** Drop the parent `<CContainer>` or `<CContainer fluid>`.
-
-In practice, here's how it looks. Note you can continue to use this with all other predefined grid props (including column widths, responsive tiers, reorders, and more).
-
-::: demo
-<div class="docs-example-row">
-  <CRow :xs="{ gutter: 0 }">
-    <CCol sm="6" md="8">.col-sm-6 .col-md-8</CCol>
-    <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-  </CRow>
-</div>
-:::
-```vue
-<CRow :xs="{ gutter: 0 }">
-  <CCol sm="6" md="8">.col-sm-6 .col-md-8</CCol>
-  <CCol xs="6" md="4">.col-6 .col-md-4</CCol>
-</CRow>
-```
-
-## API
-
-!!!include(./api/grid/CContainer.api.md)!!!
-
-!!!include(./api/grid/CRow.api.md)!!!
-
-!!!include(./api/grid/CCol.api.md)!!!
\ No newline at end of file
diff --git a/packages/docs/migration/v4.md b/packages/docs/migration/v4.md
deleted file mode 100644
index c6fc9df5..00000000
--- a/packages/docs/migration/v4.md
+++ /dev/null
@@ -1,365 +0,0 @@
----
-title: Migration to v4
-description: Track and review changes to the CoreUI for Vue.js components to help you migrate from v3 to v4.
----
-
-CoreUI for Vue is the Vue.js version of CoreUI components library, so before read this migration guide, please check also [CoreUI 3 to 4 migration guide](https://coreui.io/docs/migration/v4/).
-
-## Components
-
-### CAlert
-
-- Deprecated property `fade`.
-- Deprecated property `closeButton`, use `dismissible` instead of.
-- Deprecated property `show`, use `visible` instead of.
-
-### CBadge
-
-- Deprecated property `tag`, use `component` instead of.
-
-### CBreadcrumb
-
-- Deprecated property `addClasses`.
-- Deprecated property `addLinkClasses`.
-- Deprecated property `addLastItemClasses`.
-- Deprecated property `items`.
-
-### CButton
-
-- Deprecated property `block`.
-- Deprecated property `pressed`.
-
-### CCard
-
-- Deprecated property `accentColor`, use utilities `class="border-top-{#color} border-top-3"` instead of.
-- Deprecated property `align`.
-- Deprecated property `bodyWrapper`.
-- Deprecated property `borderColor`.
-- Deprecated property `tag`.
-
-#### CCardBody
-
-- Deprecated property `align`.
-- Deprecated property `color`.
-- Deprecated property `borderColor`.
-- Deprecated property `tag`.
-- Deprecated property `textColor`.
-
-#### CCardFooter
-
-- Deprecated property `align`.
-- Deprecated property `color`.
-- Deprecated property `borderColor`.
-- Deprecated property `tag`.
-- Deprecated property `textColor`.
-
-#### CCardGroup
-
-- Deprecated property `columns`.
-- Deprecated property `deck`.
-- Deprecated property `tag`.
-
-#### CCardHeader
-
-- Deprecated property `align`.
-- Deprecated property `color`.
-- Deprecated property `borderColor`.
-- Deprecated property `tag`, use `component` instead of.
-- Deprecated property `textColor`.
-
-#### CCardImg
-
-- **Component renamed to `CCardImage`**
-- Deprecated property `variant`, use `orientation` instead of.
-
-#### CCardImgOverlay
-
-- **Component renamed to `CCardImageOverlay`**
-- Deprecated property `tag`.
-
-#### CCardSubtitle
-
-- Deprecated property `tag`, use `component` instead of.
-
-#### CCardText
-
-- Deprecated property `tag`, use `component` instead of.
-
-#### CCardTitle
-
-- Deprecated property `tag`, use `component` instead of.
-
-### CCarousel
-
-- Deprecated property `animate`.
-- Deprecated property `arrows`, use `controls` instead of.
-- Deprecated property `indicatorClasses`.
-- Deprecated property `height`.
-
-#### CCarouselControl
-
-- Component is depracated, use `<CCarousel controls>` instead of. 
-
-#### CCarouselIndicators
-
-- Component is depracated, use `<CCarousel indicators>` instead of. 
-
-#### CCarouselInner
-
-- Component is depracated. 
-
-### CCollapse
-
-- Deprecated property `duration`.
-- Deprecated property `navbar`.
-- Deprecated property `transition`.
-- Deprecated property `show`, use `visible` instead of.
-
-### CDropdown
-
-- Deprecated property `addMenuClasses`.
-- Deprecated property `addTogglerClasses`.
-- Deprecated property `caret`.
-- Deprecated property `color`.
-- Deprecated property `inNav`, use `variant="nav-item"` instead of.
-- Deprecated property `togglerText`.
-- Deprecated property `show`, use `visible` instead of.
-- Deprecated property `size`.
-- Deprecated property `split`.
-
-#### CDropdownHeader
-
-- Deprecated property `tag`, use `component` instead of.
-
-### CEmbed
-
-- Component is depracated.
-
-### CFade
-
-- Component is depracated.
-
-### CHeader
-
-- Deprecated property `withSubheader`.
-- Deprecated component `CHeaderNavItem`, use `CNavItem` instead of.
-- Deprecated component `CHeaderNavLink`, use `CNavLink` instead of.
-
-### CImg
-
-- **Component renamed to `CImage`**
-- Deprecated property `block`.
-- Deprecated property `fluidGrow`.
-- Deprecated property `placeholderColor`.
-- Deprecated property `shape`.
-- Deprecated property `tag`.
-
-### CJumbotron
-
-- Component is depracated.
-
-### CListGroup
-
-- Deprecated property `horizontal`, use `layout` instead of.
-- Deprecated property `tag`, use `component` instead of.
-
-#### CListGroupItem
-
-- Deprecated property `accent`.
-- Deprecated property `action`, use property `component="a"` or `component="button"` instead of. 
-- Deprecated property `tag`, use `component` instead of.
-
-### CMedia
-
-- Component is depracated.
-
-### CModal
-
-- Deprecated property `addContentClass`.
-- Deprecated property `borderColor`, use utilities `class="border border-{#color}"` instead of.
-- Deprecated property `centered`.
-- Deprecated property `closeOnBackdrop`.
-- Deprecated property `fade`, use `transition` instead of.
-- Deprecated property `onClosed`.
-- Deprecated property `onOpened`.
-- Deprecated property `show`, use `visible` instead of.
-
-#### CModalBody
-
-- Deprecated property `tag`.
-
-#### CModalFooter
-
-- Deprecated property `tag`.
-
-#### CModalHeader
-
-- Deprecated property `tag`.
-
-### CNav
-
-- Deprecated property `inCard`.
-- Deprecated property `fill`, use `layout="fill"` instead of.
-- Deprecated property `justified`, use `layout="justified"` instead of.
-
-#### CNavItem
-
-- Deprecated property `default`.
-
-### CNavbar
-
-- Deprecated property `expandable`, use `expand` instead of.
-- Deprecated property `fixed`, use `placement="fixed-top"` instead of.
-- Deprecated property `light`, use `colorScheme="light"` instead of.
-- Deprecated property `sticky`, use `placement="sticky-top"` instead of.
-- Deprecated property `tag`, use `component` instead of.
-
-#### CNavbarNav
-
-- Deprecated property `tag`, use `component` instead of.
-
-#### CNavbarText
-
-- Deprecated property `tag`, use `component` instead of.
-
-### CPagination
-
-- **The component has been split into `CPagination` and to `CSmartPagination` components.
-
-### CPopover
-
-- Deprecated property `header`, use `title` instead of.
-
-### CProgress
-
-- Deprecated property `max`.
-- Deprecated property `precision`.
-- Deprecated property `showPercentage`.
-- Deprecated property `showValue`.
-- Deprecated property `size`, use `height` instead of.
-- Deprecated property `striped`, use `variant="striped"` instead of.
-
-### CProgressBar
-
-- Deprecated property `max`.
-- Deprecated property `precision`.
-- Deprecated property `showPercentage`.
-- Deprecated property `showValue`.
-- Deprecated property `size`, use `height` instead of.
-- Deprecated property `striped`, use `variant="striped"` instead of.
-
-### CSidebar
-- Deprecated property `minimize` use `narrow` instead of.
-- Deprecated property `dropdownMode`.
-- Deprecated component `CSidebarForm`, use `CForm` instead of.
-- Deprecated component `CSidebarNavDivider`, use `CNavDivider` instead of.
-- Deprecated component `CSidebarNavDropdown`, use `CNavGroup` instead of.
-- Deprecated component `CSidebarNavLink`, use `CNavLink` instead of.
-- Deprecated component `CSidebarNavItem`, use `CNavItem` instead of.
-- Deprecated component `CSidebarNavTitile`, use `CNavTitle` instead of.
-
-### CSwitch
-
-- Component is depracated, use `CFormSwitch` instead of.
-
-### CSpinner
-
-- Deprecated property `grow`, use `variant="grow"` instead of.
-- Deprecated property `tag`, use `component` instead of.
-
-### CTabs
-
-- Component is depracated, use `<CNav variant="tabs" role="tablist">` instead of
-
-#### CTabContent
-
-- Deprecated property `fade`.
-
-#### CTabPane
-
-- Deprecated property `active`, use `visible` instead of.
-
-### CToast
-
-- Deprecated property `fade`, use `animation` instead of.
-- Deprecated property `show`, use `visible` instead of.
-- Deprecated property `onStateChange`.
-
-#### CToastBody
-
-
-#### CToastHeader
-
-
-
-### CToggler
-
-- Component is depracated.
-
-### CTooltip
-
-- Deprecated property `interactive`.
-- Deprecated property `advancedOptions`.
-
-
-## Forms
-
-### CFormGroup
-
-- Component is depracated.
-
-### CInput
-
-- **Component renamed to `CFormInput`**
-- Deprecated property `plaintext`, use `plain-text` instead of.
-
-### CInputCheckbox
-
-- Component is depracated, use `<CFormCheck>` instead of.
-
-### CInputFile
-
-- Component is depracated, use `<CFormInput type="file">` instead of.
-
-### CInputRadio
-
-- Component is depracated, use `<CFormCheck type="radio">` instead of.
-
-### CInputGroup
-
-
-#### CInputGroupAddon
-
-- Component is depracated, use `CInputGroupText` instead of.
-
-### CSelect
-
-- Component is depracated, use `<CFormSelect>` instead of.
-
-### CValidFeedback
-
-- Component is depracated, use `<CFormFeedback valid>` instead of.
-
-### CInvalidFeedback
-
-- Component is depracated, use `<CCFormFeedback invalid>` instead of.
-
-## Layout
-
-### CContainer
-
-- Deprecated property `tag`.
-
-### CCol
-
-- Deprecated property `tag`.
-- Deprecated property `width`, use `xs`, `sm`, `md`, `lg`, `xl`, `xxl`.
-
-### CRow
-
-- Deprecated property `alignHorizontal`.
-- Deprecated property `alignVertical`.
-- Deprecated property `form`.
-- Deprecated property `gutters`.
-- Deprecated property `tag`.
-- Deprecated property `width`, use `xs`, `sm`, `md`, `lg`, `xl`, `xxl`.
\ No newline at end of file
diff --git a/packages/docs/migration/v5.md b/packages/docs/migration/v5.md
deleted file mode 100644
index d0891fe9..00000000
--- a/packages/docs/migration/v5.md
+++ /dev/null
@@ -1,169 +0,0 @@
----
-title: Migration to v5
-description: Track and review changes to the CoreUI for Vue.js components to help you migrate from v4 to v5.
----
-
-CoreUI for Vue is the Vue.js version of CoreUI components library, so before read this migration guide, please check also [CoreUI 4 to 5 migration guide](https://coreui.io/docs/migration/v5/).
-
-## Components
-
-### CAlertHeading
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CAvatar
-
-- Deprecated `textColor` values: `muted`, `high-emphasis`, `medium-emphasis`, `disabled`, `high-emphasis-inverse`, `medium-emphasis-inverse`, `disabled-inverse`.
-- New `textColor` values: `primary-emphasis`, `secondary-emphasis`, `success-emphasis`, `danger-emphasis`, `warning-emphasis`, `info-emphasis`, `light-emphasis`, `body`, `body-emphasis`, `body-secondary`, `body-tertiary`, `black`, `black-50`, `white`, `white-50`.
-
-### CBadge
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-- Deprecated `textColor` values: `muted`, `high-emphasis`, `medium-emphasis`, `disabled`, `high-emphasis-inverse`, `medium-emphasis-inverse`, `disabled-inverse`.
-- New `textColor` values: `primary-emphasis`, `secondary-emphasis`, `success-emphasis`, `danger-emphasis`, `warning-emphasis`, `info-emphasis`, `light-emphasis`, `body`, `body-emphasis`, `body-secondary`, `body-tertiary`, `black`, `black-50`, `white`, `white-50`.
-
-### CButton
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CCard
-
-- Deprecated `textColor` values: `muted`, `high-emphasis`, `medium-emphasis`, `disabled`, `high-emphasis-inverse`, `medium-emphasis-inverse`, `disabled-inverse`.
-- New `textColor` values: `primary-emphasis`, `secondary-emphasis`, `success-emphasis`, `danger-emphasis`, `warning-emphasis`, `info-emphasis`, `light-emphasis`, `body`, `body-emphasis`, `body-secondary`, `body-tertiary`, `black`, `black-50`, `white`, `white-50`.
-
-### CCardHeader
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CCardImage
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CCardSubtitle
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CCardText
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CCardTitle
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CCloseButton
-
-- Deprecated property `white`, use `dark` instead of.
-
-### CDropdown
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CDropdownHeader
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CDropdownItem
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CDropdownItemPlain
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CDropdownMenu
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CDropdownToggle
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CFormFeedback
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CFormText
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CHeaderBrand
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CHeaderNav
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CInputGroupText
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CLink
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CListGroup
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CListGroupItem
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CModalTitle
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CNav
-
-- The `underline` variant has been changed to `underline-border`
-
-### CNavbar
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CNavbarBrand
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CNavbarNav
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CNavItem
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CNavLink
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CNavTitle
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### COffcanvasTitle
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CPaginationItem
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CPlaceholder
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CSidebar
-
-- <span class="badge bg-danger">Breaking</span> Sidebar has a light color scheme by default, use `colorScheme="dark"` to make it dark.
-
-### CSpinner
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-
-### CToastClose
-
-- <span class="badge bg-danger">Breaking</span> Renamed `component` property to `as`.
-- Deprecated property `white`, use `dark` instead of.
diff --git a/packages/docs/package.json b/packages/docs/package.json
deleted file mode 100644
index e190d802..00000000
--- a/packages/docs/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "@coreui/vue-docs",
-  "version": "5.5.0",
-  "scripts": {
-    "api": "vue-docgen -c build/docgen.config.js",
-    "dev": "vuepress dev --clean-cache",
-    "build": "vuepress build --debug"
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "@coreui/chartjs": "^4.0.0",
-    "@coreui/coreui": "^5.4.0",
-    "@coreui/icons": "^3.0.1",
-    "@coreui/icons-vue": "^2.2.0",
-    "@coreui/utils": "^2.0.2",
-    "@coreui/vue-chartjs": "^3.0.0",
-    "@docsearch/css": "^3.9.0",
-    "@docsearch/js": "^3.9.0",
-    "@vuepress/bundler-vite": "2.0.0-rc.19",
-    "@vuepress/bundler-webpack": "2.0.0-rc.19",
-    "@vuepress/plugin-active-header-links": "2.0.0-rc.69",
-    "@vuepress/plugin-git": "2.0.0-rc.68",
-    "@vuepress/plugin-markdown-container": "2.0.0-rc.66",
-    "@vuepress/plugin-prismjs": "2.0.0-rc.37",
-    "@vuepress/plugin-theme-data": "2.0.0-rc.69",
-    "@vuepress/plugin-register-components": "2.0.0-rc.66",
-    "@vuepress/plugin-toc": "2.0.0-rc.66",
-    "@vuepress/shared": "2.0.0-rc.19",
-    "@vuepress/utils": "2.0.0-rc.19",
-    "markdown-it-anchor": "^9.2.0",
-    "markdown-it-include": "^2.0.0",
-    "sass": "^1.89.1",
-    "vue-docgen-cli": "^4.79.0",
-    "vuepress": "2.0.0-rc.19"
-  }
-}
diff --git a/packages/docs/templates/admin-dashboard.md b/packages/docs/templates/admin-dashboard.md
deleted file mode 100644
index d761ec92..00000000
--- a/packages/docs/templates/admin-dashboard.md
+++ /dev/null
@@ -1,79 +0,0 @@
----
-title: Vue Templates
-name: Vue Templates
-description: Develop modern, beautiful, and responsive applications in half the time with high-performing and easy-to-customize vue admin panels to cover any requirement.
----
-
-
-## Vue Admin & Dashboard Templates
-
-Check out the fully-featured, ready-to-use admin dashboard templates built using CoreUI for Vue.js, and CoreUI PRO for Vue.js
-
-<CRow>
-  <CCol :md="6">
-    <CCard class="mb-4">
-      <CCardBody>
-        <CLink class="text-decoration-none text-reset" href="https://coreui.io/product/free-vue-admin-template/" target="_blank">
-          <CCardTitle>Free Vue Admin Template</CCardTitle>
-          <CCardSubtitle class="mb-3 text-body-secondary">Default Theme</CCardSubtitle>
-          <CImage class="rounded shadow-sm" fluid src="https://coreui.io/images/templates/coreui_free_1440.webp" alt=""/>
-        </CLink>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :md="6">
-    <CCard class="mb-4">
-      <CCardBody>
-        <CLink class="text-decoration-none text-reset" href="https://coreui.io/product/vue-dashboard-template/?theme=default-v3" target="_blank">
-          <CCardTitle>Vue Dashboard Template</CCardTitle>
-          <CCardSubtitle class="mb-3 text-body-secondary">Default Theme v3</CCardSubtitle>
-          <CImage class="rounded shadow-sm" fluid src="https://coreui.io/images/templates/coreui_pro_default_v3_1440.webp" alt=""/>
-        </CLink>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :md="6">
-    <CCard class="mb-4">
-      <CCardBody>
-        <CLink class="text-decoration-none text-reset" href="https://coreui.io/product/vue-dashboard-template/?theme=light-v3" target="_blank">
-          <CCardTitle>Vue Dashboard Template</CCardTitle>
-          <CCardSubtitle class="mb-3 text-body-secondary">Light Theme v3</CCardSubtitle>
-          <CImage class="rounded shadow-sm" fluid src="https://coreui.io/images/templates/coreui_pro_light_v3_1440.webp" alt=""/>
-        </CLink>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :md="6">
-    <CCard class="mb-4">
-      <CCardBody>
-        <CLink class="text-decoration-none text-reset" href="https://coreui.io/product/vue-dashboard-template/?theme=default" target="_blank">
-          <CCardTitle>Vue Dashboard Template</CCardTitle>
-          <CCardSubtitle class="mb-3 text-body-secondary">Default Theme</CCardSubtitle>
-          <CImage class="rounded shadow-sm" fluid src="https://coreui.io/images/templates/coreui_pro_default_1440.webp" alt=""/>
-        </CLink>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :md="6">
-    <CCard class="mb-4">
-      <CCardBody>
-        <CLink class="text-decoration-none text-reset" href="https://coreui.io/product/vue-dashboard-template/?theme=light" target="_blank">
-          <CCardTitle>Vue Dashboard Template</CCardTitle>
-          <CCardSubtitle class="mb-3 text-body-secondary">Light Theme</CCardSubtitle>
-          <CImage class="rounded shadow-sm" fluid src="https://coreui.io/images/templates/coreui_pro_light_1440.webp" alt=""/>
-        </CLink>
-      </CCardBody>
-    </CCard>
-  </CCol>
-  <CCol :md="6">
-    <CCard class="mb-4">
-      <CCardBody>
-        <CLink class="text-decoration-none text-reset" href="https://coreui.io/product/vue-dashboard-template/?theme=dark" target="_blank">
-          <CCardTitle>Vue Dashboard Template</CCardTitle>
-          <CCardSubtitle class="mb-3 text-body-secondary">Dark Theme</CCardSubtitle>
-          <CImage class="rounded shadow-sm" fluid src="https://coreui.io/images/templates/coreui_pro_dark_1440.webp" alt=""/>
-        </CLink>
-      </CCardBody>
-    </CCard>
-  </CCol>
-</CRow>
\ No newline at end of file
diff --git a/packages/docs/templates/contents.md b/packages/docs/templates/contents.md
deleted file mode 100644
index 166b63ca..00000000
--- a/packages/docs/templates/contents.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: Vue templates contents
-name: Vue templates contents
-description: Discover what's included in CoreUI Vue Admin Template, including our precompiled and source code flavors.
----
-
-## Project structure
-
-Once downloaded, unzip the compressed folder and you'll see something like this:
-
-```text
-coreui-vue-admin-template/
-├── public/
-├── src/
-│   ├── assets/
-│   │   ├── brand/
-│   │   ├── icons/
-│   │   └── images/
-│   ├── components/
-│   ├── layout/
-│   ├── router/
-│   ├── styles/
-│   ├── views/
-│   │   ├── base/
-│   │   ├── buttons/
-│   │   ├── css/
-│   │   ├── icons/
-│   │   └── notifications/
-│   ├── App.vue
-│   ├── _nav.js
-│   └── main.js
-├── tests/
-├── ...
-├── babel.config.js
-├── cypress.json
-├── jest.config.js
-├── jsconfig.json
-├── package.json
-└── vue.config.js
-```
-
-This is the most basic form of CoreUI Vue Admin Templates.
diff --git a/packages/docs/templates/customize.md b/packages/docs/templates/customize.md
deleted file mode 100644
index a512092e..00000000
--- a/packages/docs/templates/customize.md
+++ /dev/null
@@ -1,67 +0,0 @@
----
-title: Customize vue templates
-name: Customize vue templates
-description: Learn how to theme, customize, and extend CoreUI Vue Templates with Sass, a boatload of global options.
----
-
-## Overview
-
-There are multiple ways to customize CoreUI for Vue. Your best path can depend on your project, the complexity of your build tools, the version of CoreUI for Vue you're using, browser support, and more.
-
-Our two preferred methods are:
-
-1. You can extend our source files.
-2. You can override CoreUI’s styles.
-
-## File structure
-
-Utilize our source Sass files to take advantage of variables, maps, mixins, and functions to help you build faster and customize your project.
-
-Whenever possible, avoid modifying CoreUI's core files. For Sass, that means creating your own stylesheet that imports CoreUI for Vue 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:
-
-```text
-your-project/
-├── ...
-├── node_modules/
-│   ├── @coreui/coreui
-│   │   ├── scss
-│   │   └── ...
-│   └── @coreui/vue
-│       └── ...
-├── src
-│   └── scss
-│       ├── _custom.scss
-│       ├── ...
-│       ├── _variables.scss
-│       └── ...
-└── ...
-```
-
-## Variable defaults
-
-Every Sass variable in CoreUI for Vue includes the `!default` flag allowing you to override the variable's default value in your own Sass without modifying CoreUI'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 CoreUI.
-
-You will find the complete list of CoreUI's variables in `node_modules/@coreui/coreui/scss/_variables.scss`. Some variables are set to `null`, these variables don't output the property unless they are overridden in your configuration. You can also find a specific component variables list in **Customizing** section.
-
-Here's an example that changes the `background-color` and `color` for the `<body>` when importing and compiling CoreUI for Vue via npm:
-
-```scss
-// _variables.scss
-
-// Default variable overrides
-$body-bg: #000;
-$body-color: #111;
-```
-
-## Custom styles and overrides
-
-In your `custom.scss`, you can put custom code for CoreUI's components or your own styles.
-
-```scss
-// _custom.scss
-
-// Additional custom code here
-.custom-component {
-  border: 2px solid #222;
-}
-```
diff --git a/packages/docs/templates/download.md b/packages/docs/templates/download.md
deleted file mode 100644
index 6d39a453..00000000
--- a/packages/docs/templates/download.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Download vue templates
-name: Download vue templates
-description: Download CoreUI Vue Admin Templates to get the source code that lets you customize and create your vue-based application.
----
-
-## Source files
-
-Compile CoreUI Vue Admin with your own asset pipeline by downloading our source Sass, and JavaScript files. This option requires some additional tooling:
-
-- Vue, Vue CLI
-- Sass compiler for compiling your CSS.
-
-<a href="https://coreui.io/product/free-vue-admin-template/" class="btn btn-primary">Download</a>
-
-<br/><br/>
-
-### Clone repo
-
-You can also fork [CoreUI Vue Admin Template's repository](https://github.com/coreui/coreui-free-vue-admin-template.git).
-
-```sh
-git clone https://github.com/coreui/coreui-free-vue-admin-template.git my-project
-```
diff --git a/packages/docs/templates/installation.md b/packages/docs/templates/installation.md
deleted file mode 100644
index 96684583..00000000
--- a/packages/docs/templates/installation.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: Vue templates installation
-name: Vue templates installation
-description: Learn how to use CoreUI Vue Admin Dashboard Templates including npm scripts to build templates, compile source code, run tests, and more.
----
-
-## Tooling setup
-
-CoreUI Vue Admin Templates uses [npm scripts](https://docs.npmjs.com/misc/scripts/) for its build system. Our `package.json` includes convenient methods for working with the framework, including compiling code, running tests, and more.
-
-To use our build system and run our admin template locally, you'll need a copy of source files and Node. Follow these steps and you should be ready to rock:
-
-1. [Download and install Node.js](https://nodejs.org/en/download/), which we use to manage our dependencies.
-2. If you prefer to use Yarn instead of NPM, you have to [download and install it](https://classic.yarnpkg.com/lang/en/docs/install/)
-3. [Download CoreUI Vue Admin Template](https://coreui.io/product/free-vue-admin-template/).
-4. Navigate to the root template directory and run `npm install` or `yarn install` to install our local dependencies listed in `package.json`.
-
-When completed, you'll be able to run the various commands provided from the command line.
-
-## Using npm scripts
-
-Our `package.json` includes numerous tasks for developing the project. Run `npm run` or `yarn run` to see all the npm scripts in your terminal. **Primary tasks include:**
-
-| Task | Description |
-| --- | --- |
-| `npm run serve` or `yarn serve` | Compiles CSS and JavaScript, builds the documentation, and starts a local server. |
-| `npm run build` or `yarn build` | Creates the `dist/` directory with compiled files. Uses [Sass](https://sass-lang.com/), [Autoprefixer](https://github.com/postcss/autoprefixer). |
-| `npm test` or `yarn test` | Runs tests locally  |
-
-## Sass
-
-CoreUI 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.
-
-Dart 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.
-
-## Autoprefixer
-
-We uses [Autoprefixer][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.
-
-We maintain the list of browsers supported through Autoprefixer in a separate file within our GitHub repository. See `.browserslistrc`.
-
-## Local template
-
-Here's how to get it started:
-
-1. Run through the [tooling setup](#tooling-setup) above to install all dependencies.
-2. From the root template directory, run `npm run start` or `yarn start` in the command line.
-3. Open `http://localhost:8080` in your browser, and voilà.
-
-## Troubleshooting
-
-Should you encounter problems with installing dependencies, uninstall all previous dependency versions (global and local). Then, rerun `npm install` or `yarn install`.
diff --git a/prettier.config.mjs b/prettier.config.mjs
deleted file mode 100644
index c901ceaf..00000000
--- a/prettier.config.mjs
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @see https://prettier.io/docs/en/configuration.html
- * @type {import("prettier").Config}
- */
-const config = {
-  printWidth: 100,
-  semi: false,
-  singleQuote: true,
-  tabWidth: 2,
-  trailingComma: 'es5',
-}
-
-export default config
diff --git a/rollup.config.js b/rollup.config.js
new file mode 100644
index 00000000..1809c7f7
--- /dev/null
+++ b/rollup.config.js
@@ -0,0 +1,149 @@
+import { camelCase } from 'lodash';
+import path from 'path';
+import babel from 'rollup-plugin-babel';
+import commonjs from 'rollup-plugin-commonjs';
+import filesize from 'rollup-plugin-filesize';
+import json from 'rollup-plugin-json';
+import license from 'rollup-plugin-license';
+import postcss from 'rollup-plugin-postcss'
+import resolve from 'rollup-plugin-node-resolve';
+import replace from 'rollup-plugin-replace';
+import magicImporter from 'node-sass-magic-importer';
+
+// import { uglify } from 'rollup-plugin-uglify';
+import vue from 'rollup-plugin-vue';
+// import { minify } from 'uglify-es';
+
+import pack from './package.json';
+
+const projectName = 'coreui-vue';
+
+// compute globals from dependencies
+const globals = pack.dependencies && Object.assign({}, ...Object.keys(pack.dependencies).map((key) => ({
+  [key]: camelCase(key)
+})));
+
+const builds = {
+  // (CommonJS). Used by bundlers e.g. Webpack & Browserify
+  cjs: {
+    entry: 'src/index.js',
+    dest: `dist/${projectName}.common.js`,
+    format: 'cjs'
+  },
+  // (ES Modules). Used by bundlers that support ES Modules,
+  // e.g. Rollup & Webpack 2
+  esm: {
+    entry: 'src/index.js',
+    dest: `dist/${projectName}.esm.js`,
+    format: 'esm'
+  },
+  // build (Browser)
+  'umd-dev': {
+    entry: 'src/index.umd.js',
+    dest: `dist/${projectName}.js`,
+    format: 'umd',
+    env: 'development'
+  },
+  // production build (Browser)
+  'umd-prod': {
+    entry: 'src/index.umd.js',
+    dest: `dist/${projectName}.min.js`,
+    format: 'umd',
+    env: 'production'
+  }
+};
+
+function genConfig(name) {
+  const opts = builds[name];
+  const config = {
+    input: opts.entry,
+    // external: (id) => pack.dependencies && pack.dependencies[id], // exclude dependencies from build
+    // external: ['@coreui/icons', '@coreui/icons/vue'],
+    // preserveModules: true,
+    treeshake: {
+      // moduleSideEffects: false,
+      pureExternalModules: true,
+      propertyReadSideEffects: false
+    },
+    plugins: [
+      resolve({
+        // module: true,
+        // browser: true,
+        // jsnext: true,
+        // preferBuiltins: false,
+        extensions: ['.js', '.json', '.vue']
+      }),
+      commonjs({
+        namedExports: {
+          '@coreui/coreui/dist/js/coreui-utilities.js': ['deepObjectsMerge', 'getStyle'],
+          // '@coreui/icons/vue': ['CIcon']
+        }
+      }),
+      postcss(),
+      vue({
+        compileTemplate: true,
+        css: false,
+        style: {
+          preprocessOptions: {
+            scss: {
+              importer: magicImporter(),
+            },
+          },
+        }
+      }),
+      json(),
+      babel({
+        exclude: 'node_modules/**',
+        runtimeHelpers: true,
+        presets: [
+          ['@vue/app', { modules: false }]
+        ]
+      }),
+      filesize()
+    ].concat(opts.plugins || []),
+    output: {
+      exports: 'named',
+      file: opts.dest,
+      // dir: 'dist/es',
+      format: opts.format,
+      // define globals in window from external dependencies
+      globals,
+      name: opts.moduleName || projectName
+    }
+  };
+
+  if (opts.env) {
+    config.plugins.push(
+      replace({
+        'process.env.NODE_ENV': JSON.stringify(opts.env)
+      })
+    );
+
+    // minify on production targets
+    // if (opts.env === 'production') {
+    //   config.plugins.push(uglify({}, minify));
+    // }
+  }
+
+  // output a license to builds
+  config.plugins.push(
+    license({
+      sourcemap: true,
+      banner: {
+        content: {
+          file: path.resolve('LICENSE.txt')
+        }
+      }
+    })
+  );
+
+  Object.defineProperty(config, '_name', {
+    enumerable: false,
+    value: name
+  });
+
+  return config;
+}
+
+const target = process.env.TARGET || 'umd-prod';
+module.exports = genConfig(target);
diff --git a/src/components/alert/CAlert.vue b/src/components/alert/CAlert.vue
new file mode 100644
index 00000000..9732b9e4
--- /dev/null
+++ b/src/components/alert/CAlert.vue
@@ -0,0 +1,96 @@
+<template>
+  <transition :name="fade ? 'fade' : null" :appear="true">
+    <div
+      v-if="state"
+      :class="alertClasses"
+      role="alert"
+      aria-live="polite"
+      aria-atomic="true"
+    >
+      <CButtonClose
+        v-if="closeButton"
+        @click="dismiss()"
+      />
+      <slot></slot>
+    </div>
+  </transition>
+</template>
+
+<script>
+import CButtonClose from '../button/CButtonClose'
+export default {
+  name: 'CAlert',
+  components: { CButtonClose },
+  props: {
+    color: String,
+    closeButton: Boolean,
+    show: {
+      type: [Boolean, Number],
+      default: true
+    },
+    fade: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data () {
+    return {
+      countdownTimeout: null,
+      state: this.show
+    }
+  },
+  computed: {
+    alertClasses () {
+      return [
+        'alert',
+        {
+          'alert-dismissible': this.closeButton,
+          [`alert-${this.color}`]: this.color
+        }
+      ]
+    }
+  },
+  watch: {
+    show (val) {
+      this.state = val
+    },
+    state: {
+      immediate: true,
+      handler (val, oldVal) {
+        this.clearCounter()
+        if (!val && oldVal) {
+          this.$emit('update:show', val)
+        } else if (typeof val === 'number' && val) {
+          this.countdownTimeout = setTimeout(() => {
+            const isWatched = this.$listeners['update:show']
+            isWatched ? this.$emit('update:show', this.state - 1) : this.state--
+          }, 1000)
+        }
+      }
+    }
+  },
+  destroyed () {
+    this.clearCounter()
+  },
+  methods: {
+    dismiss () {
+      this.state = false
+    },
+    clearCounter () {
+      if (this.countdownTimeout) {
+        clearTimeout(this.countdownTimeout)
+        this.countdownTimeout = null
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .fade-enter-active, .fade-leave-active {
+    transition: opacity .3s;
+  }
+  .fade-enter, .fade-leave-to {
+    opacity: 0;
+  }
+</style>
diff --git a/src/components/alert/index.js b/src/components/alert/index.js
new file mode 100644
index 00000000..2171f11a
--- /dev/null
+++ b/src/components/alert/index.js
@@ -0,0 +1,5 @@
+import CAlert from './CAlert'
+
+export {
+  CAlert
+}
diff --git a/src/components/alert/tests/CAlert.spec.js b/src/components/alert/tests/CAlert.spec.js
new file mode 100644
index 00000000..ced1f7f7
--- /dev/null
+++ b/src/components/alert/tests/CAlert.spec.js
@@ -0,0 +1,75 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CAlert'
+import CButtonClose from '../../button/CButtonClose'
+import Vue from 'vue'
+
+Vue.component('CButtonClose', CButtonClose)
+
+const ComponentName = 'CAlert'
+const defaultWrapper = mount(Component, {
+  propsData: {
+    show: true,
+    closeButton: true
+  },
+  slots: {
+    default: 'Dismissible Alert!'
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    show: true,
+    fade: true,
+    closeButton: true,
+    color: 'success'
+  },
+  slots: {
+    default: 'Dismissible Alert!'
+  },
+  listeners: {
+    'update:show': () => {}
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('changes state corectly', () => {
+    expect(customWrapper.vm.state).toBe(true)
+    customWrapper.setProps({ show: false })
+    expect(customWrapper.vm.state).toBe(false)
+  })
+  it('closes alert after given number of seconds', () => {
+    jest.useFakeTimers()
+    defaultWrapper.setProps({ show: 10 })
+    expect(defaultWrapper.vm.state).toBe(10)
+    setTimeout(() => expect(defaultWrapper.vm.state).toBe(0), 10001)
+    jest.runAllTimers()
+  })
+  it('closes alert after click on dismiss button', () => {
+    customWrapper.setProps({ show: true })
+    const button = customWrapper.find('button')
+    button.trigger('click')
+    expect(customWrapper.vm.state).toBe(false)
+  })
+
+  it('emmits correct update:show events when listener is set', () => {
+    jest.useFakeTimers()
+    customWrapper.setProps({ show: 10 })
+    setTimeout(() => {
+      expect(customWrapper.emitted()['update:show'].slice(-1)[0]).toEqual([9])
+    }, 1000)
+    jest.runAllTimers()
+  })
+  it('properly destroys alert', () => {
+    customWrapper.destroy()
+    expect(customWrapper.vm.countdownTimeout).toBe(null)
+  })
+})
diff --git a/src/components/alert/tests/__snapshots__/CAlert.spec.js.snap b/src/components/alert/tests/__snapshots__/CAlert.spec.js.snap
new file mode 100644
index 00000000..524df810
--- /dev/null
+++ b/src/components/alert/tests/__snapshots__/CAlert.spec.js.snap
@@ -0,0 +1,41 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CAlert renders correctly 1`] = `
+<div
+  appear="true"
+  aria-atomic="true"
+  aria-live="polite"
+  class="alert alert-dismissible"
+  name="fade"
+  role="alert"
+>
+  <button
+    aria-label="Close"
+    class="close"
+    type="button"
+  >
+    ×
+  </button>
+   Dismissible Alert!
+</div>
+`;
+
+exports[`CAlert renders correctly 2`] = `
+<div
+  appear="true"
+  aria-atomic="true"
+  aria-live="polite"
+  class="alert alert-dismissible alert-success"
+  name="fade"
+  role="alert"
+>
+  <button
+    aria-label="Close"
+    class="close"
+    type="button"
+  >
+    ×
+  </button>
+   Dismissible Alert!
+</div>
+`;
diff --git a/src/components/badge/CBadge.vue b/src/components/badge/CBadge.vue
new file mode 100644
index 00000000..310463e3
--- /dev/null
+++ b/src/components/badge/CBadge.vue
@@ -0,0 +1,38 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import CLink, { props as linkProps } from '../link/CLink'
+
+const props = Object.assign(
+  {}, 
+  linkProps, 
+  {
+    tag: {
+      type: String,
+      default: 'span'
+    },
+    color: String,
+    shape: {
+      type: String,
+      validator: shape => ['', 'pill'].includes(shape)
+    }
+  }
+)
+
+export default {
+  functional: true,
+  name:'CBadge',
+  props,
+  render (h, { props, data, children }) {
+    const tag = !props.href && !props.to ? props.tag : CLink
+    const componentData = {
+      staticClass: 'badge',
+      class: {
+        [`badge-${props.color}`]: props.color,
+        'badge-pill': props.shape === 'pill'
+      },
+      props
+    }
+    return h(tag, mergeData(data, componentData), children)
+  }
+}
+</script>
diff --git a/src/components/badge/index.js b/src/components/badge/index.js
new file mode 100644
index 00000000..288ecc0c
--- /dev/null
+++ b/src/components/badge/index.js
@@ -0,0 +1,5 @@
+import CBadge from './CBadge'
+
+export {
+  CBadge
+}
diff --git a/src/components/badge/tests/CBadge.spec.js b/src/components/badge/tests/CBadge.spec.js
new file mode 100644
index 00000000..d3cf19f6
--- /dev/null
+++ b/src/components/badge/tests/CBadge.spec.js
@@ -0,0 +1,29 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CBadge'
+
+const ComponentName = 'CBadge'
+const wrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    color: 'success',
+    active: true,
+    shape: 'pill',
+    disabled: true,
+    href: 'someLink'
+  },
+  slots: {
+    default: 'Badge text'
+  }
+})
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with slot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/badge/tests/__snapshots__/CBadge.spec.js.snap b/src/components/badge/tests/__snapshots__/CBadge.spec.js.snap
new file mode 100644
index 00000000..120fb4a1
--- /dev/null
+++ b/src/components/badge/tests/__snapshots__/CBadge.spec.js.snap
@@ -0,0 +1,21 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CBadge .vue renders correctly 1`] = `
+<span
+  class="badge"
+/>
+`;
+
+exports[`CBadge .vue renders correctly with slot 1`] = `
+<a
+  aria-disabled="true"
+  class="badge disabled active badge-success badge-pill"
+  href="someLink"
+  tabindex="-1"
+  target="_self"
+>
+  <template>
+    Badge text
+  </template>
+</a>
+`;
diff --git a/src/components/breadcrumb/CBreadcrumb.vue b/src/components/breadcrumb/CBreadcrumb.vue
new file mode 100644
index 00000000..db04b9e8
--- /dev/null
+++ b/src/components/breadcrumb/CBreadcrumb.vue
@@ -0,0 +1,59 @@
+<template>
+  <ol class="breadcrumb">
+    <li
+      v-for="(item, index) in linkItems"
+      :key="index"
+      :class="[item.addClasses, sharedClasses, addLinkClasses]"
+      role="presentation"
+    >
+      <CLink v-bind="Object.assign({}, item, { addClasses: null, text: null })">
+        {{item.text}}
+      </CLink>
+    </li>
+    <li
+      v-if="lastItem"
+      :class="lastItemClasses"
+      role="presentation"
+    >
+      <!-- span added to enable text styling through classes -->
+      <span v-text="lastItem.text"></span>
+    </li>
+    <slot></slot>
+  </ol>
+</template>
+
+<script>
+import CLink from '../link/CLink'
+
+export default {
+  name: 'CBreadcrumb',
+  components: {
+    CLink
+  },
+  props: {
+    items: Array,
+    addClasses: [String, Array, Object],
+    addLinkClasses: [String, Array, Object],
+    addLastItemClasses: [String, Array, Object]
+  },
+  computed: {
+    lastItem () {
+      return this.items ? this.items[this.items.length -1] : null
+    },
+    linkItems () {
+      return this.items ? this.items.slice(0, -1) : []
+    },
+    sharedClasses () {
+      return [this.addClasses, 'breadcrumb-item']
+    },
+    lastItemClasses () {
+      return [
+        'active', 
+        this.lastItem.addClasses, 
+        this.sharedClasses, 
+        this.addLastItemClasses
+      ]
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/breadcrumb/CBreadcrumbRouter.vue b/src/components/breadcrumb/CBreadcrumbRouter.vue
new file mode 100644
index 00000000..d8a6597a
--- /dev/null
+++ b/src/components/breadcrumb/CBreadcrumbRouter.vue
@@ -0,0 +1,43 @@
+<template>
+  <CBreadcrumb v-bind="props">
+    <slot></slot>
+  </CBreadcrumb>
+</template>
+
+<script>
+import CBreadcrumb from './CBreadcrumb'
+
+export default {
+  name: 'CBreadcrumbRouter',
+  components: {
+    CBreadcrumb
+  },
+  props: {
+    addClasses: [String, Array, Object],
+    addLinkClasses: [String, Array, Object],
+    addLastItemClasses: [String, Array, Object]
+  },
+  computed: {
+    items () {
+      const routes = this.$route.matched.filter(route => {
+        return route.name || (route.meta && route.meta.label)
+      })
+      return routes.map(route => {
+        const meta = route.meta || {}
+        return {
+          to: route,
+          text: meta.label || route.name
+        }
+      })
+    },
+    props () {
+      return {
+        items: this.items,
+        addClasses: this.addClasses,
+        addLinkClasses: this.addLinkClasses,
+        addLastItemClasses: this.addLastItemClasses
+      }
+    }
+  }
+}
+</script>
diff --git a/src/components/breadcrumb/index.js b/src/components/breadcrumb/index.js
new file mode 100644
index 00000000..afe7487a
--- /dev/null
+++ b/src/components/breadcrumb/index.js
@@ -0,0 +1,7 @@
+import CBreadcrumb from './CBreadcrumb'
+import CBreadcrumbRouter from './CBreadcrumbRouter'
+
+export {
+  CBreadcrumb,
+  CBreadcrumbRouter
+}
diff --git a/src/components/breadcrumb/tests/CBreadcrumb.spec.js b/src/components/breadcrumb/tests/CBreadcrumb.spec.js
new file mode 100644
index 00000000..b28de962
--- /dev/null
+++ b/src/components/breadcrumb/tests/CBreadcrumb.spec.js
@@ -0,0 +1,40 @@
+import {
+  mount
+} from '@vue/test-utils'
+import Component from '../CBreadcrumb'
+
+const ComponentName = 'CBreadcrumb'
+const wrapper = mount(Component, {
+  propsData: {
+    items: [{
+      text: 'Admin',
+      href: '#'
+    }, {
+      text: 'Manage',
+      href: '#'
+    }, {
+      text: 'Library'
+    }],
+    addLinkClasses: 'additional-link-class',
+    addLastItemClasses: 'additional-last-item-class',
+    addClasses: 'additional-class'
+  }
+})
+
+const wrapperSlot = mount(Component, {
+  slots: {
+    default: 'default slot content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with slot content', () => {
+    expect(wrapperSlot.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/breadcrumb/tests/CBreadcrumbRouter.spec.js b/src/components/breadcrumb/tests/CBreadcrumbRouter.spec.js
new file mode 100644
index 00000000..bf51d61d
--- /dev/null
+++ b/src/components/breadcrumb/tests/CBreadcrumbRouter.spec.js
@@ -0,0 +1,40 @@
+//TODO: the test doesn't set paths correctly in the snapshot
+import { mount, createLocalVue } from '@vue/test-utils'
+import Component from '../CBreadcrumbRouter'
+import VueRouter from 'vue-router'
+
+const localVue = createLocalVue()
+const router = new VueRouter()
+
+const ComponentName = 'CBreadcrumbRouter'
+const wrapper = mount(
+  Component,
+  { 
+    localVue, 
+    router, 
+    mocks: {
+      $route: { 
+        matched: [
+          { path: '', meta: { label: 'Home' } },
+          { path: '/menu', name: 'Menu' },
+          { path: '/menu/view', name: 'View' } 
+        ] 
+      }
+    },
+    propsData: { 
+      addLinkClasses: 'additional-link-class',
+      addLastItemClasses: 'additional-last-item-class',
+      addClasses: 'additional-class'
+    }
+  }
+)
+
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/breadcrumb/tests/__snapshots__/CBreadcrumb.spec.js.snap b/src/components/breadcrumb/tests/__snapshots__/CBreadcrumb.spec.js.snap
new file mode 100644
index 00000000..06f2f153
--- /dev/null
+++ b/src/components/breadcrumb/tests/__snapshots__/CBreadcrumb.spec.js.snap
@@ -0,0 +1,56 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CBreadcrumb renders correctly 1`] = `
+<ol
+  class="breadcrumb"
+>
+  <li
+    class="additional-class breadcrumb-item additional-link-class"
+    role="presentation"
+  >
+    <a
+      class=""
+      href="#"
+      target="_self"
+    >
+      
+      Admin
+    
+    </a>
+  </li>
+  <li
+    class="additional-class breadcrumb-item additional-link-class"
+    role="presentation"
+  >
+    <a
+      class=""
+      href="#"
+      target="_self"
+    >
+      
+      Manage
+    
+    </a>
+  </li>
+   
+  <li
+    class="active additional-class breadcrumb-item additional-last-item-class"
+    role="presentation"
+  >
+    <span>
+      Library
+    </span>
+  </li>
+   
+</ol>
+`;
+
+exports[`CBreadcrumb renders correctly with slot content 1`] = `
+<ol
+  class="breadcrumb"
+>
+   
+  <!---->
+   default slot content
+</ol>
+`;
diff --git a/src/components/breadcrumb/tests/__snapshots__/CBreadcrumbRouter.spec.js.snap b/src/components/breadcrumb/tests/__snapshots__/CBreadcrumbRouter.spec.js.snap
new file mode 100644
index 00000000..d9859382
--- /dev/null
+++ b/src/components/breadcrumb/tests/__snapshots__/CBreadcrumbRouter.spec.js.snap
@@ -0,0 +1,46 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CBreadcrumbRouter renders correctly 1`] = `
+<ol
+  class="breadcrumb"
+>
+  <li
+    class="additional-class breadcrumb-item additional-link-class"
+    role="presentation"
+  >
+    <a
+      class=""
+      href="#"
+      target="_self"
+    >
+      
+      Home
+    
+    </a>
+  </li>
+  <li
+    class="additional-class breadcrumb-item additional-link-class"
+    role="presentation"
+  >
+    <a
+      class=""
+      href="#"
+      target="_self"
+    >
+      
+      Menu
+    
+    </a>
+  </li>
+   
+  <li
+    class="active additional-class breadcrumb-item additional-last-item-class"
+    role="presentation"
+  >
+    <span>
+      View
+    </span>
+  </li>
+   
+</ol>
+`;
diff --git a/src/components/button/CButton.vue b/src/components/button/CButton.vue
new file mode 100644
index 00000000..f67af84c
--- /dev/null
+++ b/src/components/button/CButton.vue
@@ -0,0 +1,102 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import { pickByKeys } from '@coreui/utils/src'
+import CLink, { propsFactory as linkPropsFactory } from '../link/CLink'
+
+const btnProps = {
+  block: Boolean,
+  shape: {
+    type: String,
+    validator: shape => ['','pill', 'square'].includes(shape)
+  },
+  variant: {
+    type: String,
+    validator: val => ['', 'ghost', 'outline'].includes(val)
+  },
+  size: {
+    type: String,
+    validator: value => ['', 'sm', 'lg'].includes(value)
+  },
+  color: String,
+  type: {
+    type: String,
+    default: 'button'
+  },
+  pressed: {
+    type: Boolean,
+    default: null
+  }
+}
+const props = Object.assign(linkPropsFactory(), btnProps)
+
+// Helper functons to minimize runtime memory footprint when lots of buttons on page(TODO: check it)
+function isLink (props) {
+  return Boolean(props.href || props.to)
+}
+function isToggle (props) {
+  return props.pressed !== null
+}
+
+function computeClasses (props) {
+  const outlineSuffix = props.variant === 'outline' ? 'outline-' : ''
+  return {
+    [`btn-${outlineSuffix}${props.color}`]: props.color,
+    [`btn-${props.size}`]: props.size,
+    [`btn-ghost-${props.color}`]: props.variant === 'ghost',
+    'btn-block': props.block,
+    'btn-pill': props.shape === 'pill',
+    'btn-square': props.shape === 'square',
+    'disabled': props.disabled,
+    'active': props.pressed
+  }
+}
+
+function computePassedProps (props) {
+  if (!isLink(props)) {
+    return null
+  }
+  return pickByKeys(props, Object.keys(linkPropsFactory()))
+}
+
+function computeAttrs (props, data, isButton, toggle) {
+  return {
+    type: isButton ? props.type : null,
+    // in CLink disabled property works diffrently
+    disabled: isButton ? props.disabled : null,
+    'aria-pressed': toggle ? String(props.pressed) : null,
+    // autocomplete off is needed in toggle mode to prevent some browsers from
+    // remembering the previous setting when using the back button.
+    autocomplete: toggle ? 'off' : null,
+  }
+}
+
+export default {
+  functional: true,
+  name: 'CButton',
+  props,
+  render (h, { props, data, listeners, children }) {
+    const toggle = isToggle(props)
+    const isButton = !isLink(props)
+    const on = {
+      click () {
+        if (toggle && listeners && listeners['update:pressed']) {
+          // Send .sync updates to "pressed" prop (if .sync listener is set)
+          listeners['update:pressed'](!props.pressed)
+        }
+      }
+    }
+    const componentData = {
+      staticClass: 'btn',
+      class: computeClasses(props),
+      props: computePassedProps(props),
+      attrs: computeAttrs(props, data, isButton, toggle),
+      on
+    }
+    return h(
+      isButton ? 'button' : CLink, 
+      mergeData(data, componentData), 
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/button/CButtonClose.vue b/src/components/button/CButtonClose.vue
new file mode 100644
index 00000000..35d6a335
--- /dev/null
+++ b/src/components/button/CButtonClose.vue
@@ -0,0 +1,27 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  name: 'CButtonClose',
+  functional: true,
+  props: {
+    buttonClasses: {
+      type: [String, Array, Object],
+      default: 'close'
+    }
+  },
+  render (h, { data, props, slots }) {
+    return h(
+      'button',
+      mergeData(data,  {
+        class: props.buttonClasses,
+        attrs: {
+          type: 'button',
+          'aria-label': 'Close'
+        },
+        domProps: !slots().default ? { innerHTML: '&times;' } : null
+      }),
+      slots().default
+    )
+  }
+}
+</script>
diff --git a/src/components/button/CButtonGroup.vue b/src/components/button/CButtonGroup.vue
new file mode 100644
index 00000000..cc1c1132
--- /dev/null
+++ b/src/components/button/CButtonGroup.vue
@@ -0,0 +1,29 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  functional: true,
+  name: 'CButtonGroup',
+  props: {
+    vertical: Boolean,
+    size: {
+      type: String,
+      validator: size => ['', 'sm', 'lg'].includes(size)
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      'div',
+      mergeData(data, {
+        class: [
+          !props.vertical ? 'btn-group' : 'btn-group-vertical',
+          { [`btn-group-${props.size}`] : props.size }
+        ],
+        attrs: {
+          role: 'group'
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/button/CButtonToolbar.vue b/src/components/button/CButtonToolbar.vue
new file mode 100644
index 00000000..0ae4eb1a
--- /dev/null
+++ b/src/components/button/CButtonToolbar.vue
@@ -0,0 +1,29 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  functional: true,
+  name: 'CButtonToolbar',
+  props: {
+    justify: {
+      type: String,
+      validator: val => ['', 'start', 'end', 'between', 'center'].includes(val)
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      'div',
+      mergeData(data, {
+        class: [
+          'btn-toolbar',
+          { [`justify-content-${props.justify}`]: props.justify }
+        ],
+        attrs: {
+          'aria-label': 'toolbar',
+          role: 'toolbar'
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/button/index.js b/src/components/button/index.js
new file mode 100644
index 00000000..34208083
--- /dev/null
+++ b/src/components/button/index.js
@@ -0,0 +1,11 @@
+import CButton from './CButton'
+import CButtonClose from './CButtonClose'
+import CButtonGroup from './CButtonGroup'
+import CButtonToolbar from './CButtonToolbar'
+
+export {
+  CButton,
+  CButtonClose,
+  CButtonGroup,
+  CButtonToolbar
+}
diff --git a/src/components/button/tests/CButton.spec.js b/src/components/button/tests/CButton.spec.js
new file mode 100644
index 00000000..ae6d7be8
--- /dev/null
+++ b/src/components/button/tests/CButton.spec.js
@@ -0,0 +1,81 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CButton'
+
+const ComponentName = 'CButton'
+const defaultWrapper = mount(Component)
+
+let updatePressedEmitted = jest.fn()
+const toggleWrapper = mount(Component, {
+  context: {
+    props: {
+      pressed: true,
+      type: 'input',
+      size: 'lg',
+      color: 'info',
+      variant: 'outline',
+      block: true,
+      shape: 'square'
+    }
+  },
+  listeners: {
+    'update:pressed': () => { updatePressedEmitted() }
+  },
+  slots: {
+    default: 'button'
+  }
+})
+
+const routerLinkWrapper = mount(Component, {
+  context: {
+    props: {
+      to: '/dashboard',
+      size: 'sm',
+      color: 'success',
+      variant: 'ghost',
+      shape: 'pill'
+    }
+  },
+  listeners: {
+    'update:pressed': () => { updatePressedEmitted() }
+  },
+  slots: {
+    default: 'button'
+  }
+})
+
+// const disabledButton = mount(Component, {
+//   attachToDocument: true,
+//   context: {
+//     props: {
+//       disabled: true
+//     },
+//     attrs: {
+//       id: 'disabled'
+//     }
+//   },
+//   slots: {
+//     default: 'button'
+//   }
+// })
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly router link button', () => {
+    expect(routerLinkWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly toggle button', () => {
+    expect(toggleWrapper.element).toMatchSnapshot()
+  })
+  it('emits update:pressed event if pressed prop and listener is defined', () => {
+    routerLinkWrapper.trigger('click')
+    expect(updatePressedEmitted).not.toBeCalled()
+
+    toggleWrapper.trigger('click')
+    expect(updatePressedEmitted).toBeCalled()
+  })
+})
diff --git a/src/components/button/tests/CButtonClose.spec.js b/src/components/button/tests/CButtonClose.spec.js
new file mode 100644
index 00000000..6604b83c
--- /dev/null
+++ b/src/components/button/tests/CButtonClose.spec.js
@@ -0,0 +1,39 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CButtonClose'
+
+const ComponentName = 'CButtonClose'
+const defaultWrapper = mount(Component)
+const slotWrapper = mount(Component, {
+  slots: {
+    default: 'slot'
+  }
+})
+const customWrapper = mount(Component, {
+  context: {
+    props: {
+      buttonClasses: 'custom-class'
+    }
+  },
+  attrs: {
+    disabled: 'disabled',
+    style: 'color:red'
+  },
+  slots: {
+    default: 'ok'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with custom iconHtml', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with slot', () => {
+    expect(slotWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/button/tests/CButtonGroup.spec.js b/src/components/button/tests/CButtonGroup.spec.js
new file mode 100644
index 00000000..280f238f
--- /dev/null
+++ b/src/components/button/tests/CButtonGroup.spec.js
@@ -0,0 +1,26 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CButtonGroup'
+
+const ComponentName = 'CButtonGroup'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    vertical: true,
+    size: 'lg'
+  },
+  slots: {
+    default: 'Vertical Group'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/button/tests/CButtonToolbar.spec.js b/src/components/button/tests/CButtonToolbar.spec.js
new file mode 100644
index 00000000..9e40110a
--- /dev/null
+++ b/src/components/button/tests/CButtonToolbar.spec.js
@@ -0,0 +1,25 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CButtonToolbar'
+
+const ComponentName = 'CButtonToolbar'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    justify: 'between'
+  },
+  slots: {
+    default: 'Custom button toolbar'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/button/tests/__snapshots__/CButton.spec.js.snap b/src/components/button/tests/__snapshots__/CButton.spec.js.snap
new file mode 100644
index 00000000..d30928f5
--- /dev/null
+++ b/src/components/button/tests/__snapshots__/CButton.spec.js.snap
@@ -0,0 +1,33 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CButton renders correctly 1`] = `
+<button
+  class="btn"
+  type="button"
+/>
+`;
+
+exports[`CButton renders correctly router link button 1`] = `
+<a
+  class="btn btn-success btn-sm btn-ghost-success btn-pill"
+  href="#"
+  target="_self"
+>
+  <template>
+    button
+  </template>
+</a>
+`;
+
+exports[`CButton renders correctly toggle button 1`] = `
+<button
+  aria-pressed="true"
+  autocomplete="off"
+  class="btn btn-outline-info btn-lg btn-block btn-square active"
+  type="input"
+>
+  <template>
+    button
+  </template>
+</button>
+`;
diff --git a/src/components/button/tests/__snapshots__/CButtonClose.spec.js.snap b/src/components/button/tests/__snapshots__/CButtonClose.spec.js.snap
new file mode 100644
index 00000000..5bd875cb
--- /dev/null
+++ b/src/components/button/tests/__snapshots__/CButtonClose.spec.js.snap
@@ -0,0 +1,33 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CButtonClose renders correctly 1`] = `
+<button
+  aria-label="Close"
+  class="close"
+  type="button"
+>
+  ×
+</button>
+`;
+
+exports[`CButtonClose renders correctly with custom iconHtml 1`] = `
+<button
+  aria-label="Close"
+  class="custom-class"
+  disabled="disabled"
+  style="color:red"
+  type="button"
+>
+  ok
+</button>
+`;
+
+exports[`CButtonClose renders correctly with slot 1`] = `
+<button
+  aria-label="Close"
+  class="close"
+  type="button"
+>
+  slot
+</button>
+`;
diff --git a/src/components/button/tests/__snapshots__/CButtonGroup.spec.js.snap b/src/components/button/tests/__snapshots__/CButtonGroup.spec.js.snap
new file mode 100644
index 00000000..f40f52a8
--- /dev/null
+++ b/src/components/button/tests/__snapshots__/CButtonGroup.spec.js.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CButtonGroup renders correctly 1`] = `
+<div
+  class="btn-group"
+  role="group"
+/>
+`;
+
+exports[`CButtonGroup renders correctly 2`] = `
+<div
+  class="btn-group-vertical btn-group-lg"
+  role="group"
+>
+  <template>
+    Vertical Group
+  </template>
+</div>
+`;
diff --git a/src/components/button/tests/__snapshots__/CButtonToolbar.spec.js.snap b/src/components/button/tests/__snapshots__/CButtonToolbar.spec.js.snap
new file mode 100644
index 00000000..805290ef
--- /dev/null
+++ b/src/components/button/tests/__snapshots__/CButtonToolbar.spec.js.snap
@@ -0,0 +1,21 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CButtonToolbar renders correctly 1`] = `
+<div
+  aria-label="toolbar"
+  class="btn-toolbar"
+  role="toolbar"
+/>
+`;
+
+exports[`CButtonToolbar renders correctly 2`] = `
+<div
+  aria-label="toolbar"
+  class="btn-toolbar justify-content-between"
+  role="toolbar"
+>
+  <template>
+    Custom button toolbar
+  </template>
+</div>
+`;
diff --git a/src/components/callout/CCallout.vue b/src/components/callout/CCallout.vue
new file mode 100644
index 00000000..1ef5baa8
--- /dev/null
+++ b/src/components/callout/CCallout.vue
@@ -0,0 +1,14 @@
+<template>
+  <div :class="`c-callout ${color ? 'c-callout-' + color : ''}`">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CCallout',
+  props: {
+    color: String
+  }
+}
+</script>
diff --git a/src/components/callout/index.js b/src/components/callout/index.js
new file mode 100644
index 00000000..a75eaa33
--- /dev/null
+++ b/src/components/callout/index.js
@@ -0,0 +1,5 @@
+import CCallout from './CCallout'
+
+export {
+  CCallout
+}
diff --git a/src/components/callout/tests/CCallout.spec.js b/src/components/callout/tests/CCallout.spec.js
new file mode 100644
index 00000000..78b55928
--- /dev/null
+++ b/src/components/callout/tests/CCallout.spec.js
@@ -0,0 +1,25 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCallout'
+
+const ComponentName = 'CCallout'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    color: 'success',
+  },
+  slots: {
+    default: 'Callout'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/callout/tests/__snapshots__/CCallout.spec.js.snap b/src/components/callout/tests/__snapshots__/CCallout.spec.js.snap
new file mode 100644
index 00000000..fef25d65
--- /dev/null
+++ b/src/components/callout/tests/__snapshots__/CCallout.spec.js.snap
@@ -0,0 +1,15 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCallout renders correctly 1`] = `
+<div
+  class="c-callout "
+/>
+`;
+
+exports[`CCallout renders correctly 2`] = `
+<div
+  class="c-callout c-callout-success"
+>
+  Callout
+</div>
+`;
diff --git a/src/components/card/CCard.vue b/src/components/card/CCard.vue
new file mode 100644
index 00000000..d6e06696
--- /dev/null
+++ b/src/components/card/CCard.vue
@@ -0,0 +1,37 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import sharedCardProps from './shared-card-props'
+import CCardBody from './CCardBody'
+
+const props = Object.assign(
+  sharedCardProps,
+  {
+    bodyWrapper: Boolean,
+    accentColor: String
+  }
+)
+export default {
+  functional: true,
+  name: 'CCard',
+  props,
+  render (h, { props, data, slots }) {
+    const slot = slots().default
+    const content = props.bodyWrapper ? h(CCardBody, slot) : slot
+
+    return h(
+      props.tag || 'div',
+      mergeData(data, {
+        staticClass: 'card',
+        class: {
+          [`card-accent-${props.accentColor}`]: props.accentColor,
+          [`text-${props.align}`]: props.align,
+          [`bg-${props.color}`]: props.color,
+          [`border-${props.borderColor}`]: props.borderColor,
+          [`text-${props.textColor}`]: props.textColor
+        }
+      }),
+      [content]
+    )
+  }
+}
+</script>
diff --git a/src/components/card/CCardBody.vue b/src/components/card/CCardBody.vue
new file mode 100644
index 00000000..7094c641
--- /dev/null
+++ b/src/components/card/CCardBody.vue
@@ -0,0 +1,27 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import sharedCardProps from './shared-card-props'
+
+export default {
+  functional: true,
+  name: 'CCardBody',
+  props: sharedCardProps,
+  render (h, { props, data, children }) {
+    return h(
+      props.tag || 'div',
+      mergeData(data, {
+        staticClass: 'card-body',
+        class: [
+          {
+            [`bg-${props.color}`]: props.color,
+            [`border-${props.borderColor}`]: props.borderColor,
+            [`text-${props.textColor}`]: props.textColor,
+            [`text-${props.align}`]: props.align
+          }
+        ]
+      }),
+      [ children ]
+    )
+  }
+}
+</script>
diff --git a/src/components/card/CCardFooter.vue b/src/components/card/CCardFooter.vue
new file mode 100644
index 00000000..0111bdb0
--- /dev/null
+++ b/src/components/card/CCardFooter.vue
@@ -0,0 +1,27 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import sharedCardProps from './shared-card-props'
+
+export default {
+  functional: true,
+  name: 'CCardFooter',
+  props: sharedCardProps,
+  render (h, { props, data, children }) {
+    return h(
+      props.tag || 'footer',
+      mergeData(data, {
+        staticClass: 'card-footer',
+        class: [
+          {
+            [`text-${props.align}`]: props.align,
+            [`bg-${props.color}`]: props.color,
+            [`border-${props.borderColor}`]: props.borderColor,
+            [`text-${props.textColor}`]: props.textColor
+          }
+        ]
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/card/CCardGroup.vue b/src/components/card/CCardGroup.vue
new file mode 100644
index 00000000..ad0ce891
--- /dev/null
+++ b/src/components/card/CCardGroup.vue
@@ -0,0 +1,25 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  functional: true,
+  name: 'CCardGroup',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    },
+    deck:  Boolean,
+    columns: Boolean
+  },
+  render (h, { props, data, children }) {
+    const type = props.columns ? 'columns' : props.deck ? 'deck' : 'group'
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: `card-${type}`
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/card/CCardHeader.vue b/src/components/card/CCardHeader.vue
new file mode 100644
index 00000000..db27e815
--- /dev/null
+++ b/src/components/card/CCardHeader.vue
@@ -0,0 +1,27 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import sharedCardProps from './shared-card-props'
+
+export default {
+  functional: true,
+  name: 'CCardHeader',
+  props: sharedCardProps,
+  render (h, { props, data, children }) {
+    return h(
+      props.tag || 'header',
+      mergeData(data, {
+        staticClass: 'card-header',
+        class: [
+          {
+            [`text-${props.align}`]: props.align,
+            [`bg-${props.color}`]: props.color,
+            [`border-${props.borderColor}`]: props.borderColor,
+            [`text-${props.textColor}`]: props.textColor
+          }
+        ]
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/CCardImg.vue b/src/components/card/CCardImg.vue
new file mode 100644
index 00000000..ba219986
--- /dev/null
+++ b/src/components/card/CCardImg.vue
@@ -0,0 +1,30 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import CImg from '../image/CImg'
+const props = Object.assign(
+  { 
+    variant: {
+      type: String,
+      default: 'full',
+      validator: val => ['', 'top', 'bottom', 'full'].includes(val)
+    }
+  },
+  CImg.props
+)
+
+export default {
+  functional: true,
+  name: 'CCardImg',
+  props,
+  render (h, { props, data }) {
+    const haveClassSuffix = props.variant !== 'full'
+    return h(
+      CImg,
+      mergeData(data, {
+        class: `card-img${haveClassSuffix ? `-${props.variant}` : ''}`,
+        props
+      })
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/CCardImgOverlay.vue b/src/components/card/CCardImgOverlay.vue
new file mode 100644
index 00000000..e6d08b6e
--- /dev/null
+++ b/src/components/card/CCardImgOverlay.vue
@@ -0,0 +1,23 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CCardImgOverlay',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'card-img-overlay'
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/CCardLink.vue b/src/components/card/CCardLink.vue
new file mode 100644
index 00000000..05a4acbc
--- /dev/null
+++ b/src/components/card/CCardLink.vue
@@ -0,0 +1,20 @@
+<script>
+import CLink, { props } from '../link/CLink'
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CCardLink',
+  props,
+  render (h, { props, data, children }) {
+    return h(
+      CLink,
+      mergeData(data, {
+        staticClass: 'card-link',
+        props
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/CCardSubtitle.vue b/src/components/card/CCardSubtitle.vue
new file mode 100644
index 00000000..49acc802
--- /dev/null
+++ b/src/components/card/CCardSubtitle.vue
@@ -0,0 +1,23 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CCardSubtitle',
+  props: {
+    tag: {
+      type: String,
+      default: 'h6'
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'card-subtitle'
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/CCardText.vue b/src/components/card/CCardText.vue
new file mode 100644
index 00000000..ee30e924
--- /dev/null
+++ b/src/components/card/CCardText.vue
@@ -0,0 +1,23 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CCardText',
+  props: {
+    tag: {
+      type: String,
+      default: 'p'
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'card-text'
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/CCardTitle.vue b/src/components/card/CCardTitle.vue
new file mode 100644
index 00000000..e56761a2
--- /dev/null
+++ b/src/components/card/CCardTitle.vue
@@ -0,0 +1,23 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CCardTitle',
+  props: {
+    tag: {
+      type: String,
+      default: 'h4'
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'card-title'
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/card/index.js b/src/components/card/index.js
new file mode 100644
index 00000000..3bd92f4a
--- /dev/null
+++ b/src/components/card/index.js
@@ -0,0 +1,26 @@
+import CCard from './CCard'
+import CCardBody from './CCardBody'
+import CCardFooter from './CCardFooter'
+import CCardGroup from './CCardGroup'
+import CCardHeader from './CCardHeader'
+import CCardImg from './CCardImg'
+import CCardImgOverlay from './CCardImgOverlay'
+import CCardLink from './CCardLink'
+import CCardSubtitle from './CCardSubtitle'
+import CCardText from './CCardText'
+import CCardTitle from './CCardTitle'
+
+
+export {
+  CCard,
+  CCardBody,
+  CCardFooter,
+  CCardHeader,
+  CCardGroup,
+  CCardImg,
+  CCardImgOverlay,
+  CCardLink,
+  CCardSubtitle,
+  CCardText,
+  CCardTitle
+}
diff --git a/src/components/card/shared-card-props.js b/src/components/card/shared-card-props.js
new file mode 100644
index 00000000..7990a15b
--- /dev/null
+++ b/src/components/card/shared-card-props.js
@@ -0,0 +1,10 @@
+export default {
+  tag: String,
+  color: String,
+  borderColor: String,
+  textColor: String,
+  align: {
+    type: String,
+    validator: val => ['', 'left', 'center', 'right'].includes(val)
+  }
+}
diff --git a/src/components/card/tests/CCard.spec.js b/src/components/card/tests/CCard.spec.js
new file mode 100644
index 00000000..3c7d3b8c
--- /dev/null
+++ b/src/components/card/tests/CCard.spec.js
@@ -0,0 +1,46 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCard'
+const ComponentName = 'CCard'
+
+const wrapper = mount(Component, {
+  context: {
+    props: {
+      align: 'left',
+      color: 'success',
+      textColor: 'white',
+      borderColor: 'solid'
+    }
+  }
+})
+const slotWrapper = mount(Component, {
+  context: {
+    props: {
+      align: 'left',
+      color: 'success',
+      textColor: 'white',
+      borderColor: 'solid',
+      accentColor: 'primary',
+      bodyWrapper: true
+    }
+  },
+  slots: {
+    default: 'this should be rendered in body wrapper'
+  }
+})
+
+const noBodyCard = mount(Component, {})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with slots', () => {
+    expect(slotWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly without body', () => {
+    expect(noBodyCard.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/card/tests/CCardBody.spec.js b/src/components/card/tests/CCardBody.spec.js
new file mode 100644
index 00000000..ec05ac98
--- /dev/null
+++ b/src/components/card/tests/CCardBody.spec.js
@@ -0,0 +1,23 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardBody'
+
+const ComponentName = 'CCardBody'
+const wrapper = mount(Component, {
+  context: {
+    props: {
+      align: 'left',
+      color: 'primary',
+      textColor: 'white',
+      borderColor: 'solid'
+    }
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/card/tests/CCardFooter.spec.js b/src/components/card/tests/CCardFooter.spec.js
new file mode 100644
index 00000000..2e6a08ca
--- /dev/null
+++ b/src/components/card/tests/CCardFooter.spec.js
@@ -0,0 +1,26 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardFooter'
+
+const ComponentName = 'CCardFooter'
+const wrapper = mount(Component, {
+  context: {
+    props: {
+      align: 'left',
+      color: 'primary',
+      textColor: 'white',
+      borderColor: 'solid'
+    }
+  },
+  slots: {
+    default: 'content goes here'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/card/tests/CCardGroup.spec.js b/src/components/card/tests/CCardGroup.spec.js
new file mode 100644
index 00000000..910f99aa
--- /dev/null
+++ b/src/components/card/tests/CCardGroup.spec.js
@@ -0,0 +1,23 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardGroup'
+const ComponentName = 'CCardGroup'
+const wrapper = mount(Component, {
+  context: {
+    props: {
+      deck: true,
+      column: true,
+    }
+  },
+  slots: {
+    default: 'content goes here'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/card/tests/CCardHeader.spec.js b/src/components/card/tests/CCardHeader.spec.js
new file mode 100644
index 00000000..fc56fbbb
--- /dev/null
+++ b/src/components/card/tests/CCardHeader.spec.js
@@ -0,0 +1,26 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardHeader'
+const ComponentName = 'CCardHeader'
+const wrapper = mount(Component, {
+  context: {
+    props: {
+      header: 'header',
+      align: 'left',
+      color: 'primary',
+      textColor: 'white',
+      borderColor: 'solid'
+    }
+  },
+  slots: {
+    default: 'content goes here'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+});
diff --git a/src/components/card/tests/CCardImg.spec.js b/src/components/card/tests/CCardImg.spec.js
new file mode 100644
index 00000000..572449bf
--- /dev/null
+++ b/src/components/card/tests/CCardImg.spec.js
@@ -0,0 +1,22 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardImg'
+const ComponentName = 'CCardImg'
+
+const wrapper = mount(Component)
+const wrapperTop = mount(Component, {
+  props: {
+    variant: 'top'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with variant', () => {
+    expect(wrapperTop.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/card/tests/CCardImgOverlay.spec.js b/src/components/card/tests/CCardImgOverlay.spec.js
new file mode 100644
index 00000000..2c0dbd8a
--- /dev/null
+++ b/src/components/card/tests/CCardImgOverlay.spec.js
@@ -0,0 +1,18 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardImgOverlay'
+const ComponentName = 'CCardImgOverlay'
+
+const wrapper = mount(Component, {
+  slots: {
+    default: 'content goes here'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/card/tests/CCardLink.spec.js b/src/components/card/tests/CCardLink.spec.js
new file mode 100644
index 00000000..0408a4fa
--- /dev/null
+++ b/src/components/card/tests/CCardLink.spec.js
@@ -0,0 +1,13 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardLink'
+const ComponentName = 'CCardLink'
+const wrapper = mount(Component)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/card/tests/CCardSubtitle.spec.js b/src/components/card/tests/CCardSubtitle.spec.js
new file mode 100644
index 00000000..b55da02c
--- /dev/null
+++ b/src/components/card/tests/CCardSubtitle.spec.js
@@ -0,0 +1,13 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardSubtitle'
+const ComponentName = 'CCardSubtitle'
+const wrapper = mount(Component)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/card/tests/CCardText.spec.js b/src/components/card/tests/CCardText.spec.js
new file mode 100644
index 00000000..e23eb0d8
--- /dev/null
+++ b/src/components/card/tests/CCardText.spec.js
@@ -0,0 +1,13 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardText'
+const ComponentName = 'CCardText'
+const wrapper = mount(Component)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/card/tests/CCardTitle.spec.js b/src/components/card/tests/CCardTitle.spec.js
new file mode 100644
index 00000000..ff29a527
--- /dev/null
+++ b/src/components/card/tests/CCardTitle.spec.js
@@ -0,0 +1,13 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCardTitle'
+const ComponentName = 'CCardTitle'
+const wrapper = mount(Component)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/card/tests/__snapshots__/CCard.spec.js.snap b/src/components/card/tests/__snapshots__/CCard.spec.js.snap
new file mode 100644
index 00000000..fa481d85
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCard.spec.js.snap
@@ -0,0 +1,25 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCard renders correctly 1`] = `
+<div
+  class="card text-left bg-success border-solid text-white"
+/>
+`;
+
+exports[`CCard renders correctly with slots 1`] = `
+<div
+  class="card card-accent-primary text-left bg-success border-solid text-white"
+>
+  <div
+    class="card-body"
+  >
+    this should be rendered in body wrapper
+  </div>
+</div>
+`;
+
+exports[`CCard renders correctly without body 1`] = `
+<div
+  class="card"
+/>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardBody.spec.js.snap b/src/components/card/tests/__snapshots__/CCardBody.spec.js.snap
new file mode 100644
index 00000000..af3edd63
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardBody.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardBody renders correctly 1`] = `
+<div
+  class="card-body bg-primary border-solid text-white text-left"
+/>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardFooter.spec.js.snap b/src/components/card/tests/__snapshots__/CCardFooter.spec.js.snap
new file mode 100644
index 00000000..5f2f47a0
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardFooter.spec.js.snap
@@ -0,0 +1,11 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardFooter renders correctly 1`] = `
+<footer
+  class="card-footer text-left bg-primary border-solid text-white"
+>
+  <template>
+    content goes here
+  </template>
+</footer>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardGroup.spec.js.snap b/src/components/card/tests/__snapshots__/CCardGroup.spec.js.snap
new file mode 100644
index 00000000..d7651a96
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardGroup.spec.js.snap
@@ -0,0 +1,11 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardGroup renders correctly 1`] = `
+<div
+  class="card-deck"
+>
+  <template>
+    content goes here
+  </template>
+</div>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardHeader.spec.js.snap b/src/components/card/tests/__snapshots__/CCardHeader.spec.js.snap
new file mode 100644
index 00000000..919035cd
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardHeader.spec.js.snap
@@ -0,0 +1,11 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardHeader renders correctly 1`] = `
+<header
+  class="card-header text-left bg-primary border-solid text-white"
+>
+  <template>
+    content goes here
+  </template>
+</header>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardImg.spec.js.snap b/src/components/card/tests/__snapshots__/CCardImg.spec.js.snap
new file mode 100644
index 00000000..f326cb53
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardImg.spec.js.snap
@@ -0,0 +1,15 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardImg renders correctly 1`] = `
+<svg
+  class="card-img"
+  style="background-color: transparent;"
+/>
+`;
+
+exports[`CCardImg renders correctly with variant 1`] = `
+<svg
+  class="card-img-undefined"
+  style="background-color: transparent;"
+/>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardImgOverlay.spec.js.snap b/src/components/card/tests/__snapshots__/CCardImgOverlay.spec.js.snap
new file mode 100644
index 00000000..53f1d039
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardImgOverlay.spec.js.snap
@@ -0,0 +1,11 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardImgOverlay renders correctly 1`] = `
+<div
+  class="card-img-overlay"
+>
+  <template>
+    content goes here
+  </template>
+</div>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardLink.spec.js.snap b/src/components/card/tests/__snapshots__/CCardLink.spec.js.snap
new file mode 100644
index 00000000..8f652546
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardLink.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardLink renders correctly 1`] = `
+<a
+  class="card-link"
+  href="#"
+  target="_self"
+/>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardSubtitle.spec.js.snap b/src/components/card/tests/__snapshots__/CCardSubtitle.spec.js.snap
new file mode 100644
index 00000000..9ba81613
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardSubtitle.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardSubtitle renders correctly 1`] = `
+<h6
+  class="card-subtitle"
+/>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardText.spec.js.snap b/src/components/card/tests/__snapshots__/CCardText.spec.js.snap
new file mode 100644
index 00000000..2c8f8459
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardText.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardText renders correctly 1`] = `
+<p
+  class="card-text"
+/>
+`;
diff --git a/src/components/card/tests/__snapshots__/CCardTitle.spec.js.snap b/src/components/card/tests/__snapshots__/CCardTitle.spec.js.snap
new file mode 100644
index 00000000..a76eeca9
--- /dev/null
+++ b/src/components/card/tests/__snapshots__/CCardTitle.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCardTitle renders correctly 1`] = `
+<h4
+  class="card-title"
+/>
+`;
diff --git a/src/components/carousel/CCarousel.vue b/src/components/carousel/CCarousel.vue
new file mode 100644
index 00000000..ad6d4073
--- /dev/null
+++ b/src/components/carousel/CCarousel.vue
@@ -0,0 +1,117 @@
+<template>
+  <div class="carousel slide" :style="{ height: height || 'auto' }">
+    <ol v-if="indicators" :class="indicatorClasses">
+      <li
+        v-for="(index, key) in items.length"
+        @click="setItem(key)"
+        :class="{ 'active': activated === key }"
+        :key="key"
+      ></li>
+    </ol>
+    <div class="carousel-inner">
+      <slot></slot>
+    </div>
+    <template v-if="arrows">
+      <a class="carousel-control-prev" @click="previousItem">
+        <span 
+          class="carousel-control-prev-icon"
+          aria-label="Previous"
+        ></span>
+      </a>
+      <a class="carousel-control-next" @click="nextItem">
+        <span 
+          class="carousel-control-next-icon"
+          aria-label="Next"
+        ></span>
+      </a>
+    </template>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CCarousel',
+  props: {
+    interval: Number,
+    animate: Boolean,
+    indicators: Boolean,
+    arrows: Boolean,
+    indicatorClasses: {
+      type: [String, Array, Object],
+      default: 'carousel-indicators'
+    },
+    height: [String, Number]
+  },
+  data () {
+    return {
+      active: null,
+      activated: null,
+      items: [],
+      currentInterval: null,
+      transitioning: false,
+    }
+  },
+  mounted () {
+    this.items = this.$children
+    const activated = this.items.map((item, index) => item.active ? index :null)
+                                .filter(item => item)
+    this.active = activated[0] || 0
+    this.activate(activated[0] || 0)
+  },
+  beforeDestroy () {
+    clearInterval(this.currentInterval)
+  },
+  methods: {
+    resetInterval () {
+      if (this.animate && this.interval) {
+        clearInterval(this.currentInterval)
+        this.currentInterval = setInterval(() => {
+          this.nextItem()
+        }, this.interval)
+      }
+    },
+    nextItem () {
+      this.setItem(this.active === this.items.length - 1 ? 0 : this.active + 1, 'next')
+    },
+    previousItem () {
+      this.setItem(this.active === 0 ? this.items.length -1  : this.active - 1, 'prev')
+    },
+    setItem (index, passedOrder = null) {
+      if (index === this.activated) {
+        return this.resetInterval()
+      } else if (this.transitioning) {
+        return
+      }
+      const order = passedOrder || (this.active > index ? 'prev' : 'next')
+      this.active = index
+      this.activate(index, order)
+    },
+    activate (index, order) {
+      this.resetInterval()
+      this.activated = index
+      if (!order || !this.animate) {
+        this.items.forEach(item => item.$emit('setItem', this.items[index]))
+      } else {
+        this.slide(index, order)
+      }
+    },
+    slide (i, order) {
+      this.items[i].$emit('slideToItem', this.items[i], order)
+      this.items.forEach((item, idx) => {
+        if (i !== idx) {
+          item.$emit('slideToItem', this.items[i], order)
+        }
+      })
+      this.transitioning = true
+      setTimeout(() => this.transitioning = false, 600)
+    }
+  }
+
+}
+</script>
+
+<style scoped>
+  .carousel-inner, .carousel-item {
+    height: inherit;
+  }
+</style>
diff --git a/src/components/carousel/CCarouselItem.vue b/src/components/carousel/CCarouselItem.vue
new file mode 100644
index 00000000..b532a25a
--- /dev/null
+++ b/src/components/carousel/CCarouselItem.vue
@@ -0,0 +1,81 @@
+<template>
+  <div :class="itemClasses">
+    <CImg
+      v-if="image" 
+      v-bind="computedImage"
+      class="d-block w-100 h-100 img-fluid"
+    />
+    <slot>
+      <div 
+        v-if="captionHeader || captionText"
+        class="carousel-caption"
+      >
+        <h3>{{captionHeader}}</h3>
+        <p>{{captionText}}</p>
+      </div>
+    </slot>
+  </div>
+</template>
+
+<script>
+import CImg from '../image/CImg'
+export default {
+  name: 'CCarouselItem',
+  components: {
+    CImg
+  },
+  props: {
+    image: [String, Object],
+    captionHeader: String,
+    captionText: String,
+    active: Boolean
+  },
+  data () {
+    return {
+      activated: false,
+      transitioning: false,
+      order: null
+    }
+  },
+  mounted () {
+    this.$on('setItem', this.setItem)
+    this.$on('slideToItem', this.slideToItem)
+  },
+  computed: {
+    direction () {
+      return this.order === 'next' ? 'left' : 'right'
+    },
+    itemClasses () {
+      return [
+        'carousel-item',
+        {
+          [`carousel-item-${this.order}`]: this.order && !this.activated,
+          [`carousel-item-${this.direction}`]: this.transitioning,
+          'active': this.activated
+        }
+      ]
+    },
+    computedImage () {
+      return typeof this.image === 'string' ? { src: this.image } : this.image
+    }
+  },
+  methods: {
+    setItem (item) {
+      this.activated = this._uid === item._uid
+    },
+    slideToItem (item, order) {
+      if (this._uid === item._uid || this.activated) {
+        this.order = order
+        setTimeout(() => {
+          this.transitioning = true
+        }, 0)
+        setTimeout(() => {
+          this.transitioning = false
+          this.order = null
+          this.setItem(item)
+        }, 600)
+      }
+    }
+  }
+}
+</script>
diff --git a/src/components/carousel/index.js b/src/components/carousel/index.js
new file mode 100644
index 00000000..38039ae3
--- /dev/null
+++ b/src/components/carousel/index.js
@@ -0,0 +1,7 @@
+import CCarousel from './CCarousel'
+import CCarouselItem from './CCarouselItem'
+
+export {
+  CCarousel,
+  CCarouselItem
+}
diff --git a/src/components/carousel/test/CCarousel.spec.js b/src/components/carousel/test/CCarousel.spec.js
new file mode 100644
index 00000000..62d8dd30
--- /dev/null
+++ b/src/components/carousel/test/CCarousel.spec.js
@@ -0,0 +1,98 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCarousel'
+import CCarouselItem from '../CCarouselItem'
+
+// const props = Object.assign({}, CCarouselItem.props, { active: { default: true}})
+// const item = Object.assign({}, CCarouselItem, { props })
+
+const ComponentName = 'CCarousel'
+const defaultWrapper = mount(Component)
+
+const createWrapper = () => {
+  return mount(Component, {
+    propsData: {
+      interval: 3000,
+      animate: true,
+      indicators: true,
+      arrows: true,
+      indicatorClasses: 'carousel-indicators additional-class',
+      height: '200'
+    },
+    slots: {
+      default: ['<CCarouselItem :active="true"/>', CCarouselItem, CCarouselItem]
+    },
+    stubs: {
+      CCarouselItem
+    }
+  })
+}
+
+const customWrapper = createWrapper()
+const customWrapper2 = createWrapper()
+
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('arrows are setting active item correctly', (done) => {
+    const nextButton = customWrapper.find('.carousel-control-next')
+    const prevButton = customWrapper.find('.carousel-control-prev')
+    const nextArrowClick = () => nextButton.trigger('click')
+    const prevArrowClick = () => prevButton.trigger('click')
+    const active = () => customWrapper.vm.active
+
+    prevArrowClick()
+    expect(active()).toBe(2)
+    nextArrowClick()
+    
+    prevArrowClick()
+
+    setTimeout(() => {
+      expect(customWrapper.vm.activated).toBe(2) 
+      done()
+    }, 700)
+  })
+  it('correctly sets transition', () => {
+    const nextButton = customWrapper.find('.carousel-control-next')
+    const nextArrowClick = () => nextButton.trigger('click')
+
+    jest.useFakeTimers()
+    customWrapper.setData({ transitioning: false })
+
+    nextArrowClick()
+    expect(customWrapper.vm.transitioning).toBe(true)
+  
+    setTimeout(() => {
+      expect(customWrapper.vm.transitioning).toBe(false)
+    }, 700)
+    jest.runOnlyPendingTimers()
+ 
+  })
+
+  it('switches active item automatically', () => {
+    const previousActive = customWrapper.vm.active
+    jest.useFakeTimers()  
+    customWrapper.setData({ transitioning: false })
+    setTimeout(() => expect(customWrapper.vm.active).not.toBe(previousActive), 5000)  
+    jest.runOnlyPendingTimers()  
+  })
+  it('indicators are setting active item correctly', () => {
+    expect(customWrapper2.vm.active).toBe(0)
+    customWrapper2.findAll('li').at(0).trigger('click')
+    expect(customWrapper2.vm.active).toBe(0)
+
+    customWrapper2.findAll('li').at(1).trigger('click')
+    expect(customWrapper2.vm.active).toBe(1)
+  })
+  it('destroys instance correctly', () => {
+    customWrapper.destroy()
+    expect(customWrapper.currentInterval).not.toBeTruthy()
+  })
+})
diff --git a/src/components/carousel/test/CCarouselItem.spec.js b/src/components/carousel/test/CCarouselItem.spec.js
new file mode 100644
index 00000000..2ce5a1bb
--- /dev/null
+++ b/src/components/carousel/test/CCarouselItem.spec.js
@@ -0,0 +1,32 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCarouselItem'
+
+const ComponentName = 'CCarouselItem'
+const wrapper = mount(Component, {
+  propsData: {
+    image: { src: '../someImagePath' }
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    image: '../someImagePath',
+    captionHeader: 'header',
+    captionFooter: 'footer'
+  },
+  slots: {
+    default: 'CCarouselItem'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/carousel/test/__snapshots__/CCarousel.spec.js.snap b/src/components/carousel/test/__snapshots__/CCarousel.spec.js.snap
new file mode 100644
index 00000000..ca92307a
--- /dev/null
+++ b/src/components/carousel/test/__snapshots__/CCarousel.spec.js.snap
@@ -0,0 +1,80 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCarousel renders correctly 1`] = `
+<div
+  class="carousel slide"
+  style="height: auto;"
+>
+  <!---->
+   
+  <div
+    class="carousel-inner"
+  />
+   
+  <!---->
+</div>
+`;
+
+exports[`CCarousel renders correctly 2`] = `
+<div
+  class="carousel slide"
+>
+  <ol
+    class="carousel-indicators additional-class"
+  >
+    <li
+      class="active"
+    />
+    <li
+      class=""
+    />
+    <li
+      class=""
+    />
+  </ol>
+   
+  <div
+    class="carousel-inner"
+  >
+    <div
+      class="carousel-item active"
+    >
+      <!---->
+       
+      <!---->
+    </div>
+    <div
+      class="carousel-item"
+    >
+      <!---->
+       
+      <!---->
+    </div>
+    <div
+      class="carousel-item"
+    >
+      <!---->
+       
+      <!---->
+    </div>
+  </div>
+   
+  <a
+    class="carousel-control-prev"
+  >
+    <span
+      aria-label="Previous"
+      class="carousel-control-prev-icon"
+    />
+  </a>
+   
+  <a
+    class="carousel-control-next"
+  >
+    <span
+      aria-label="Next"
+      class="carousel-control-next-icon"
+    />
+  </a>
+</div>
+`;
diff --git a/src/components/carousel/test/__snapshots__/CCarouselItem.spec.js.snap b/src/components/carousel/test/__snapshots__/CCarouselItem.spec.js.snap
new file mode 100644
index 00000000..3cad2a6d
--- /dev/null
+++ b/src/components/carousel/test/__snapshots__/CCarouselItem.spec.js.snap
@@ -0,0 +1,27 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCarouselItem renders correctly 1`] = `
+<div
+  class="carousel-item"
+>
+  <img
+    class="d-block w-100 h-100 img-fluid"
+    src="../someImagePath"
+  />
+   
+  <!---->
+</div>
+`;
+
+exports[`CCarouselItem renders correctly 2`] = `
+<div
+  captionfooter="footer"
+  class="carousel-item"
+>
+  <img
+    class="d-block w-100 h-100 img-fluid"
+    src="../someImagePath"
+  />
+   CCarouselItem
+</div>
+`;
diff --git a/src/components/collapse/CCollapse.vue b/src/components/collapse/CCollapse.vue
new file mode 100644
index 00000000..b2d6ee55
--- /dev/null
+++ b/src/components/collapse/CCollapse.vue
@@ -0,0 +1,102 @@
+<template>
+  <div :class="{ 'navbar-collapse': this.navbar }">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+const props = {
+  duration: {
+    type: [Number, Object],
+    default: 400
+  },
+  transition: {
+    type: String,
+    default: 'ease-in-out'
+  },
+  show: Boolean,
+  navbar: Boolean
+}
+
+export default {
+  name: 'CCollapse',
+  props,
+  data () {
+    return {
+      collapsing: false,
+      heightWatcher: null,
+      visible: this.show,
+      el: null
+    }
+  },
+  watch: {
+    show (val) {
+      this.visible = val
+    },
+    visible (val) {
+      if (this.toggleTime) {
+        this.collapseController(val)
+      } else {
+        this.reset()
+      }
+    }
+  },
+  mounted () {
+    this.$el.style.display = this.visible ?  '' : 'none'
+  },
+  beforeDestroy () {
+    clearTimeout(this.heightWatcher)
+  },
+  computed: {
+    toggleTime () {
+      return (this.visible ? this.duration.show : this.duration.hide) || this.duration
+    }
+  },
+  methods: {
+    collapseController (val) {
+      if (this.collapsing === false) {
+        val ? this.toggle(true) : this.toggle(false)
+        this.setFinishTimer(this.toggleTime)
+      } else {
+        this.setTransition()
+        this.turn()
+        const height = Number(this.collapsing.slice(0,-2))
+        const current = this.$el.offsetHeight
+        const time = (val ? height - current : current) / height
+        this.setFinishTimer(this.toggleTime * time)
+      }
+    },
+    turn () {
+      if (this.visible) {
+        this.$el.style.height = this.collapsing
+      } else {
+        this.$el.style.height = 0
+      }
+    },
+    toggle (val) {
+      this.$el.style.display = ''
+      this.collapsing = this.$el.scrollHeight + 'px'
+      this.$el.style.height = val ? 0 : this.$el.scrollHeight + 'px'
+      this.$el.style.overflow = 'hidden'
+      this.setTransition()
+      const self = this
+      setTimeout(() => { self.$el.style.height = val ? this.collapsing : 0 }, 0)
+    },
+    setTransition () {
+      this.$el.style.transition = `all ${this.toggleTime}ms ${this.transition}`
+    },
+    setFinishTimer (duration) {
+      clearTimeout(this.heightWatcher)
+      this.heightWatcher = setTimeout(() => this.reset(), duration)
+    },
+    reset () {
+      this.collapsing = false
+      this.$el.style.display = this.visible ? '' : 'none'
+      this.$el.style.height = ''
+      this.$el.style.overflow = ''
+      this.$el.style.transition = ''
+      this.$emit('finish', this.visible)
+    }
+  }
+}
+</script>
diff --git a/src/components/collapse/index.js b/src/components/collapse/index.js
new file mode 100644
index 00000000..8d18bfb3
--- /dev/null
+++ b/src/components/collapse/index.js
@@ -0,0 +1,5 @@
+import CCollapse from './CCollapse'
+
+export {
+  CCollapse
+}
diff --git a/src/components/collapse/test/CCollapse.spec.js b/src/components/collapse/test/CCollapse.spec.js
new file mode 100644
index 00000000..ed2dae18
--- /dev/null
+++ b/src/components/collapse/test/CCollapse.spec.js
@@ -0,0 +1,81 @@
+import { mount } from '@vue/test-utils'
+import CCollapse from '../CCollapse'
+import Vue from 'vue'
+
+const ComponentName = 'CCollapse'
+const defaultWrapper = mount(CCollapse)
+const customWrapper = mount(CCollapse, {
+  propsData: {
+    duration: 500,
+    show: false,
+    navbar: true,
+    toggler: 'some_id'
+  },
+  slots: {
+    default: 'CCollapse content'
+  }
+})
+
+const togglerWrapper = mount(CCollapse, {
+  attachToDocument: true,
+  propsData: {
+    duration: 0,
+    show: true,
+    navbar: true
+  },
+  slots: {
+    default: 'Collapse content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CCollapse.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('changes state correctly', (done) => {
+    defaultWrapper.setProps({ show: true })
+    expect(defaultWrapper.vm.visible).toBe(true)
+    
+    setTimeout(() => defaultWrapper.setProps({ show: false }), 500)
+
+    setTimeout(() => {
+      expect(defaultWrapper.vm.collapsing).toBe(false)
+      done()
+    }, 1000)
+  })
+  it('changes state during collapsing correctly', () => {
+    jest.useFakeTimers()
+    customWrapper.setProps({ show: true })
+
+    //probably have to be in one place, TODO: test second click in time space
+    setTimeout(() => {
+      customWrapper.setProps({ show: false })
+      customWrapper.setProps({ show: true })
+    }, 100)
+
+    setTimeout(() => {
+      expect(customWrapper.vm.collapsing).toBe(false)
+    }, 700)
+    jest.runAllTimers()
+  })
+  it('destroy with no errors', () => {
+    try {
+      customWrapper.destroy()
+    } catch (e) {
+      const errors = e
+    }
+    expect(typeof errors).toBe('undefined')
+  })
+  it('do not set timer, but reset collapse when duration is set to 0', () => {
+    const spy = jest.spyOn(togglerWrapper.vm, 'setFinishTimer')
+    togglerWrapper.setProps({show: false})
+    expect(spy).not.toBeCalled()
+    expect(togglerWrapper.emitted().finish).toBeTruthy()
+  })
+})
diff --git a/src/components/collapse/test/__snapshots__/CCollapse.spec.js.snap b/src/components/collapse/test/__snapshots__/CCollapse.spec.js.snap
new file mode 100644
index 00000000..d3654840
--- /dev/null
+++ b/src/components/collapse/test/__snapshots__/CCollapse.spec.js.snap
@@ -0,0 +1,18 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCollapse renders correctly 1`] = `
+<div
+  class=""
+  style="display: none;"
+/>
+`;
+
+exports[`CCollapse renders correctly 2`] = `
+<div
+  class="navbar-collapse"
+  style="display: none;"
+  toggler="some_id"
+>
+  CCollapse content
+</div>
+`;
diff --git a/src/components/dropdown/CDropdown.vue b/src/components/dropdown/CDropdown.vue
new file mode 100644
index 00000000..81b07501
--- /dev/null
+++ b/src/components/dropdown/CDropdown.vue
@@ -0,0 +1,238 @@
+<template>
+  <component 
+    :is="inNav ? 'li' : 'div'" 
+    :class="computedDropdownClasses"
+    v-c-clickaway="visible ? hide : null"
+    @click="checkClick($event)"
+  >
+    <slot name="toggler">
+      <component
+        :is="togglerTag"
+        v-on="{ click: splittedToggler ? splitButtonClick : toggle }"
+        :class="computedTogglerClasses"
+        v-bind="splittedToggler ? '' : togglerAttrs"
+      >
+        <slot name="toggler-content">{{togglerText}}</slot>
+      </component>
+      <button
+        v-if="splittedToggler"
+        @click="toggle"
+        class="dropdown-toggle dropdown-toggle-split"
+        :class="computedTogglerClasses"
+        v-bind="togglerAttrs"
+      />
+    </slot>
+    <div 
+      ref="menu"
+      :class="computedMenuClasses"
+    >
+      <slot></slot>
+    </div>
+  </component>
+</template>
+
+<script>
+import CLink from '../link/CLink'
+import { createPopper } from '@popperjs/core'
+import { CClickaway } from '../../directives'
+
+export default {
+  name: 'CDropdown',
+  directives: {
+    CClickaway
+  },
+  components: {
+    CLink
+  },
+  props: {
+    togglerText: {
+      type: String,
+      default: 'Dropdown'
+    },
+    show: Boolean,
+    disabled: Boolean,
+    addMenuClasses: [String, Array, Object],
+    addTogglerClasses: [String, Array, Object],
+    inNav: Boolean,
+    caret: {
+      type: Boolean,
+      default: true
+    },
+    color: String,
+    size: {
+      type: String,
+      validator: val => ['', 'sm', 'lg'].includes(val)
+    },
+    split: Boolean,
+    placement: {
+      type: String,
+      validator: position => {
+        return [
+          '', 'top-end', 'top', 'top-start',
+          'bottom-end', 'bottom', 'bottom-start',
+          'right-start', 'right', 'right-end',
+          'left-start', 'left', 'left-end'
+        ].includes(position)
+      },
+      default: 'bottom-start'
+    },
+    offset: {
+      type: Array,
+      default: () => [0, 0]
+    },
+    flip: {
+      type: Boolean,
+      default: true
+    },
+    customPopperOptions: Object
+  },
+  data () {
+    return {
+      visible: this.show
+    }
+  },
+  watch: {
+    show (val) {
+      this.visible = val
+    },
+    visible: {
+      immediate: true,
+      handler (val) {
+        val ? this.createPopper() : this.removePopper()
+        this.$emit('update:show', val)
+      }
+    }
+  },
+  mounted () {
+    this.$on('dropdown-close', this.hide)
+  },
+  methods: {
+    checkClick (e) {
+      if (
+        this.$scopedSlots.toggler && 
+        this.$el.firstElementChild.contains(e.target)
+      ) {
+        this.toggle(e)
+      }
+    },
+
+    hide () {
+      this.visible = false
+    },
+
+    splitButtonClick () {
+      this.visible = false
+      this.$emit('click')
+    },
+
+    toggle (e) {
+      e.preventDefault()
+      this.visible = !this.visible
+    },
+
+    removePopper () {
+      if (this._popper) {
+        this._popper.destroy()
+      }
+      this._popper = null
+    },
+
+    createPopper () {
+      this.removePopper()
+      if (this.disabled) {
+        this.visible = false
+        return
+      }
+      this.$nextTick(() => {
+
+        this._popper = createPopper(
+          //not first child because of split buttons
+          this.$el.children[this.$el.children.length - 2], 
+          this.$refs.menu, 
+          this.customPopperOptions || this.defaultPopperOptions
+        )
+      })
+      
+    }
+  },
+  computed: {
+    defaultPopperOptions () {
+      return {
+        placement: this.placement,
+        modifiers: [
+          {
+            name: 'offset',
+            options: {
+              offset: this.offset
+            }
+          },
+          {
+            name: 'flip',
+            enabled: this.flip
+          },
+          {
+            name: 'preventOverflow',
+            options: {
+              padding: 10
+            }
+          }
+        ]
+      }
+    },
+
+    carretClass () {
+      return this.placement.includes('top') ? 'dropup' : 
+               this.placement.includes('right') ? 'dropright' :
+                 this.placement.includes('left') ? 'dropleft' : 'dropdown'
+    },
+
+    computedDropdownClasses () {
+      return [
+        this.carretClass,
+        {
+          'show': this.visible,
+          'nav-item': this.inNav,
+          'btn-group': this.splittedToggler
+        }
+      ]
+    },
+
+    togglerTag () {
+      return this.inNav ? CLink : 'button'
+    },
+
+    splittedToggler () {
+      return this.split && !this.inNav
+    },
+
+    computedTogglerClasses () {
+      return [
+        this.addTogglerClasses,
+        this.inNav ? 'nav-link' : 'btn',
+        {
+          'dropdown-toggle': this.caret && !this.split,
+          [`btn-${this.size}`]: this.size && !this.inNav,
+          'disabled' : this.disabled,
+          [`${ this.inNav ? 'bg' : 'btn'}-${ this.color }`]: this.color
+        }
+      ]
+    },
+
+    togglerAttrs () {
+      return {
+        'type': this.inNav ? null : 'button',
+        'aria-expanded': this.visible ? 'true' : 'false',
+        'aria-haspopup': 'true'
+      }
+    },
+
+    computedMenuClasses () {
+      return [
+        this.addMenuClasses,
+        'dropdown-menu',
+        { 'show': this.visible }
+      ]
+    }
+  }
+}
+</script>
diff --git a/src/components/dropdown/CDropdownDivider.vue b/src/components/dropdown/CDropdownDivider.vue
new file mode 100644
index 00000000..62d4188d
--- /dev/null
+++ b/src/components/dropdown/CDropdownDivider.vue
@@ -0,0 +1,23 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CDropdownDivider',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+  render (h, { props, data }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'dropdown-divider',
+        attrs: { role: 'separator' }
+      })
+    )
+  }
+}
+</script>
diff --git a/src/components/dropdown/CDropdownHeader.vue b/src/components/dropdown/CDropdownHeader.vue
new file mode 100644
index 00000000..de98db63
--- /dev/null
+++ b/src/components/dropdown/CDropdownHeader.vue
@@ -0,0 +1,24 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  functional: true,
+  name: 'CDropdownHeader',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    },
+    color: String
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'dropdown-header',
+        class: { [`bg-${props.color}`]: props.color }
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/dropdown/CDropdownItem.vue b/src/components/dropdown/CDropdownItem.vue
new file mode 100644
index 00000000..91bac4b5
--- /dev/null
+++ b/src/components/dropdown/CDropdownItem.vue
@@ -0,0 +1,36 @@
+<script>
+import CLink, { propsFactory } from '../link/CLink'
+
+export default {
+  name: 'CDropdownItem',
+  props: propsFactory(),
+  render (h) {
+    const data = {
+      props: this._props,
+      staticClass: 'dropdown-item',
+      attrs: { role: 'menuitem' },
+      on: {
+        //listeners added, due to component was previously functional for compatibility
+        ...this.$listeners,
+        click: (e) => {
+          this.$parent.$emit('dropdown-close')
+          this.$emit('click', e)
+        }
+      }
+    }
+    if (this.to) {
+      data.nativeOn = {
+        click: (e) => {
+          this.$parent.$emit('dropdown-close')
+          this.$emit('click', e)
+        }
+      }
+    }
+    return h(
+      CLink,
+      data,
+      this.$slots.default
+    )
+  }
+}
+</script>
diff --git a/src/components/dropdown/index.js b/src/components/dropdown/index.js
new file mode 100644
index 00000000..fbb4cce9
--- /dev/null
+++ b/src/components/dropdown/index.js
@@ -0,0 +1,12 @@
+import CDropdown from './CDropdown'
+import CDropdownHeader from './CDropdownHeader'
+import CDropdownDivider from './CDropdownDivider'
+import CDropdownItem from './CDropdownItem'
+
+
+export {
+  CDropdown,
+  CDropdownHeader,
+  CDropdownDivider,
+  CDropdownItem
+}
diff --git a/src/components/dropdown/tests/CDropdown.spec.js b/src/components/dropdown/tests/CDropdown.spec.js
new file mode 100644
index 00000000..57b74bfd
--- /dev/null
+++ b/src/components/dropdown/tests/CDropdown.spec.js
@@ -0,0 +1,158 @@
+import { mount, createLocalVue } from '@vue/test-utils'
+import {
+  CDropdown,
+  CDropdownItem,
+  CDropdownHeader,
+  CDropdownDivider
+} from '../index'
+import VueRouter from 'vue-router'
+
+const ComponentName = 'CDropdown'
+
+const localVue = new createLocalVue()
+localVue.use(VueRouter)
+const router = new VueRouter()
+
+const dropdownProps = {
+  togglerText: 'Dropdown button',
+  show: true,
+  addMenuClasses: 'additional-menu-class',
+  addTogglerClasses: 'additional-toggler-class',
+  inNav: false,
+  caret: false,
+  color: 'success',
+  size: 'lg',
+  split: true,
+  offset: [20, 0],
+  placement: 'right-end',
+  flip: false
+}
+
+const App = localVue.extend({
+  router,
+  components: {
+    CDropdown,
+    CDropdownItem,
+    CDropdownHeader,
+    CDropdownDivider
+  },
+  render (h) {
+    return h('CDropdown', { props: dropdownProps }, [
+      h('CDropdownHeader', ['header']),
+      h('CDropdownItem', { props: { to: '/buttons' } }, ['Router-link']),
+      h('CDropdownDivider'),
+      //router link item
+      h('CDropdownItem', { props: { to: '/dashboard' } }, ['Router-link'])
+    ])
+  }
+})
+
+const generateAppWrapper =  () => mount(App, { localVue })
+
+
+const generateWrapper = () => mount(CDropdown, {
+  attachToDocument: true,
+  propsData: dropdownProps,
+  slots: {
+    default: [
+      CDropdownHeader,
+      CDropdownItem,
+      CDropdownDivider
+    ]
+  }
+})
+
+const generateNavWrapper =  () => mount(CDropdown, {
+  propsData: {
+    addMenuClasses: 'additional-menu-class',
+    addTogglerClasses: 'additional-toggler-class',
+    inNav: true,
+    caret: false,
+    color: 'success',
+    placement: 'left',
+    customPopperOptions: {}
+  },
+  slots: {
+    default: 'CDropdown subcomponents',
+    toggler: '<div class="toggler">Dropdown button</div>'
+  }
+})
+
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CDropdown.name).toMatch(ComponentName)
+  })
+  it('renders basic wrapper correctly', () => {
+    expect(mount(CDropdown).element).toMatchSnapshot()
+  })
+  it('renders custom wrapper correctly', () => {
+    expect(generateWrapper().element).toMatchSnapshot()
+  })
+  it('renders dropdown with router links correctly', () => {
+    expect(generateWrapper().element).toMatchSnapshot()
+  })
+  it('renders correctly inNav', () => {
+    expect(generateNavWrapper().element).toMatchSnapshot()
+  })
+  it('toggles when show prop is changed', () => {
+    const wrapper = generateWrapper()
+    expect(wrapper.vm.visible).toBe(true)
+    wrapper.setProps({ show: false })
+    expect(wrapper.vm.visible).toBe(false)
+  })
+  it('hide when dropdown item is clicked', () => {
+    const wrapper = generateWrapper()
+    expect(wrapper.vm.visible).toBe(true)
+    wrapper.vm.$children[0].$el.click()
+    expect(wrapper.vm.visible).toBe(false)
+  })
+  it('hide when dropdown item - router link is clicked', () => {
+    const wrapper = generateAppWrapper()
+    const isVisible = () => wrapper.vm.$children[0].visible
+    expect(isVisible()).toBe(true)
+    wrapper.findAll('.dropdown-item').at(1).trigger('click')
+    expect(isVisible()).toBe(false)
+  })
+  it('close, but does not open on click when dropdown is disabled', () => {
+    const customWrapper = generateWrapper()
+    const toggle = () => {
+      customWrapper.find('.dropdown-toggle-split').trigger('click')
+    }
+
+    expect(customWrapper.vm.visible).toBe(true)
+    customWrapper.setProps({
+      disabled: true
+    })
+    toggle()
+    expect(customWrapper.vm.visible).toBe(false)
+    toggle()
+    expect(customWrapper.vm.visible).toBe(false)
+  })
+  it('emits click on split button click', () => {
+    const wrapper = generateWrapper()
+    wrapper.vm.$el.getElementsByTagName('button')[0].click()
+    expect(wrapper.emitted()['click']).toBeTruthy()
+  })
+  it('Closes dropdown on outside click', () => {
+    const customWrapper = generateWrapper()
+
+    expect(customWrapper.vm.visible).toBe(true)
+    customWrapper.vm.$el.getElementsByClassName('dropdown-menu')[0].click()
+    expect(customWrapper.vm.visible).toBe(true)
+    document.body.click()
+    expect(customWrapper.vm.visible).toBe(false)
+  })
+  it('opens then toggler is passed by slot', () => {
+    const navWrapper = generateNavWrapper()
+    const toggle = () => {
+      navWrapper.find('.toggler').trigger('click')
+    }
+
+    expect(navWrapper.vm.visible).toBe(false)
+    toggle()
+    expect(navWrapper.vm.visible).toBe(true)
+    toggle()
+    expect(navWrapper.vm.visible).toBe(false)
+  })
+})
diff --git a/src/components/dropdown/tests/__snapshots__/CDropdown.spec.js.snap b/src/components/dropdown/tests/__snapshots__/CDropdown.spec.js.snap
new file mode 100644
index 00000000..31886e62
--- /dev/null
+++ b/src/components/dropdown/tests/__snapshots__/CDropdown.spec.js.snap
@@ -0,0 +1,114 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CDropdown renders basic wrapper correctly 1`] = `
+<div
+  class="dropdown"
+>
+  <button
+    aria-expanded="false"
+    aria-haspopup="true"
+    class="btn dropdown-toggle"
+    type="button"
+  >
+    Dropdown
+  </button>
+   
+  <!---->
+   
+  <div
+    class="dropdown-menu"
+  />
+</div>
+`;
+
+exports[`CDropdown renders correctly inNav 1`] = `
+<li
+  class="dropleft nav-item"
+>
+  <div
+    class="toggler"
+  >
+    Dropdown button
+  </div>
+   
+  <div
+    class="additional-menu-class dropdown-menu"
+  >
+    CDropdown subcomponents
+  </div>
+</li>
+`;
+
+exports[`CDropdown renders custom wrapper correctly 1`] = `
+<div
+  class="dropright show btn-group"
+>
+  <button
+    class="additional-toggler-class btn btn-lg btn-success"
+  >
+    Dropdown button
+  </button>
+   
+  <button
+    aria-expanded="true"
+    aria-haspopup="true"
+    class="dropdown-toggle dropdown-toggle-split additional-toggler-class btn btn-lg btn-success"
+    type="button"
+  />
+   
+  <div
+    class="additional-menu-class dropdown-menu show"
+  >
+    <div
+      class="dropdown-header"
+    />
+    <a
+      class="dropdown-item"
+      href="#"
+      role="menuitem"
+      target="_self"
+    />
+    <div
+      class="dropdown-divider"
+      role="separator"
+    />
+  </div>
+</div>
+`;
+
+exports[`CDropdown renders dropdown with router links correctly 1`] = `
+<div
+  class="dropright show btn-group"
+>
+  <button
+    class="additional-toggler-class btn btn-lg btn-success"
+  >
+    Dropdown button
+  </button>
+   
+  <button
+    aria-expanded="true"
+    aria-haspopup="true"
+    class="dropdown-toggle dropdown-toggle-split additional-toggler-class btn btn-lg btn-success"
+    type="button"
+  />
+   
+  <div
+    class="additional-menu-class dropdown-menu show"
+  >
+    <div
+      class="dropdown-header"
+    />
+    <a
+      class="dropdown-item"
+      href="#"
+      role="menuitem"
+      target="_self"
+    />
+    <div
+      class="dropdown-divider"
+      role="separator"
+    />
+  </div>
+</div>
+`;
diff --git a/src/components/element-cover/CElementCover.vue b/src/components/element-cover/CElementCover.vue
new file mode 100644
index 00000000..1cc180e9
--- /dev/null
+++ b/src/components/element-cover/CElementCover.vue
@@ -0,0 +1,84 @@
+<template>
+  <div :style="outerContainerStyles">
+    <div v-if="center" :style="centeringStyles">
+      <slot>
+        <CSpinner grow size="lg" color="primary"/>
+      </slot>
+    </div>
+    <slot v-else>
+      <CSpinner size="lg" color="primary"/>
+    </slot>
+  </div>
+</template>
+
+<script>
+import CSpinner from '../spinner/CSpinner'
+
+export default {
+  name: 'CElementCover',
+  props: {
+    boundaries: Array,
+    center: {
+      type: Boolean,
+      default: true
+    },
+    opacity: {
+      type: Number,
+      default: 0.4
+    }
+  },
+  components: {
+    CSpinner
+  },
+  data () {
+    return {
+      containerCoords: {
+        top: 0,
+        bottom: 0,
+        left: 0,
+        right: 0
+      },
+      parentCoords: null
+    }
+  },
+  mounted () {
+    if (this.boundaries) {
+      this.setOffsets()
+    }
+  },
+  computed: {
+    outerContainerStyles () {
+      return {
+        ...this.containerCoords,
+        position: 'absolute',
+        'background-color': `rgb(255,255,255,${this.opacity})`
+      }
+    },
+    centeringStyles () {
+      return {
+        position: 'absolute',
+        top: '50%',
+        left: '50%',
+        transform: 'translateX(-50%) translateY(-50%)'
+      }
+    }
+  },
+  methods: {
+    setOffsets () {
+      const parent = this.$el.parentElement
+      this.parentCoords = parent.getBoundingClientRect()
+      this.boundaries.forEach(({sides, query}) => {
+        const element = parent.querySelector(query)
+        if (!element || !sides) {
+          return
+        }
+        const coords = element.getBoundingClientRect()
+        sides.forEach(side => {
+          const sideMargin = Math.abs(coords[side] - this.parentCoords[side])
+          this.containerCoords[side] = sideMargin + 'px'
+        })
+      })
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/element-cover/index.js b/src/components/element-cover/index.js
new file mode 100644
index 00000000..f75b4178
--- /dev/null
+++ b/src/components/element-cover/index.js
@@ -0,0 +1,5 @@
+import CElementCover from './CElementCover'
+
+export {
+  CElementCover
+}
diff --git a/src/components/element-cover/tests/CElementCover.spec.js b/src/components/element-cover/tests/CElementCover.spec.js
new file mode 100644
index 00000000..843f2eb0
--- /dev/null
+++ b/src/components/element-cover/tests/CElementCover.spec.js
@@ -0,0 +1,50 @@
+// cannot do integration test without browser, due to 
+// .getBoundingClientRect() always returning 0
+import { mount, createLocalVue } from '@vue/test-utils'
+import Component from '../CElementCover'
+
+const localVue = new createLocalVue()
+const App = localVue.extend({
+  components: {
+    CElementCover: Component
+  },
+  render(h) {
+    return h('div', {}, [
+      h('div', { attrs: { class: 'first' }}),
+      h('CElementCover', {
+        props: {
+          boundaries: [
+            {
+              sides: ['top', 'left'],
+              query: '.first'
+            },
+            {
+              sides: ['bottom'],
+              query: 'non-existing'
+            },
+            {
+              sides: ['bottom']
+            }
+          ]
+        }
+      })
+    ])
+  }
+})
+
+const customWrapper = mount(App, { localVue })
+const defaultWrapper = mount(Component)
+
+const ComponentName = 'CElementCover'
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toBe(ComponentName)
+  })
+  it('renders correctly with default spinner', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  }) 
+  it('renders correctly with custom content', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/element-cover/tests/__snapshots__/CElementCover.spec.js.snap b/src/components/element-cover/tests/__snapshots__/CElementCover.spec.js.snap
new file mode 100644
index 00000000..6419f1a1
--- /dev/null
+++ b/src/components/element-cover/tests/__snapshots__/CElementCover.spec.js.snap
@@ -0,0 +1,40 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CElementCover renders correctly with custom content 1`] = `
+<div>
+  <div
+    class="first"
+  />
+  <div
+    style="top: 0px; bottom: 0px; left: 0px; right: 0px; position: absolute;"
+  >
+    <div
+      style="position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);"
+    >
+      <div
+        aria-hidden="false"
+        aria-label="Loading"
+        class="spinner-grow spinner-grow-lg text-primary"
+        role="status"
+      />
+    </div>
+  </div>
+</div>
+`;
+
+exports[`CElementCover renders correctly with default spinner 1`] = `
+<div
+  style="top: 0px; bottom: 0px; left: 0px; right: 0px; position: absolute;"
+>
+  <div
+    style="position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);"
+  >
+    <div
+      aria-hidden="false"
+      aria-label="Loading"
+      class="spinner-grow spinner-grow-lg text-primary"
+      role="status"
+    />
+  </div>
+</div>
+`;
diff --git a/src/components/embed/CEmbed.vue b/src/components/embed/CEmbed.vue
new file mode 100644
index 00000000..2a9607a7
--- /dev/null
+++ b/src/components/embed/CEmbed.vue
@@ -0,0 +1,40 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export const props = {
+  type: {
+    type: String,
+    default: 'iframe',
+    validator: type => ['iframe', 'embed', 'video', 'object', 'img'].includes(type)
+  },
+  ratio: {
+    type: String,
+    default: '16by9',
+    validator: ratio => ['21by9', '16by9', '4by3', '1by1'].includes(ratio)
+  },
+  tag: {
+    type: String,
+    default: 'div'
+  }
+}
+export default {
+  functional: true,
+  name: 'CEmbed',
+  props,
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      {
+        ref: data.ref,
+        staticClass: 'embed-responsive',
+        class: `embed-responsive-${props.ratio}`
+      },
+      [h(
+        props.type,
+        mergeData(data, { ref: '', staticClass: 'embed-responsive-item' }),
+        children
+      )]
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/embed/index.js b/src/components/embed/index.js
new file mode 100644
index 00000000..81c07610
--- /dev/null
+++ b/src/components/embed/index.js
@@ -0,0 +1,5 @@
+import CEmbed from './CEmbed'
+
+export {
+  CEmbed
+}
diff --git a/src/components/embed/tests/CEmbed.spec.js b/src/components/embed/tests/CEmbed.spec.js
new file mode 100644
index 00000000..ef44d1f9
--- /dev/null
+++ b/src/components/embed/tests/CEmbed.spec.js
@@ -0,0 +1,26 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CEmbed'
+
+const ComponentName = 'CEmbed'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    type: 'embed',
+    ratio: '4by3'
+  },
+  slots: {
+    default: 'CEmbed item'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/embed/tests/__snapshots__/CEmbed.spec.js.snap b/src/components/embed/tests/__snapshots__/CEmbed.spec.js.snap
new file mode 100644
index 00000000..105d3627
--- /dev/null
+++ b/src/components/embed/tests/__snapshots__/CEmbed.spec.js.snap
@@ -0,0 +1,25 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CEmbed renders correctly 1`] = `
+<div
+  class="embed-responsive embed-responsive-16by9"
+>
+  <iframe
+    class="embed-responsive-item"
+  />
+</div>
+`;
+
+exports[`CEmbed renders correctly 2`] = `
+<div
+  class="embed-responsive embed-responsive-4by3"
+>
+  <embed
+    class="embed-responsive-item"
+  >
+    <template>
+      CEmbed item
+    </template>
+  </embed>
+</div>
+`;
diff --git a/src/components/form/CForm.vue b/src/components/form/CForm.vue
new file mode 100644
index 00000000..a449306d
--- /dev/null
+++ b/src/components/form/CForm.vue
@@ -0,0 +1,24 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  name: 'CForm',
+  functional: true,
+  props: {
+    inline: Boolean,
+    wasValidated: Boolean
+  },
+  render(h, { props, data, children }) {
+    return h(
+      'form',
+      mergeData(data, {
+        class: {
+          'form-inline': props.inline,
+          'was-validated': props.wasValidated
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/form/CFormGroup.vue b/src/components/form/CFormGroup.vue
new file mode 100644
index 00000000..4d4559e6
--- /dev/null
+++ b/src/components/form/CFormGroup.vue
@@ -0,0 +1,118 @@
+<template>
+  <div role="group">
+    <template v-if="wrapperClasses">
+      <slot name="label"></slot>
+      <div :class="wrapperClasses">
+        <div
+          v-if="prepend || $slots.prepend|| $slots['prepend-content']"
+          class="input-group-prepend"
+        >
+          <slot name="prepend">
+            <span class="input-group-text">
+              <slot name="prepend-content">{{prepend}}</slot>
+            </span>
+          </slot>
+        </div>
+        <slot name="input"></slot>
+        <slot name="label-after-input"></slot>
+        <div
+          v-if="append || $slots.append || $slots['append-content']"
+          class="input-group-append"
+        >
+          <slot name="append">
+            <span class="input-group-text">
+              <slot name="append-content">{{append}}</slot>
+            </span>
+          </slot>
+        </div>
+        <slot name="valid-feedback">
+          <div
+            v-if="validFeedback"
+            :class="tooltipFeedback ? 'valid-tooltip' : 'valid-feedback'"
+            v-text="validFeedback"
+          ></div>
+        </slot>
+        <slot name="invalid-feedback">
+          <div
+            v-if="invalidFeedback"
+            :class="tooltipFeedback ? 'invalid-tooltip' : 'invalid-feedback'"
+            v-text="invalidFeedback"
+          ></div>
+        </slot>
+        <slot name="description">
+          <small
+            v-if="description"
+            class="form-text text-muted w-100"
+            v-text="description"
+          ></small>
+        </slot>
+      </div>
+    </template>
+    <template v-else>
+      <slot name="label"></slot>
+      <div
+        v-if="prepend || $slots.prepend || $slots['prepend-content']"
+        class="input-group-prepend"
+      >
+        <slot name="prepend">
+          <span class="input-group-text">
+            <slot name="prepend-content">{{prepend}}</slot>
+          </span>
+        </slot>
+      </div>
+      <slot name="input"></slot>
+      <slot name="label-after-input"></slot>
+      <div
+        v-if="append || $slots.append || $slots['append-content']"
+        class="input-group-append"
+      >
+        <slot name="append">
+          <span class="input-group-text">
+            <slot name="append-content">{{append}}</slot>
+          </span>
+        </slot>
+      </div>
+      <slot name="valid-feedback">
+        <div
+          v-if="validFeedback"
+          :class="tooltipFeedback ? 'valid-tooltip' : 'valid-feedback'"
+          v-text="validFeedback"
+        ></div>
+      </slot>
+      <slot name="invalid-feedback">
+        <div
+          v-if="invalidFeedback"
+          :class="tooltipFeedback ? 'invalid-tooltip' : 'invalid-feedback'"
+          v-text="invalidFeedback"
+        ></div>
+      </slot>
+      <slot name="description">
+        <small
+          v-if="description"
+          class="form-text text-muted w-100"
+          v-text="description"
+        ></small>
+      </slot>
+    </template>
+  </div>
+</template>
+
+<script>
+import { formGroupProps as props } from './form-props'
+export default {
+  name: 'CFormGroup',
+  inheritAttrs: false,
+  props,
+  // {
+  //   validFeedback: String,
+  //   invalidFeedback: String,
+  //   tooltipFeedback: Boolean,
+  //   description: String,
+
+  //   append: String,
+  //   prepend: String,
+
+  //   wrapperClasses: [String, Array, Object],
+  // },
+}
+</script>
diff --git a/src/components/form/CInput.vue b/src/components/form/CInput.vue
new file mode 100644
index 00000000..38874d00
--- /dev/null
+++ b/src/components/form/CInput.vue
@@ -0,0 +1,214 @@
+<template>
+  <CFormGroup
+    v-bind="{append, prepend, validFeedback, invalidFeedback,
+        tooltipFeedback, description, wrapperClasses, class: computedClasses}"
+  >
+    <template #label>
+      <slot name="label">
+        <label v-if="label" :for="safeId" :class="labelClasses">
+          {{label}}
+        </label>
+      </slot>
+    </template>
+    <template #input>
+      <input
+        v-bind="$attrs"
+        v-on="listeners"
+        :id="safeId"
+        :type="type"
+        :class="inputClasses"
+        :readonly="readonly || plaintext"
+        :value="state"
+        @input="onInput($event)"
+        @change="onChange($event)"
+      />
+    </template>
+
+    <template 
+      v-for="slot in $options.slots" 
+      #[slot]
+    >
+      <slot :name="slot"></slot>
+    </template>
+  </CFormGroup>
+</template>
+
+<script>
+import CFormGroup from './CFormGroup'
+import { inputProps as props } from './form-props'
+import * as allFormMixins from './form-mixins'
+const mixins = Object.values(allFormMixins)
+
+export default {
+  name: 'CInput',
+  slots: [
+    'prepend', 
+    'prepend-content', 
+    'append-content', 
+    'append', 
+    'label-after-input',
+    'valid-feedback', 
+    'invalid-feedback',
+    'description'
+  ],
+  inheritAttrs: false,
+  components: { CFormGroup },
+  mixins,
+  props,
+  // Html props: disabled, required, rows, cols, placeholder
+  // {
+  //   validFeedback: String,
+  //   invalidFeedback: String,
+  //   tooltipFeedback: Boolean,
+  //   description: String,
+
+  //   append: String,
+  //   prepend: String,
+
+  //   label: String,
+  //   wasValidated: Boolean,
+  //   isValid: {
+  //     type: [Boolean, Function],
+  //     default: null
+  //   },
+  //   addInputClasses: [String, Array, Object],
+  //   addLabelClasses: [String, Array, Object],
+
+  //   horizontal: [Boolean, Object],
+  //   size: {
+  //     type: String,
+  //     validator: str => ['','sm','lg'].includes(str)
+  //   },
+  //   addWrapperClasses: [String, Array, Object],
+
+  //   readonly: Boolean,
+  //   plaintext: Boolean,
+  //   value: [String, Number],
+  //   lazy: {
+  //     type: [Boolean, Number],
+  //     default: 400
+  //   },
+  //   type: {
+  //     type: String,
+  //     default: 'text'
+  //   }
+  // },
+  data () {
+    return {
+      state: this.value,
+      syncTimeout: null
+    }
+  },
+  //watchValue mixin
+  // watch: {
+  //   value (val) {
+  //     this.state = val
+  //   }
+  // },
+  computed: {
+    listeners () {
+      const { input, change, ...listeners } = this.$listeners // eslint-disable-line no-unused-vars
+      return listeners
+    }
+    // classesComputedProps mixin
+    // haveCustomSize () {
+    //   return ['sm','lg'].includes(this.size)
+    // },
+    // computedClasses () {
+    //   return [
+    //     'form-group',
+    //     {
+    //      'was-validated': this.wasValidated,
+    //      'form-row': this.isHorizontal
+    //     }
+    //   ]
+    // },
+    // labelClasses () {
+    //   return [
+    //     this.addLabelClasses,
+    //     {
+    //       'col-form-label': this.isHorizontal,
+    //       [this.horizontal.label || 'col-sm-3']: this.isHorizontal,
+    //       [`col-form-label-${this.size}`]: this.haveCustomSize,
+    //     }
+    //   ]
+    // },
+    // customSizeClass () {
+    //   if (this.haveCustomSize && !this.haveWrapper) {
+    //     return `form-control-${this.size}`
+    //   }
+    // },
+    // inputClasses () {
+    //   return [
+    //     this.inputClass || `form-control${this.plaintext ? '-plaintext' : ''}`,
+    //     this.validationClass,
+    //     this.addInputClasses,
+    //     this.customSizeClass
+    //   ]
+    // }
+
+    // validationComputedProps mixin
+    // computedIsValid () {
+    //   if (typeof this.isValid === 'function') {
+    //     return this.isValid(this.state)
+    //   }
+    //   return this.isValid
+    // },
+    // validationClass () {
+    //   if (typeof this.computedIsValid === 'boolean') {
+    //     return this.computedIsValid ? 'is-valid' : 'is-invalid'
+    //   }
+    // }
+
+    //wrapperComputedProps mixin
+    // isHorizontal () {
+    //   return Boolean(this.horizontal)
+    // },
+    // haveInputGroup () {
+    //   return Boolean(
+    //     this.tooltipFeedback || 
+    //     this.append ||
+    //     this.prepend || 
+    //     this.$slots.append || 
+    //     this.$slots.prepend || 
+    //     this.$slots['append-content'] ||
+    //     this.$slots['prepend-content']
+    //   )
+    // },
+    // haveWrapper () {
+    //   return this.haveInputGroup || Boolean(this.addWrapperClasses || this.isHorizontal)
+    // },
+    // wrapperClasses () {
+    //   if (this.haveWrapper) {
+    //     return [
+    //       this.addWrapperClasses,
+    //       {
+    //         [this.horizontal.input || 'col-sm-9'] : this.isHorizontal,
+    //         'input-group' : this.haveInputGroup,
+    //         [`input-group-${this.size}`]: this.haveCustomSize
+    //       }
+    //     ]
+    //   }
+    // }
+  },
+  methods: {
+    onInput (e) {
+      this.state = e.target.value
+      this.$emit('input', this.state, e)
+      if (this.lazy === true) {
+        return
+      }
+
+      clearTimeout(this.syncTimeout)
+      this.syncTimeout = setTimeout(() => {
+        this.$emit('update:value', this.state, e)
+      }, this.lazy !== false ? this.lazy : 0)
+    },
+    onChange (e) {
+      this.state = e.target.value
+      this.$emit('change', this.state, e)
+      this.$emit('update:value', this.state, e)
+    },
+  }
+}
+</script>
diff --git a/src/components/form/CInputCheckbox.vue b/src/components/form/CInputCheckbox.vue
new file mode 100644
index 00000000..3d1dbda7
--- /dev/null
+++ b/src/components/form/CInputCheckbox.vue
@@ -0,0 +1,130 @@
+<template>
+  <CFormGroup v-bind="{validFeedback, invalidFeedback, tooltipFeedback,
+                       description, class: computedClasses}">
+    <template #input>
+      <input
+        v-on="$listeners"
+        v-bind="$attrs"
+        :id="safeId"
+        :type="$options.type"
+        :class="inputClasses"
+        :checked="state"
+        @change="onChange($event)"
+      />
+    </template>
+
+
+    <template #label-after-input>
+      <slot name="label">
+        <label v-if="label || custom" :for="safeId" :class="labelClasses">
+          {{label}}
+        </label>
+      </slot>
+    </template>
+
+
+    <template
+      v-for="slot in ['valid-feedback', 'invalid-feedback', 'description']"
+      #[slot]
+    >
+      <slot :name="slot">
+      </slot>
+    </template>
+  </CFormGroup>
+</template>
+
+<script>
+import { sharedComputedProps } from './form-mixins'
+import { inputCheckboxProps as props } from './form-props'
+import CFormGroup from './CFormGroup'
+
+export default {
+  name: 'CInputCheckbox',
+  inheritAttrs: false,
+  components: { CFormGroup },
+  mixins: [sharedComputedProps],
+  props,
+  // {
+    // validFeedback: String,
+    // invalidFeedback: String,
+    // tooltipFeedback: Boolean,
+    // description: String,
+
+    // label: String,
+    // wasValidated: Boolean,
+    // isValid: {
+    //   type: [Boolean, Function],
+    //   default: null
+    // },
+    // addInputClasses: [String, Array, Object],
+    // addLabelClasses: [String, Array, Object],
+    
+    // checked: Boolean,
+    // custom: Boolean,
+    // inline: Boolean
+  // },
+  type: 'checkbox',
+  data () {
+    return {
+      state: undefined,
+    }
+  },
+  watch: {
+    checked: {
+      immediate: true,
+      handler (val) {
+        this.state = val
+      }
+    }
+  },
+  computed: {
+    customType () {
+      return this.$options.type === 'checkbox' ? 'checkbox' : 'radio'
+    },
+    
+    computedClasses () {
+      const controlClass = this.custom ? 'custom-control' : 'form-check'
+      return {
+        [`${controlClass}`] : true,
+        [`${controlClass}-inline`]: this.inline,
+        [`custom-${this.customType}`]: this.custom,
+        'was-validated': this.wasValidated
+      }
+
+    },
+
+    labelClasses () {
+      return [
+        this.addLabelClasses,
+        this.custom ? 'custom-control-label': 'form-check-label'
+      ]
+    },
+
+    inputClasses () {
+      return [
+        this.custom ? 'custom-control-input' : 'form-check-input',
+        this.validationClass, this.addInputClasses
+      ]
+    },
+
+    // validationComputedProps mixin
+    // computedIsValid () {
+    //   if (typeof this.isValid === 'function') {
+    //     return this.isValid(this.state)
+    //   }
+    //   return this.isValid
+    // },
+    // validationClass () {
+    //   if (typeof this.computedIsValid === 'boolean') {
+    //     return this.computedIsValid ? 'is-valid' : 'is-invalid'
+    //   }
+    // }
+  },
+  methods: {
+    onChange (e) {
+      this.state = e.target.checked
+      this.$emit('update:checked', e.target.checked, e)
+    }
+  },
+}
+</script>
diff --git a/src/components/form/CInputFile.vue b/src/components/form/CInputFile.vue
new file mode 100644
index 00000000..d04a2693
--- /dev/null
+++ b/src/components/form/CInputFile.vue
@@ -0,0 +1,184 @@
+<template>
+  <CFormGroup
+    v-bind="{validFeedback, invalidFeedback, tooltipFeedback, description,
+             wrapperClasses, class: computedClasses}"
+  >
+    <template #label>
+      <slot name="label">
+        <label v-if="label" :for="safeId" :class="labelClasses">
+          {{label}}
+        </label>
+      </slot>
+    </template>
+
+
+    <template #input>
+      <input
+        v-bind="$attrs"
+        v-on="listeners"
+        :id="safeId"
+        :class="inputClasses"
+        :multiple="multiple"
+        type="file"
+        @change="onChange($event)"
+      />
+      <label
+        v-if="custom"
+        :for="safeId"
+        class="custom-file-label"
+      >
+        {{computedPlaceholder}}
+      </label>
+    </template>
+
+
+    <template
+      v-for="slot in $options.slots"
+      #[slot]
+    >
+      <slot :name="slot"></slot>
+    </template>
+  </CFormGroup>
+</template>
+
+<script>
+import * as allFormMixins from './form-mixins'
+import { inputFileProps as props } from './form-props'
+import CFormGroup from './CFormGroup'
+const mixins = Object.values(allFormMixins).filter((i, key) => {
+  return key !== 'watchValue'
+})
+
+export default {
+  name: 'CInputFile',
+  inheritAttrs: false,
+  components: { CFormGroup },
+  mixins,
+  slots: [
+    'label-after-input','valid-feedback','invalid-feedback','description'
+  ],
+  props,
+  // {
+    // validFeedback: String,
+    // invalidFeedback: String,
+    // tooltipFeedback: Boolean,
+    // description: String,
+
+    // label: String,
+    // wasValidated: Boolean,
+    // isValid: {
+    //   type: [Boolean, Function],
+    //   default: null
+    // },
+    // addInputClasses: [String, Array, Object],
+    // addLabelClasses: [String, Array, Object],
+
+    // horizontal: [Boolean, Object],
+    // size: {
+    //   type: String,
+    //   validator: str => ['','sm','lg'].includes(str)
+    // },
+    // addWrapperClasses: [String, Array, Object],
+
+    // custom: Boolean,
+    // placeholder: String,
+    // multiple: Boolean
+  // },
+  data () {
+    return {
+      state: null,
+    }
+  },
+  computed: {
+    computedPlaceholder () {
+      return this.placeholder || `Choose file${this.multiple ?'s':''}...`
+    },
+    // classesComputedProps mixin
+    // haveCustomSize () {
+    //   return ['sm','lg'].includes(this.size)
+    // },
+    computedClasses () {
+      return [
+        this.isHorizontal ? 'form-row':
+        this.custom ? 'custom-file' : 'form-group position-relative',
+        {
+          'was-validated': this.wasValidated
+        }
+      ]
+    },
+    // labelClasses () {
+    //   return [
+    //     this.addLabelClasses,
+    //     {
+    //       'col-form-label': this.isHorizontal,
+    //       [this.horizontal.label || 'col-sm-3']: this.isHorizontal,
+    //       [`col-form-label-${this.size}`]: this.haveCustomSize,
+    //     }
+    //   ]
+    // },
+    // customSizeClass () {
+    //   if (this.haveCustomSize && !this.haveWrapper) {
+    //     return `form-control-${this.size}`
+    //   }
+    // },
+    inputClass () {
+      return this.custom ? 'custom-file-input' : 'form-control-file'
+    },
+    // inputClasses () {
+    //   return [
+    //     this.inputClass || `form-control${this.plaintext ? '-plaintext' : ''}`,
+    //     this.validationClass,
+    //     this.addInputClasses,
+    //     this.customSizeClass
+    //   ]
+    // }
+
+
+    // validationComputedProps mixin
+    // computedIsValid () {
+    //   if (typeof this.isValid === 'function') {
+    //     return this.isValid(this.state)
+    //   }
+    //   return this.isValid
+    // },
+    // validationClass () {
+    //   if (typeof this.computedIsValid === 'boolean') {
+    //     return this.computedIsValid ? 'is-valid' : 'is-invalid'
+    //   }
+    // }
+
+    //wrapperComputedProps mixin
+    // isHorizontal () {
+    //   return Boolean(this.horizontal)
+    // },
+    haveInputGroup () {
+      return false
+    },
+    listeners () {
+      const { change, ...listeners } = this.$listeners // eslint-disable-line no-unused-vars
+      return listeners
+    }
+    // haveWrapper () {
+    //   return this.haveInputGroup || Boolean(this.addWrapperClasses || this.isHorizontal)
+    // },
+    // wrapperClasses () {
+    //   if (this.haveWrapper) {
+    //     return [
+    //       this.addWrapperClasses,
+    //       {
+    //         [this.horizontal.input || 'col-sm-9'] : this.isHorizontal,
+    //         'input-group' : this.haveInputGroup,
+    //         [`input-group-${this.size}`]: this.haveCustomSize
+    //       }
+    //     ]
+    //   }
+    // }
+  },
+  methods: {
+    onChange (e) {
+      this.state = e.target.files
+      this.$emit('change', e.target.files, e)
+    }
+  }
+}
+</script>
diff --git a/src/components/form/CInputRadio.vue b/src/components/form/CInputRadio.vue
new file mode 100644
index 00000000..3dc8fd63
--- /dev/null
+++ b/src/components/form/CInputRadio.vue
@@ -0,0 +1,9 @@
+<script>
+import CInputCheckbox from './CInputCheckbox'
+
+export default {
+  name: 'CInputRadio',
+  extends: CInputCheckbox,
+  type: 'radio'
+}
+</script>
diff --git a/src/components/form/CInputRadioGroup.vue b/src/components/form/CInputRadioGroup.vue
new file mode 100644
index 00000000..0c3cb8f9
--- /dev/null
+++ b/src/components/form/CInputRadioGroup.vue
@@ -0,0 +1,57 @@
+<template>
+  <div :class="{ 'form-inline': inline }">
+    <CInputRadio
+      v-for="({value, label, props}, key) in computedOptions"
+      :key="key"
+      :label="label"
+      :name="groupName"
+      :value="value"
+      :checked="checked === value"
+      @change="change($event, value)"
+      :custom="custom"
+      :inline="inline"
+      v-bind="props"
+    />
+  </div>
+</template>
+
+<script>
+import CInputRadio from './CInputRadio'
+export default {
+  name: 'CInputRadioGroup',
+  components: {
+    CInputRadio
+  },
+  props: {
+    options: {
+      type: Array,
+      required: true
+    },
+    checked: String,
+    name: String,
+    custom: Boolean,
+    inline: Boolean
+  },
+  computed: {
+    computedOptions () {
+      return this.options.map(option => {
+        if (typeof option !== 'object') {
+          return {
+            label: option,
+            value: option
+          }
+        }
+        return option
+      })
+    },
+    groupName () {
+      return this.name || 'radio' + this._uid
+    }
+  },
+  methods: {
+    change (e, option) {
+      this.$emit('update:checked', option, e)
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/form/CSelect.vue b/src/components/form/CSelect.vue
new file mode 100644
index 00000000..a636aef2
--- /dev/null
+++ b/src/components/form/CSelect.vue
@@ -0,0 +1,232 @@
+<template>
+  <CFormGroup
+    v-bind="{
+      append, prepend, validFeedback, invalidFeedback,
+      tooltipFeedback, description, wrapperClasses, class: computedClasses
+    }"
+  >
+    <template #label>
+      <slot name="label">
+        <label v-if="label" :for="safeId" :class="labelClasses">
+          {{label}}
+        </label>
+      </slot>
+    </template>
+
+    <template #input>
+      <select
+        v-bind="$attrs"
+        v-on="$listeners"
+        :id="safeId"
+        :class="inputClasses"
+        @change="onSelect($event)"
+      >
+        <option 
+          v-if="placeholder" 
+          value="" 
+          selected 
+          hidden
+        >
+          {{placeholder}}
+        </option>
+        <template v-for="(option, key) in options">
+          <option
+            v-if="typeof option === 'object'"
+            :value="option.value"
+            v-bind="option.attrs"
+            :disabled="option.disabled"
+            :selected="option.value === value"
+            :data-key="key"
+            :key="key"
+          >
+            {{option.label || option.value}}
+          </option>
+          <option
+            v-else
+            :value="option"
+            :selected="option === value"
+            :data-key="key"
+            :key="key"
+          >
+            {{option}}
+          </option>
+        </template>
+      </select>
+    </template>
+
+    <template 
+      v-for="slot in $options.slots" 
+      #[slot]
+    >
+      <slot :name="slot"></slot>
+    </template>
+  </CFormGroup>
+</template>
+
+<script>
+import * as allFormMixins from './form-mixins'
+const mixins = Object.values(allFormMixins)
+import { selectProps as props } from './form-props'
+import CFormGroup from './CFormGroup'
+
+export default {
+  name: 'CSelect',
+  inheritAttrs: false,
+  components: { CFormGroup },
+  slots: [
+    'prepend',
+    'prepend-content',
+    'append-content',
+    'append',
+    'label-after-input',
+    'valid-feedback',
+    'invalid-feedback',
+    'description'
+  ],
+  mixins,
+  props,
+  // Html props: disabled, required don't use multiple
+  // {
+  //   validFeedback: String,
+  //   invalidFeedback: String,
+  //   tooltipFeedback: Boolean,
+  //   description: String,
+
+  //   append: String,
+  //   prepend: String,
+
+  //   label: String,
+  //   wasValidated: Boolean,
+  //   isValid: {
+  //     type: [Boolean, Function],
+  //     default: null
+  //   },
+  //   addInputClasses: [String, Array, Object],
+  //   addLabelClasses: [String, Array, Object],
+
+  //   horizontal: [Boolean, Object],
+  //   size: {
+  //     type: String,
+  //     validator: str => ['','sm','lg'].includes(str)
+  //   },
+  //   addWrapperClasses: [String, Array, Object],
+
+  //   options: Array,
+  //   value: [String, Number, Boolean, Array],
+  //   plaintext: Boolean,
+  //   placeholder: String,
+  //   custom: Boolean
+  // },
+  data () {
+    return {
+      state: this.value || undefined
+    }
+  },
+  //watchValue mixin
+  // watch: {
+  //   value (val) {
+  //     this.state = val
+  //   }
+  // },
+  computed: {
+    // classesComputedProps mixin
+    // haveCustomSize () {
+    //   return ['sm','lg'].includes(this.size)
+    // },
+    // computedClasses () {
+    //   return [
+    //     'form-group',
+    //     {
+    //      'was-validated': this.wasValidated,
+    //      'form-row': this.isHorizontal
+    //     }
+    //   ]
+    // },
+    // labelClasses () {
+    //   return [
+    //     this.addLabelClasses,
+    //     {
+    //       'col-form-label': this.isHorizontal,
+    //       [this.horizontal.label || 'col-sm-3']: this.isHorizontal,
+    //       [`col-form-label-${this.size}`]: this.haveCustomSize,
+    //     }
+    //   ]
+    // },
+    customSizeClass () {
+      if (this.haveCustomSize && !this.haveWrapper) {
+        return `${this.custom ?'custom-select':'form-control'}-${this.size}`
+      }
+    },
+    inputClass () {
+      const standardClass = `form-control${this.plaintext ? '-plaintext' : ''}`
+      return this.custom ? 'custom-select' : standardClass
+    }
+    // inputClasses () {
+    //   return [
+    //     this.inputClass || `form-control${this.plaintext ? '-plaintext' : ''}`,
+    //     this.validationClass,
+    //     this.addInputClasses,
+    //     this.customSizeClass
+    //   ]
+    // }
+
+
+    // validationComputedProps mixin
+    // computedIsValid () {
+    //   if (typeof this.isValid === 'function') {
+    //     return this.isValid(this.state)
+    //   }
+    //   return this.isValid
+    // },
+    // validationClass () {
+    //   if (typeof this.computedIsValid === 'boolean') {
+    //     return this.computedIsValid ? 'is-valid' : 'is-invalid'
+    //   }
+    // },
+
+
+    //wrapperComputedProps mixin
+    // isHorizontal () {
+    //   return Boolean(this.horizontal)
+    // },
+    // haveInputGroup () {
+    //   return Boolean(
+    //     this.tooltipFeedback || 
+    //     this.append ||
+    //     this.prepend || 
+    //     this.$slots.append || 
+    //     this.$slots.prepend || 
+    //     this.$slots['append-content'] ||
+    //     this.$slots['prepend-content']
+    //   )
+    // },
+    // haveWrapper () {
+    //   return this.haveInputGroup || Boolean(this.addWrapperClasses || this.isHorizontal)
+    // },
+    // wrapperClasses () {
+    //   if (this.haveWrapper) {
+    //     return [
+    //       this.addWrapperClasses,
+    //       {
+    //         [this.horizontal.input || 'col-sm-9'] : this.isHorizontal,
+    //         'input-group' : this.haveInputGroup,
+    //         [`input-group-${this.size}`]: this.haveCustomSize
+    //       }
+    //     ]
+    //   }
+    // }
+  },
+
+  methods: {
+    onSelect (e) {
+      if (this.$attrs.multiple !== undefined) return
+      const optionIndex = e.target.selectedOptions[0].dataset.key
+      const option = this.options[optionIndex]
+      const value = option.value !== undefined ? option.value : option
+      this.state = value
+      this.$emit('update:value', value, e)
+      this.$emit('input', value, e)
+    }
+  }
+}
+</script>
diff --git a/src/components/form/CTextarea.vue b/src/components/form/CTextarea.vue
new file mode 100644
index 00000000..5725e2d3
--- /dev/null
+++ b/src/components/form/CTextarea.vue
@@ -0,0 +1,210 @@
+<template >
+  <CFormGroup
+    v-bind="{append, prepend, validFeedback, invalidFeedback,
+      tooltipFeedback, description, wrapperClasses, class: computedClasses}"
+  >
+    <template #label>
+      <slot name="label">
+        <label v-if="label" :for="safeId" :class="labelClasses">
+          {{label}}
+        </label>
+      </slot>
+    </template>
+    <template #input>
+      <textarea
+        v-bind="$attrs"
+        v-on="listeners"
+        :id="safeId"
+        :class="inputClasses"
+        :readonly="readonly || plaintext"
+        :value="state"
+        @input="onInput($event)"
+        @change="onChange($event)"
+      />
+    </template>
+
+    <template 
+      v-for="slot in $options.slots" 
+      #[slot]
+    >
+      <slot :name="slot"></slot>
+    </template>
+  </CFormGroup>
+</template>
+
+<script>
+import CFormGroup from './CFormGroup'
+import { textareaProps as props } from './form-props'
+import * as allFormMixins from './form-mixins'
+const mixins = Object.values(allFormMixins)
+
+export default {
+  name: 'CTextarea',
+  slots: [
+    'prepend', 
+    'prepend-content', 
+    'append-content', 
+    'append', 
+    'label-after-input',
+    'valid-feedback', 
+    'invalid-feedback',
+    'description'
+  ],
+  inheritAttrs: false,
+  components: { CFormGroup },
+  mixins,
+  props,
+  // Html props: disabled, required, rows, cols, placeholder
+  // {
+  //   validFeedback: String,
+  //   invalidFeedback: String,
+  //   tooltipFeedback: Boolean,
+  //   description: String,
+
+  //   append: String,
+  //   prepend: String,
+
+  //   label: String,
+  //   wasValidated: Boolean,
+  //   isValid: {
+  //     type: [Boolean, Function],
+  //     default: null
+  //   },
+  //   addInputClasses: [String, Array, Object],
+  //   addLabelClasses: [String, Array, Object],
+
+  //   horizontal: [Boolean, Object],
+  //   size: {
+  //     type: String,
+  //     validator: str => ['','sm','lg'].includes(str)
+  //   },
+  //   addWrapperClasses: [String, Array, Object],
+
+  //   readonly: Boolean,
+  //   plaintext: Boolean,
+  //   value: [String, Number],
+  //   lazy: {
+  //     type: [Boolean, Number],
+  //     default: 400
+  //   }
+  // },
+  data () {
+    return {
+      state: this.value
+    }
+  },
+  //watchValue mixin
+  // watch: {
+  //   value (val) {
+  //     this.state = val
+  //   }
+  // },
+  computed: {
+    listeners () {
+      const { input, change, ...listeners } = this.$listeners // eslint-disable-line no-unused-vars
+      return listeners
+    }
+    // classesComputedProps mixin
+    // haveCustomSize () {
+    //   return ['sm','lg'].includes(this.size)
+    // },
+    // computedClasses () {
+    //   return [
+    //     'form-group',
+    //     {
+    //      'was-validated': this.wasValidated,
+    //      'form-row': this.isHorizontal
+    //     }
+    //   ]
+    // },
+    // labelClasses () {
+    //   return [
+    //     this.addLabelClasses,
+    //     {
+    //       'col-form-label': this.isHorizontal,
+    //       [this.horizontal.label || 'col-sm-3']: this.isHorizontal,
+    //       [`col-form-label-${this.size}`]: this.haveCustomSize,
+    //     }
+    //   ]
+    // },
+    // customSizeClass () {
+    //   if (this.haveCustomSize && !this.haveWrapper) {
+    //     return `form-control-${this.size}`
+    //   }
+    // },
+    // inputClasses () {
+    //   return [
+    //     this.inputClass || `form-control${this.plaintext ? '-plaintext' : ''}`,
+    //     this.validationClass,
+    //     this.addInputClasses,
+    //     this.customSizeClass
+    //   ]
+    // }
+
+    // validationComputedProps mixin
+    // computedIsValid () {
+    //   if (typeof this.isValid === 'function') {
+    //     return this.isValid(this.state)
+    //   }
+    //   return this.isValid
+    // },
+    // validationClass () {
+    //   if (typeof this.computedIsValid === 'boolean') {
+    //     return this.computedIsValid ? 'is-valid' : 'is-invalid'
+    //   }
+    // }
+
+
+    //wrapperComputedProps mixin
+    // isHorizontal () {
+    //   return Boolean(this.horizontal)
+    // },
+    // haveInputGroup () {
+    //   return Boolean(
+    //     this.tooltipFeedback || 
+    //     this.append ||
+    //     this.prepend || 
+    //     this.$slots.append || 
+    //     this.$slots.prepend || 
+    //     this.$slots['append-content'] ||
+    //     this.$slots['prepend-content']
+    //   )
+    // },
+    // haveWrapper () {
+    //   return this.haveInputGroup || Boolean(this.addWrapperClasses || this.isHorizontal)
+    // },
+    // wrapperClasses () {
+    //   if (this.haveWrapper) {
+    //     return [
+    //       this.addWrapperClasses,
+    //       {
+    //         [this.horizontal.input || 'col-sm-9'] : this.isHorizontal,
+    //         'input-group' : this.haveInputGroup,
+    //         [`input-group-${this.size}`]: this.haveCustomSize
+    //       }
+    //     ]
+    //   }
+    // }
+  },
+
+
+  methods: {
+    onInput (e) {
+      this.state = e.target.value
+      this.$emit('input', this.state, e)
+      if (this.lazy === true)
+        return
+
+      clearTimeout(this.syncTimeout)
+      this.syncTimeout = setTimeout(() => {
+        this.$emit('update:value', this.state, e)
+      }, this.lazy !== false ? this.lazy : 0)
+    },
+    onChange (e) {
+      this.state = e.target.value
+      this.$emit('change', this.state, e)
+      this.$emit('update:value', this.state, e)
+    },
+  }
+}
+</script>
diff --git a/src/components/form/form-mixins.js b/src/components/form/form-mixins.js
new file mode 100644
index 00000000..3d818276
--- /dev/null
+++ b/src/components/form/form-mixins.js
@@ -0,0 +1,105 @@
+import { makeUid } from '@coreui/utils/src'
+
+export const sharedComputedProps = {
+  computed: {
+    computedIsValid () {
+      if (typeof this.isValid === 'function') {
+        return this.isValid(this.state)
+      }
+      return this.isValid
+    },
+    validationClass () {
+      if (typeof this.computedIsValid === 'boolean') {
+        return this.computedIsValid ? 'is-valid' : 'is-invalid'
+      }
+    },
+    safeId () {
+      if (this.id || this.$attrs.id) {
+        return this.id || this.$attrs.id
+      }
+      return makeUid()
+    }
+  }
+}
+
+export const wrapperComputedProps = {
+  computed: {
+    isHorizontal () {
+      return Boolean(this.horizontal)
+    },
+    haveInputGroup () {
+      return Boolean(
+        this.tooltipFeedback || 
+        this.append ||
+        this.prepend || 
+        this.$slots.append || 
+        this.$slots.prepend || 
+        this.$slots['append-content'] ||
+        this.$slots['prepend-content']
+      )
+    },
+    haveWrapper () {
+      return this.haveInputGroup || Boolean(this.addWrapperClasses || this.isHorizontal)
+    },
+    wrapperClasses () {
+      if (this.haveWrapper) {
+        return [
+          this.addWrapperClasses,
+          {
+            [this.horizontal.input || 'col-sm-9'] : this.isHorizontal,
+            'input-group' : this.haveInputGroup,
+            [`input-group-${this.size}`]: this.haveCustomSize
+          }
+        ]
+      }
+    }
+  }
+}
+
+export const watchValue = {
+  watch: {
+    value (val) {
+      this.state = val
+    }
+  }
+}
+
+export const classesComputedProps = {
+  computed: {
+    haveCustomSize () {
+      return ['sm','lg'].includes(this.size)
+    },
+    computedClasses () {
+      return [
+        'form-group',
+        {
+         'was-validated': this.wasValidated,
+         'form-row': this.isHorizontal
+        }
+      ]
+    },
+    labelClasses () {
+      return [
+        this.addLabelClasses,
+        {
+          'col-form-label': this.isHorizontal,
+          [this.horizontal.label || 'col-sm-3']: this.isHorizontal,
+          [`col-form-label-${this.size}`]: this.haveCustomSize,
+        }
+      ]
+    },
+    customSizeClass () {
+      if (this.haveCustomSize && !this.haveWrapper) {
+        return `form-control-${this.size}`
+      }
+    },
+    inputClasses () {
+      return [
+        this.inputClass || `form-control${this.plaintext ? '-plaintext' : ''}`,
+        this.validationClass,
+        this.addInputClasses,
+        this.customSizeClass
+      ]
+    }
+  }
+}
diff --git a/src/components/form/form-props.js b/src/components/form/form-props.js
new file mode 100644
index 00000000..502a108b
--- /dev/null
+++ b/src/components/form/form-props.js
@@ -0,0 +1,108 @@
+const formGroupAlwaysSharedProps = {
+  validFeedback: String,
+  invalidFeedback: String,
+  tooltipFeedback: Boolean,
+  description: String
+}
+const formGroupSharedProps = Object.assign(
+  {}, 
+  formGroupAlwaysSharedProps,
+  {
+    append: String,
+    prepend: String
+  }
+)
+
+export const formGroupProps = Object.assign(
+  {}, formGroupSharedProps, { wrapperClasses: [String, Array, Object] }
+)
+
+const universalProps = {
+  label: String,
+  wasValidated: Boolean,
+  isValid: {
+    type: [Boolean, Function],
+    default: null
+  },
+  addInputClasses: [String, Array, Object],
+  addLabelClasses: [String, Array, Object]
+}
+const props = Object.assign(
+  {}, 
+  universalProps, 
+  {
+    horizontal: [Boolean, Object],
+    size: {
+      type: String,
+      validator: str => ['','sm','lg'].includes(str)
+    },
+    addWrapperClasses: [String, Array, Object]
+  }
+)
+const textInputsProps = {
+  readonly: Boolean,
+  plaintext: Boolean,
+  value: [String, Number],
+  lazy: {
+    type: [Boolean, Number],
+    default: 400
+  }
+}
+
+// Html props: disabled, required, accept, id, placeholder
+export const inputFileProps = Object.assign(
+  {}, 
+  formGroupAlwaysSharedProps, 
+  props, 
+  {
+    custom: Boolean,
+    placeholder: String,
+    multiple: Boolean
+  }
+)
+
+// Html props: disabled, required, rows, cols, placeholder, id
+export const textareaProps = Object.assign(
+  {}, formGroupSharedProps, props, textInputsProps
+)
+
+// HTML props: disabled, required, placeholder, id
+export const inputProps = Object.assign(
+  {}, 
+  formGroupSharedProps, 
+  props, 
+  textInputsProps, 
+  {
+    type: {
+      type: String,
+      default: 'text'
+    }
+  }
+)
+
+// Html props: disabled, id required don't use multiple
+export const selectProps = Object.assign(
+  {}, 
+  formGroupSharedProps, 
+  props, 
+  {
+    options: Array,
+    value: [String, Number, Boolean, Array, Event],
+    plaintext: Boolean,
+    placeholder: String,
+    custom: Boolean
+  }
+)
+
+// Html props: id, disabled, required
+export const inputCheckboxProps = Object.assign(
+  {}, 
+  formGroupAlwaysSharedProps, 
+  universalProps, 
+  {
+    checked: Boolean,
+    custom: Boolean,
+    inline: Boolean
+  }
+)
+
diff --git a/src/components/form/index.js b/src/components/form/index.js
new file mode 100644
index 00000000..2aa04ac9
--- /dev/null
+++ b/src/components/form/index.js
@@ -0,0 +1,21 @@
+import CForm from './CForm'
+import CFormGroup from './CFormGroup'
+import CInput from './CInput'
+import CInputCheckbox from './CInputCheckbox'
+import CInputFile from './CInputFile'
+import CInputRadio from './CInputRadio'
+import CInputRadioGroup from './CInputRadioGroup'
+import CSelect from './CSelect'
+import CTextarea from './CTextarea'
+
+export {
+  CForm,
+  CFormGroup,
+  CInput,
+  CInputCheckbox,
+  CInputFile,
+  CInputRadio,
+  CInputRadioGroup,
+  CSelect,
+  CTextarea
+}
diff --git a/src/components/form/tests/CForm.spec.js b/src/components/form/tests/CForm.spec.js
new file mode 100644
index 00000000..7e2155a1
--- /dev/null
+++ b/src/components/form/tests/CForm.spec.js
@@ -0,0 +1,26 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CForm'
+
+const ComponentName = 'CForm'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    inline: true,
+    wasValidated: true
+  },
+  slots: {
+    default: 'CForm content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/form/tests/CFormGroup.spec.js b/src/components/form/tests/CFormGroup.spec.js
new file mode 100644
index 00000000..b15c73eb
--- /dev/null
+++ b/src/components/form/tests/CFormGroup.spec.js
@@ -0,0 +1,24 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CFormGroup'
+
+const ComponentName = 'CFormGroup'
+const customWrapper = mount(Component, {
+  propsData: {
+    wrapperClasses: 'additional-wrapper-class',
+    append: 'appended',
+    prepend: 'prepended',
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/form/tests/CInput.spec.js b/src/components/form/tests/CInput.spec.js
new file mode 100644
index 00000000..4d5b1b3a
--- /dev/null
+++ b/src/components/form/tests/CInput.spec.js
@@ -0,0 +1,88 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CInput'
+
+const ComponentName = 'CInput'
+const wrapper = mount(Component, {
+  propsData: {
+    id: 'some_id',
+    lazy: false,
+    size: 'lg',
+    plaintext: true,
+    isValid: (val) => val && val.length > 12
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    type: 'number',
+    label: 'label',
+    id: 'some_id',
+    wasValidated: true,
+    checked: true,
+    value: '32',
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+    isValid: true,
+    addInputClasses: 'additional-input-class',
+    addLabelClasses: 'additional-label-class',
+    addWrapperClasses: 'additional-wrapper-class',
+    custom: true,
+    size: 'lg',
+    lazy: true
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('update value when not lazy', () => {
+    const input = wrapper.find('input')
+    input.element.value = 'something'
+
+    jest.useFakeTimers()
+    input.trigger('input')
+    setTimeout(() => expect(wrapper.emitted()['update:value']).toBeTruthy(), 0)
+    jest.runAllTimers()
+
+  })
+  it('update value after given time lazy is number', () => {
+    wrapper.setProps({ lazy: 300 })
+    const input = wrapper.find('input')
+    input.element.value = 'something else'
+    const eventsStr = () => JSON.stringify(wrapper.emitted()['update:value'])
+
+    jest.useFakeTimers()
+    input.trigger('input')
+    setTimeout(() => expect(eventsStr().includes('something else')).toBe(false), 0)
+    jest.runAllTimers()
+
+    jest.useFakeTimers()
+    setTimeout(() => expect(eventsStr().includes('something else')).toBe(true), 300)
+    jest.runAllTimers()
+  })
+  it('update value only on change event when lazy', () => {
+    const input = customWrapper.find('input')
+    input.element.value = 33
+
+    jest.useFakeTimers()
+    input.trigger('input')
+    setTimeout(() => expect(customWrapper.emitted()['update:value']).not.toBeTruthy(), 1000)
+    jest.runAllTimers()
+
+    input.trigger('change')
+    expect(customWrapper.emitted()['update:value']).toBeTruthy()
+  })
+  it('changes value correctly', () => {
+    wrapper.setProps({ value: 'new value' })
+    expect(wrapper.vm.state).toBe('new value')
+  })
+})
diff --git a/src/components/form/tests/CInputCheckbox.spec.js b/src/components/form/tests/CInputCheckbox.spec.js
new file mode 100644
index 00000000..e3a3b73d
--- /dev/null
+++ b/src/components/form/tests/CInputCheckbox.spec.js
@@ -0,0 +1,52 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CInputCheckbox'
+
+const ComponentName = 'CInputCheckbox'
+const wrapper = mount(Component, {
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+  }
+})
+const customWrapper = mount(Component, {
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+    wasValidated: true,
+    checked: true,
+    value: 'value',
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+    isValid: true,
+    addInputClasses: 'additional-input-class',
+    addLabelClasses: 'additional-label-class',
+    custom: true,
+    inline: true
+  }
+})
+const autoIdWrapper = mount(Component)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly basic checkbox', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('emmits correct values on check', () => {
+    wrapper.find('input').setChecked()
+    wrapper.find('input').setChecked(false)
+    const emittedValues = wrapper.emitted()['update:checked'].map(event => {
+      return event[0]
+    })
+    expect(emittedValues).toEqual([true, false])
+  })
+  it('generates safe id when no id is passed', () => {
+    expect(autoIdWrapper.vm.safeId.includes('uid-')).toBe(true)
+  })
+})
diff --git a/src/components/form/tests/CInputFile.spec.js b/src/components/form/tests/CInputFile.spec.js
new file mode 100644
index 00000000..6d0bc7cb
--- /dev/null
+++ b/src/components/form/tests/CInputFile.spec.js
@@ -0,0 +1,45 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CInputFile'
+
+const ComponentName = 'CInputFile'
+const wrapper = mount(Component, {
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+  }
+})
+const customWrapper = mount(Component, {
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+    wasValidated: true,
+    horizontal: true,
+    checked: true,
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+    isValid: true,
+    addInputClasses: 'additional-input-class',
+    addLabelClasses: 'additional-label-class',
+    addWrapperClasses: 'additional-wrapper-class',
+    custom: true,
+    multiple: true
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly basic functionality', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('emmits event after file load', () => {
+    customWrapper.find('input').trigger('change')
+    expect(customWrapper.emitted().change).toBeTruthy()
+  })
+})
diff --git a/src/components/form/tests/CInputRadio.spec.js b/src/components/form/tests/CInputRadio.spec.js
new file mode 100644
index 00000000..4abe5430
--- /dev/null
+++ b/src/components/form/tests/CInputRadio.spec.js
@@ -0,0 +1,35 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CInputRadio'
+
+const ComponentName = 'CInputRadio'
+const customWrapper = mount(Component, {
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+    wasValidated: true,
+    checked: true,
+    value: 'value',
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+    isValid: true,
+    addInputClasses: 'additional-input-class',
+    addLabelClasses: 'additional-label-class',
+    custom: true,
+    inline: true
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    customWrapper.find('input').setChecked(true)
+    expect(customWrapper.emitted()['update:checked']).toBeTruthy()
+  })
+})
diff --git a/src/components/form/tests/CInputRadioGroup.spec.js b/src/components/form/tests/CInputRadioGroup.spec.js
new file mode 100644
index 00000000..a1ad685c
--- /dev/null
+++ b/src/components/form/tests/CInputRadioGroup.spec.js
@@ -0,0 +1,44 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CInputRadioGroup'
+
+const ComponentName = 'CInputRadio'
+const customWrapper = mount(Component, {
+  propsData: {
+    name: 'custom',
+    options: [
+      { value: 'option 1', label: 'label1', props: { id: 'id1' }},
+      { value: 'option 2', label: 'label2', props: { description: 'description', id: 'id2' }}
+    ],
+    checked: 'option 2',
+    custom: true
+  },
+  atts: {
+    class: 'add-class'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('assigns name automatically when not passed', () => {
+    customWrapper.setProps({
+      name: ''
+    })
+    expect(customWrapper.findAll('input').at(0).attributes().name).not.toBe('')
+  })
+  it('properly renders input radio from string', () => {
+    const currentOptions = customWrapper.vm.options
+    customWrapper.setProps({ options: [...currentOptions, 'option 3']})
+    expect(customWrapper.findAll('label').at(2).text()).toBe('option 3')
+    expect(customWrapper.findAll('input').at(2).attributes().value).toBe('option 3')
+  })
+  it('renders correctly', () => {
+    customWrapper.find('input').setChecked(true)
+    expect(customWrapper.emitted()['update:checked']).toBeTruthy()
+    expect(customWrapper.emitted()['update:checked'][0][1] instanceof Event).toBeTruthy()
+  })
+})
\ No newline at end of file
diff --git a/src/components/form/tests/CSelect.spec.js b/src/components/form/tests/CSelect.spec.js
new file mode 100644
index 00000000..b3db351b
--- /dev/null
+++ b/src/components/form/tests/CSelect.spec.js
@@ -0,0 +1,84 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSelect'
+
+const ComponentName = 'CSelect'
+const wrapperPlaintext = mount(Component, {
+  propsData: {
+    id: 'some_id',
+    plaintext: true,
+    options: ['Option 1', 'Option 2', { value: 'Option 3'}],
+    placeholder: 'placeholder',
+    size: 'lg'
+  }
+})
+const customSimpleWrapper = mount(Component, {
+  propsData: {
+    id: 'some_id',
+    options: ['Option 1', 'Option 2', { value: 'Option 3'}],
+    size: 'lg',
+    custom: true
+  }
+})
+const customWrapper = mount(Component, {
+  attachToDocument: true, 
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+    options: ['Option 1', 'Option 2', { value: 'Option 3'}],
+    placeholder: 'placeholder',
+    wasValidated: true,
+    checked: true,
+    value: 'value',
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+    isValid: true,
+    addInputClasses: 'additional-input-class',
+    addLabelClasses: 'additional-label-class',
+    custom: true,
+    inline: true,
+    size: 'lg',
+    append: 'appended',
+    prepend: 'prepended'
+  }
+})
+const wrapperMultiple = mount(Component, {
+  propsData: {
+    options: ['Option 1', 'Option 2', 'Option 3'],
+  },
+  attrs: {
+    multiple: true
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapperPlaintext.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customSimpleWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('emit update event', () => {
+    const select = customWrapper.find('select')
+    select.element.value = 'Option 2'
+    select.trigger('change')
+    expect(customWrapper.emitted()['update:value']).toBeTruthy()
+    const select2 = customSimpleWrapper.find('select')
+    select2.element.value = 'Option 3'
+    select2.trigger('change')
+    expect(customSimpleWrapper.emitted()['update:value']).toBeTruthy()
+  })
+  it('not emit update event on multiple select', () => {
+    const select = wrapperMultiple.find('select')
+    select.element.value = 'Option 2'
+    select.trigger('change')
+    expect(wrapperMultiple.emitted()['update:value']).not.toBeTruthy()
+  })
+})
diff --git a/src/components/form/tests/CTextarea.spec.js b/src/components/form/tests/CTextarea.spec.js
new file mode 100644
index 00000000..fc5d9284
--- /dev/null
+++ b/src/components/form/tests/CTextarea.spec.js
@@ -0,0 +1,80 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CTextarea'
+
+const ComponentName = 'CTextarea'
+const wrapper = mount(Component, {
+  propsData: {
+    id: 'some_id',
+    lazy: false
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    label: 'label',
+    id: 'some_id',
+    wasValidated: true,
+    checked: true,
+    value: 'value',
+    validFeedback: 'input is valid',
+    invalidFeedback: 'input is invalid',
+    tooltipFeedback: true,
+    description: 'permission',
+    isValid: true,
+    addInputClasses: 'additional-input-class',
+    addLabelClasses: 'additional-label-class',
+    addWrapperClasses: 'additional-wrapper-class',
+    custom: true,
+    size: 'lg',
+    lazy: true
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('update value when not lazy', () => {
+    const input = wrapper.find('textarea')
+    input.element.value = 'something'
+
+    jest.useFakeTimers()
+    input.trigger('input')
+    setTimeout(() => expect(wrapper.emitted()['update:value']).toBeTruthy(), 0)
+    jest.runAllTimers()
+
+  })
+  it('update value after given time lazy is number', () => {
+    wrapper.setProps({ lazy: 300 })
+    const input = wrapper.find('textarea')
+    input.element.value = 'something else'
+    const eventsStr = () => JSON.stringify(wrapper.emitted()['update:value'])
+
+    jest.useFakeTimers()
+    input.trigger('input')
+    setTimeout(() => expect(eventsStr().includes('something else')).toBe(false), 0)
+    jest.runAllTimers()
+
+    jest.useFakeTimers()
+    setTimeout(() => expect(eventsStr().includes('something else')).toBe(true), 300)
+    jest.runAllTimers()
+  })
+  it('update value only on change event when lazy', () => {
+    const input = customWrapper.find('textarea')
+    input.element.value = 33
+
+    jest.useFakeTimers()
+    input.trigger('input')
+    setTimeout(() => expect(customWrapper.emitted()['update:value']).not.toBeTruthy(), 1000)
+    jest.runAllTimers()
+
+    input.trigger('change')
+    expect(customWrapper.emitted()['update:value']).toBeTruthy()
+  })
+})
diff --git a/src/components/form/tests/__snapshots__/CForm.spec.js.snap b/src/components/form/tests/__snapshots__/CForm.spec.js.snap
new file mode 100644
index 00000000..d9f20944
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CForm.spec.js.snap
@@ -0,0 +1,17 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CForm renders correctly 1`] = `
+<form
+  class=""
+/>
+`;
+
+exports[`CForm renders correctly 2`] = `
+<form
+  class="form-inline was-validated"
+>
+  <template>
+    CForm content
+  </template>
+</form>
+`;
diff --git a/src/components/form/tests/__snapshots__/CFormGroup.spec.js.snap b/src/components/form/tests/__snapshots__/CFormGroup.spec.js.snap
new file mode 100644
index 00000000..cb2687e3
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CFormGroup.spec.js.snap
@@ -0,0 +1,50 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CFormGroup renders correctly 1`] = `
+<div
+  role="group"
+>
+   
+  <div
+    class="additional-wrapper-class"
+  >
+    <div
+      class="input-group-prepend"
+    >
+      <span
+        class="input-group-text"
+      >
+        prepended
+      </span>
+    </div>
+       
+    <div
+      class="input-group-append"
+    >
+      <span
+        class="input-group-text"
+      >
+        appended
+      </span>
+    </div>
+     
+    <div
+      class="valid-tooltip"
+    >
+      input is valid
+    </div>
+     
+    <div
+      class="invalid-tooltip"
+    >
+      input is invalid
+    </div>
+     
+    <small
+      class="form-text text-muted w-100"
+    >
+      permission
+    </small>
+  </div>
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CInput.spec.js.snap b/src/components/form/tests/__snapshots__/CInput.spec.js.snap
new file mode 100644
index 00000000..1bf88f67
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CInput.spec.js.snap
@@ -0,0 +1,75 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CInput renders correctly 1`] = `
+<div
+  class="form-group"
+  role="group"
+>
+   
+  <!---->
+   
+  <input
+    class="form-control-plaintext form-control-lg"
+    id="some_id"
+    readonly="readonly"
+    type="text"
+  />
+    
+  <!---->
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+</div>
+`;
+
+exports[`CInput renders correctly 2`] = `
+<div
+  class="form-group was-validated"
+  role="group"
+>
+  <label
+    class="additional-label-class col-form-label-lg"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <div
+    class="additional-wrapper-class input-group input-group-lg"
+  >
+    <!---->
+     
+    <input
+      class="form-control is-valid additional-input-class"
+      custom="true"
+      id="some_id"
+      type="number"
+    />
+      
+    <!---->
+     
+    <div
+      class="valid-tooltip"
+    >
+      input is valid
+    </div>
+     
+    <div
+      class="invalid-tooltip"
+    >
+      input is invalid
+    </div>
+     
+    <small
+      class="form-text text-muted w-100"
+    >
+      permission
+    </small>
+  </div>
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CInputCheckbox.spec.js.snap b/src/components/form/tests/__snapshots__/CInputCheckbox.spec.js.snap
new file mode 100644
index 00000000..7f5881ac
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CInputCheckbox.spec.js.snap
@@ -0,0 +1,80 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CInputCheckbox renders correctly 1`] = `
+<div
+  class="custom-control custom-control-inline custom-checkbox was-validated"
+  role="group"
+>
+   
+  <!---->
+   
+  <input
+    class="custom-control-input is-valid additional-input-class"
+    id="some_id"
+    type="checkbox"
+    value="value"
+  />
+   
+  <label
+    class="additional-label-class custom-control-label"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <!---->
+   
+  <div
+    class="valid-tooltip"
+  >
+    input is valid
+  </div>
+   
+  <div
+    class="invalid-tooltip"
+  >
+    input is invalid
+  </div>
+   
+  <small
+    class="form-text text-muted w-100"
+  >
+    permission
+  </small>
+</div>
+`;
+
+exports[`CInputCheckbox renders correctly basic checkbox 1`] = `
+<div
+  class="form-check"
+  role="group"
+>
+   
+  <!---->
+   
+  <input
+    class="form-check-input"
+    id="some_id"
+    type="checkbox"
+  />
+   
+  <label
+    class="form-check-label"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CInputFile.spec.js.snap b/src/components/form/tests/__snapshots__/CInputFile.spec.js.snap
new file mode 100644
index 00000000..1e046ce3
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CInputFile.spec.js.snap
@@ -0,0 +1,93 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CInputFile renders correctly 1`] = `
+<div
+  class="form-row was-validated"
+  role="group"
+>
+  <label
+    class="additional-label-class col-form-label col-sm-3"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <div
+    class="additional-wrapper-class col-sm-9"
+  >
+    <!---->
+     
+    <input
+      class="custom-file-input is-valid additional-input-class"
+      id="some_id"
+      multiple="multiple"
+      type="file"
+    />
+     
+    <label
+      class="custom-file-label"
+      for="some_id"
+    >
+      
+      Choose files...
+    
+    </label>
+      
+    <!---->
+     
+    <div
+      class="valid-tooltip"
+    >
+      input is valid
+    </div>
+     
+    <div
+      class="invalid-tooltip"
+    >
+      input is invalid
+    </div>
+     
+    <small
+      class="form-text text-muted w-100"
+    >
+      permission
+    </small>
+  </div>
+</div>
+`;
+
+exports[`CInputFile renders correctly basic functionality 1`] = `
+<div
+  class="form-group position-relative"
+  role="group"
+>
+  <label
+    class=""
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <!---->
+   
+  <input
+    class="form-control-file"
+    id="some_id"
+    type="file"
+  />
+   
+  <!---->
+    
+  <!---->
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CInputRadio.spec.js.snap b/src/components/form/tests/__snapshots__/CInputRadio.spec.js.snap
new file mode 100644
index 00000000..e8abb60a
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CInputRadio.spec.js.snap
@@ -0,0 +1,47 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CInputRadio renders correctly 1`] = `
+<div
+  class="custom-control custom-control-inline custom-radio was-validated"
+  role="group"
+>
+   
+  <!---->
+   
+  <input
+    class="custom-control-input is-valid additional-input-class"
+    id="some_id"
+    type="radio"
+    value="value"
+  />
+   
+  <label
+    class="additional-label-class custom-control-label"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <!---->
+   
+  <div
+    class="valid-tooltip"
+  >
+    input is valid
+  </div>
+   
+  <div
+    class="invalid-tooltip"
+  >
+    input is invalid
+  </div>
+   
+  <small
+    class="form-text text-muted w-100"
+  >
+    permission
+  </small>
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CInputRadioGroup.spec.js.snap b/src/components/form/tests/__snapshots__/CInputRadioGroup.spec.js.snap
new file mode 100644
index 00000000..edfe9868
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CInputRadioGroup.spec.js.snap
@@ -0,0 +1,76 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CInputRadio renders correctly 1`] = `
+<div
+  class=""
+>
+  <div
+    class="custom-control custom-radio"
+    role="group"
+  >
+     
+    <!---->
+     
+    <input
+      class="custom-control-input"
+      id="id1"
+      name="custom"
+      type="radio"
+      value="option 1"
+    />
+     
+    <label
+      class="custom-control-label"
+      for="id1"
+    >
+      
+        label1
+      
+    </label>
+     
+    <!---->
+     
+    <!---->
+     
+    <!---->
+     
+    <!---->
+  </div>
+  <div
+    class="custom-control custom-radio"
+    role="group"
+  >
+     
+    <!---->
+     
+    <input
+      class="custom-control-input"
+      id="id2"
+      name="custom"
+      type="radio"
+      value="option 2"
+    />
+     
+    <label
+      class="custom-control-label"
+      for="id2"
+    >
+      
+        label2
+      
+    </label>
+     
+    <!---->
+     
+    <!---->
+     
+    <!---->
+     
+    <small
+      class="form-text text-muted w-100"
+    >
+      description
+    </small>
+  </div>
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CSelect.spec.js.snap b/src/components/form/tests/__snapshots__/CSelect.spec.js.snap
new file mode 100644
index 00000000..ee9f1031
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CSelect.spec.js.snap
@@ -0,0 +1,209 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSelect renders correctly 1`] = `
+<div
+  class="form-group"
+  role="group"
+>
+   
+  <!---->
+   
+  <select
+    class="form-control-plaintext form-control-lg"
+    id="some_id"
+  >
+    <option
+      hidden="hidden"
+      selected="selected"
+      value=""
+    >
+      
+        placeholder
+      
+    </option>
+     
+    <option
+      data-key="0"
+      value="Option 1"
+    >
+      
+          Option 1
+        
+    </option>
+    <option
+      data-key="1"
+      value="Option 2"
+    >
+      
+          Option 2
+        
+    </option>
+    <option
+      data-key="2"
+      value="Option 3"
+    >
+      
+          Option 3
+        
+    </option>
+  </select>
+    
+  <!---->
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+</div>
+`;
+
+exports[`CSelect renders correctly 2`] = `
+<div
+  class="form-group"
+  role="group"
+>
+   
+  <!---->
+   
+  <select
+    class="custom-select custom-select-lg"
+    id="some_id"
+  >
+    <!---->
+     
+    <option
+      data-key="0"
+      value="Option 1"
+    >
+      
+          Option 1
+        
+    </option>
+    <option
+      data-key="1"
+      value="Option 2"
+    >
+      
+          Option 2
+        
+    </option>
+    <option
+      data-key="2"
+      value="Option 3"
+    >
+      
+          Option 3
+        
+    </option>
+  </select>
+    
+  <!---->
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+</div>
+`;
+
+exports[`CSelect renders correctly 3`] = `
+<div
+  class="form-group was-validated"
+  role="group"
+>
+  <label
+    class="additional-label-class col-form-label-lg"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <div
+    class="input-group input-group-lg"
+  >
+    <div
+      class="input-group-prepend"
+    >
+      <span
+        class="input-group-text"
+      >
+        prepended
+      </span>
+    </div>
+     
+    <select
+      checked="checked"
+      class="custom-select is-valid additional-input-class"
+      id="some_id"
+      inline="true"
+    >
+      <option
+        hidden="hidden"
+        selected="selected"
+        value=""
+      >
+        
+        placeholder
+      
+      </option>
+       
+      <option
+        data-key="0"
+        value="Option 1"
+      >
+        
+          Option 1
+        
+      </option>
+      <option
+        data-key="1"
+        value="Option 2"
+      >
+        
+          Option 2
+        
+      </option>
+      <option
+        data-key="2"
+        value="Option 3"
+      >
+        
+          Option 3
+        
+      </option>
+    </select>
+      
+    <div
+      class="input-group-append"
+    >
+      <span
+        class="input-group-text"
+      >
+        appended
+      </span>
+    </div>
+     
+    <div
+      class="valid-tooltip"
+    >
+      input is valid
+    </div>
+     
+    <div
+      class="invalid-tooltip"
+    >
+      input is invalid
+    </div>
+     
+    <small
+      class="form-text text-muted w-100"
+    >
+      permission
+    </small>
+  </div>
+</div>
+`;
diff --git a/src/components/form/tests/__snapshots__/CTextarea.spec.js.snap b/src/components/form/tests/__snapshots__/CTextarea.spec.js.snap
new file mode 100644
index 00000000..cd0fcca6
--- /dev/null
+++ b/src/components/form/tests/__snapshots__/CTextarea.spec.js.snap
@@ -0,0 +1,73 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CTextarea renders correctly 1`] = `
+<div
+  class="form-group"
+  role="group"
+>
+   
+  <!---->
+   
+  <textarea
+    class="form-control"
+    id="some_id"
+  />
+    
+  <!---->
+   
+  <!---->
+   
+  <!---->
+   
+  <!---->
+</div>
+`;
+
+exports[`CTextarea renders correctly 2`] = `
+<div
+  class="form-group was-validated"
+  role="group"
+>
+  <label
+    class="additional-label-class col-form-label-lg"
+    for="some_id"
+  >
+    
+        label
+      
+  </label>
+   
+  <div
+    class="additional-wrapper-class input-group input-group-lg"
+  >
+    <!---->
+     
+    <textarea
+      checked="checked"
+      class="form-control is-valid additional-input-class"
+      custom="true"
+      id="some_id"
+    />
+      
+    <!---->
+     
+    <div
+      class="valid-tooltip"
+    >
+      input is valid
+    </div>
+     
+    <div
+      class="invalid-tooltip"
+    >
+      input is invalid
+    </div>
+     
+    <small
+      class="form-text text-muted w-100"
+    >
+      permission
+    </small>
+  </div>
+</div>
+`;
diff --git a/src/components/grid/CCol.vue b/src/components/grid/CCol.vue
new file mode 100644
index 00000000..f08d5256
--- /dev/null
+++ b/src/components/grid/CCol.vue
@@ -0,0 +1,62 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CCol',
+  props: {
+    col: [ Boolean, String, Number, Object ],
+    xs: [ Boolean, String, Number, Object ],
+    sm: [ Boolean, String, Number, Object ],
+    md: [ Boolean, String, Number, Object ],
+    lg: [ Boolean, String, Number, Object ],
+    xl: [ Boolean, String, Number, Object ],
+    xxl: [ Boolean, String, Number, Object ],
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+  render (h, { props, data, children }) {
+    let classes = []
+    let suffixes = {
+      'col': '', 
+      'xs': '-xs', 
+      'sm': '-sm', 
+      'md': '-md', 
+      'lg': '-lg', 
+      'xl': '-xl',
+      'xxl': '-xxl',
+    }
+    Object.keys(suffixes).forEach((key) => {
+      const prop = props[key]
+      if (prop === true) {
+        classes.push(`col${suffixes[key]}`)
+
+      } else if (typeof prop === 'number' || typeof prop === 'string') {
+        classes.push(`col${suffixes[key]}-${prop}`)
+        
+      } else if (typeof prop === 'object') {
+        if (prop.size) {
+          classes.push(`col${suffixes[key]}-${prop.size}`)
+        }
+        if (prop.offset) {
+          classes.push(`offset${suffixes[key]}-${prop.offset}`)
+        }
+        if (prop.order) {
+          classes.push(`order${suffixes[key]}-${prop.order}`)
+        }
+      }
+    })
+    return h(
+      props.tag,
+      mergeData(data,
+        {
+          class: classes.length ? classes : 'col'
+        }
+      ),
+      children
+     )
+  }
+}
+</script>
diff --git a/src/components/grid/CContainer.vue b/src/components/grid/CContainer.vue
new file mode 100644
index 00000000..df3358bd
--- /dev/null
+++ b/src/components/grid/CContainer.vue
@@ -0,0 +1,27 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CContainer',
+  props: {
+    fluid: Boolean,
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        class: {
+          'container': !props.fluid,
+          'container-fluid': props.fluid
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/grid/CRow.vue b/src/components/grid/CRow.vue
new file mode 100644
index 00000000..fc7ff607
--- /dev/null
+++ b/src/components/grid/CRow.vue
@@ -0,0 +1,43 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+const props = {
+  tag: {
+    type: String,
+    default: 'div'
+  },
+  gutters: {
+    type: Boolean,
+    default: true
+  },
+  alignVertical: {
+    type: String,
+    validator: str => ['', 'start', 'end', 'center','baseline', 'stretch'].includes(str)
+  },
+  alignHorizontal: {
+    type: String,
+    validator: str => ['', 'start', 'end', 'center','between', 'around'].includes(str)
+  },
+  form: Boolean
+}
+
+export default {
+  functional: true,
+  name: 'CRow',
+  props,
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: props.form ? 'form-row' : 'row',
+        class: {
+          'no-gutters': !props.gutters,
+          [`align-items-${props.alignVertical}`]: props.alignVertical,
+          [`justify-content-${props.alignHorizontal}`]: props.alignHorizontal
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/grid/index.js b/src/components/grid/index.js
new file mode 100644
index 00000000..5af653ba
--- /dev/null
+++ b/src/components/grid/index.js
@@ -0,0 +1,9 @@
+import CContainer from './CContainer'
+import CRow from './CRow'
+import CCol from './CCol'
+
+export {
+  CContainer,
+  CRow,
+  CCol
+}
diff --git a/src/components/grid/tests/CCol.spec.js b/src/components/grid/tests/CCol.spec.js
new file mode 100644
index 00000000..8d73db47
--- /dev/null
+++ b/src/components/grid/tests/CCol.spec.js
@@ -0,0 +1,30 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CCol'
+
+const ComponentName = 'CCol'
+const wrapper = mount(Component)
+
+const customWrapper = mount(Component, {
+  propsData: {
+    sm: 12,
+    md: { size: 6, offset: 3, order: 1},
+    lg: {},
+    xl: true,
+    xxl: { size: 4, offset: 2, order: 1}
+  },
+  slots: {
+    default: 'CCol content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/grid/tests/CContainer.spec.js b/src/components/grid/tests/CContainer.spec.js
new file mode 100644
index 00000000..fad0d358
--- /dev/null
+++ b/src/components/grid/tests/CContainer.spec.js
@@ -0,0 +1,26 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CContainer'
+
+const ComponentName = 'CContainer'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    fluid: true,
+    tag: 'header'
+  },
+  slots: {
+    default: 'CContainer content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/grid/tests/CRow.spec.js b/src/components/grid/tests/CRow.spec.js
new file mode 100644
index 00000000..ddd96c34
--- /dev/null
+++ b/src/components/grid/tests/CRow.spec.js
@@ -0,0 +1,29 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CRow'
+
+const ComponentName = 'CRow'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    form: true,
+    tag: 'header',
+    gutters: false,
+    alignVertical: 'center',
+    alignHorizontal: 'start'
+  },
+  slots: {
+    default: 'CRow content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/grid/tests/__snapshots__/CCol.spec.js.snap b/src/components/grid/tests/__snapshots__/CCol.spec.js.snap
new file mode 100644
index 00000000..ecfa495a
--- /dev/null
+++ b/src/components/grid/tests/__snapshots__/CCol.spec.js.snap
@@ -0,0 +1,17 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CCol renders correctly 1`] = `
+<div
+  class="col"
+/>
+`;
+
+exports[`CCol renders correctly 2`] = `
+<div
+  class="col-sm-12 col-md-6 offset-md-3 order-md-1 col-xl col-xxl-4 offset-xxl-2 order-xxl-1"
+>
+  <template>
+    CCol content
+  </template>
+</div>
+`;
diff --git a/src/components/grid/tests/__snapshots__/CContainer.spec.js.snap b/src/components/grid/tests/__snapshots__/CContainer.spec.js.snap
new file mode 100644
index 00000000..ea316f0c
--- /dev/null
+++ b/src/components/grid/tests/__snapshots__/CContainer.spec.js.snap
@@ -0,0 +1,17 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CContainer renders correctly 1`] = `
+<div
+  class="container"
+/>
+`;
+
+exports[`CContainer renders correctly 2`] = `
+<header
+  class="container-fluid"
+>
+  <template>
+    CContainer content
+  </template>
+</header>
+`;
diff --git a/src/components/grid/tests/__snapshots__/CRow.spec.js.snap b/src/components/grid/tests/__snapshots__/CRow.spec.js.snap
new file mode 100644
index 00000000..78554304
--- /dev/null
+++ b/src/components/grid/tests/__snapshots__/CRow.spec.js.snap
@@ -0,0 +1,17 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CRow renders correctly 1`] = `
+<div
+  class="row"
+/>
+`;
+
+exports[`CRow renders correctly 2`] = `
+<header
+  class="form-row no-gutters align-items-center justify-content-start"
+>
+  <template>
+    CRow content
+  </template>
+</header>
+`;
diff --git a/src/components/image/CImg.vue b/src/components/image/CImg.vue
new file mode 100644
index 00000000..29d939e9
--- /dev/null
+++ b/src/components/image/CImg.vue
@@ -0,0 +1,72 @@
+<template>
+  <img
+    v-if="src && isActive"
+    :src="src"
+    :alt="alt"
+    :width="width"
+    :height="height"
+    :class="imageClasses"
+  />
+  <svg
+    v-else
+    :class="imageClasses"
+    :width="width"
+    :height="height"
+    :style="{'background-color': isActive ? placeholderColor : 'transparent' }"
+  />
+</template>
+
+<script>
+export default {
+  name: 'CImg',
+  props: {
+    src: String,
+    alt: String,
+    width: [Number, String],
+    height: [Number, String],
+    block: Boolean,
+    fluid: Boolean,
+    fluidGrow: Boolean,
+    shape: String,
+    thumbnail: Boolean,
+    align: {
+      type: String,
+      validator: align => ['', 'left', 'right', 'center'].includes(align)
+    },
+    placeholderColor: {
+      type: String,
+      default: 'transparent'
+    }
+  },
+  computed: {
+    isActive () {
+      //active prop is present in CImgLazy component, here always undefined
+      return this.active !== false
+    },
+    alignClass () {
+      if (this.align === 'center') {
+        return 'mx-auto'
+      } else if (this.align === 'right') {
+        return 'float-right'
+      } else if (this.align === 'left') {
+        return 'float-left'
+      }
+      return null
+    },
+    imageClasses () {
+      return [
+        //animationClasses is rendered in CImgLazy
+        this.animationClasses,
+        this.alignClass,
+        {
+          'img-thumbnail': this.thumbnail,
+          'img-fluid': this.fluid || this.fluidGrow,
+          'w-100': this.fluidGrow,
+          [`${this.shape}`]: this.shape,
+          'd-block': this.block
+        }
+      ]
+    }
+  }
+}
+</script>
diff --git a/src/components/image/index.js b/src/components/image/index.js
new file mode 100644
index 00000000..f848298b
--- /dev/null
+++ b/src/components/image/index.js
@@ -0,0 +1,5 @@
+import CImg from './CImg'
+
+export {
+  CImg
+}
diff --git a/src/components/image/tests/CImg.spec.js b/src/components/image/tests/CImg.spec.js
new file mode 100644
index 00000000..ae774683
--- /dev/null
+++ b/src/components/image/tests/CImg.spec.js
@@ -0,0 +1,43 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CImg'
+
+const ComponentName = 'CImg'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    src: './image-source',
+    alt: 'image',
+    width: 400,
+    height: 200,
+    block: true,
+    fluidGrow: true,
+    shape: 'rounded-right',
+    // thumbnail: true,
+    align: 'right',
+    placeholderColor: 'red'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('sets align properly', () => {
+    expect(customWrapper.vm.alignClass).toBe('float-right')
+    customWrapper.setProps({ align: 'left'})
+    expect(customWrapper.vm.alignClass).toBe('float-left')
+    customWrapper.setProps({ align: 'center'})
+    expect(customWrapper.vm.alignClass).toBe('mx-auto')
+  })
+  it('changes rounding properly', () => {
+    expect(customWrapper.classes().includes('rounded-right')).toBe(true)
+    customWrapper.setProps({ shape: 'rounded'})
+    expect(customWrapper.classes().includes('rounded')).toBe(true)
+  })
+})
diff --git a/src/components/image/tests/__snapshots__/CImg.spec.js.snap b/src/components/image/tests/__snapshots__/CImg.spec.js.snap
new file mode 100644
index 00000000..69ade7db
--- /dev/null
+++ b/src/components/image/tests/__snapshots__/CImg.spec.js.snap
@@ -0,0 +1,18 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CImg renders correctly 1`] = `
+<svg
+  class=""
+  style="background-color: transparent;"
+/>
+`;
+
+exports[`CImg renders correctly 2`] = `
+<img
+  alt="image"
+  class="float-right img-fluid w-100 rounded-right d-block"
+  height="200"
+  src="./image-source"
+  width="400"
+/>
+`;
diff --git a/src/components/index.d.ts b/src/components/index.d.ts
new file mode 100644
index 00000000..d7618c8c
--- /dev/null
+++ b/src/components/index.d.ts
@@ -0,0 +1,709 @@
+import Vue from 'vue'
+export declare class CAlert extends Vue {
+  color?: string
+  closeButton?: boolean
+  show?: boolean
+  fade?: boolean
+}
+
+export declare class CBadge extends CLink {
+  tag?: string
+  color?: string
+  shape?: string
+}
+
+export declare class CBreadcrumb extends Vue {
+  items?: Array<any>
+  addClasses?: string | Array<any> | object
+  addLinkClasses?: string | Array<any> | object
+  addLastItemClasses?: string | Array<any> | object
+}
+
+export declare class CBreadcrumbRouter extends Vue {
+  addClasses?: string | Array<any> | object
+  addLinkClasses?: string | Array<any> | object
+  addLastItemClasses?: string | Array<any> | object
+}
+
+export declare class CButton extends CLink {
+  block?: boolean
+  shape?: string
+  variant?: string
+  size?: string
+  color?: string
+  type?: string
+  pressed?: boolean
+}
+
+export declare class CButtonClose extends Vue {
+  buttonClasses?: string | Array<any> | object
+}
+
+export declare class CButtonGroup extends Vue {
+  vertical?: boolean
+  size?: string
+}
+
+export declare class CButtonToolbar extends Vue {
+  justify?: boolean
+}
+
+export declare class CCallout extends Vue {
+  color?: string
+}
+
+declare class CardSharedClasses extends Vue {
+  tag?: string
+  color?: string
+  borderColor?: string
+  textColor?: string
+  align?: string
+}
+
+export declare class CCard extends CardSharedClasses {
+  bodyWrapper?: boolean
+  accentColor?: string
+}
+
+export declare class CCardBody extends CardSharedClasses {}
+
+export declare class CCardFooter extends CardSharedClasses {}
+
+export declare class CCardHeader extends CardSharedClasses {}
+
+export declare class CCardImg extends CImg { 
+  variant?: string
+}
+
+export declare class CCardImgOverlay extends Vue {
+  tag?: string
+}
+
+export declare class CCardLink extends CLink {}
+
+export declare class CCardSubtitle extends Vue {
+  tag?: string
+}
+
+export declare class CCardTitle extends Vue {
+  tag?: string
+}
+
+export declare class CCardtext extends Vue {
+  tag?: string
+}
+
+export declare class CCardGroup extends Vue {
+  tag?: string
+  deck?: boolean
+  columns?: boolean
+}
+
+export declare class CCarousel extends Vue {
+  interval?: number
+  animate?: boolean
+  indicators?: boolean
+  arrows?: boolean
+  indicatorClasses?: string | Array<any> | object
+  height?: string
+}
+
+export declare class CCarouselItem extends Vue {
+  image?: string | object
+  captionHeader?: string
+  captionText?: string
+  active?: boolean
+}
+
+export declare class CCollapse extends Vue {
+  duration?: number | { show: number, hide: number }
+  transition?: string
+  show?: boolean
+  navbar?: boolean
+}
+
+export declare class CDropdown extends Vue {
+  togglerText?: string
+  show?: boolean
+  disabled?: boolean
+  addMenuClasses?: string | Array<any> | object
+  addTogglerClasses?: string | Array<any> | object
+  inNav?: boolean
+  caret?: boolean
+  color?: string
+  size?: string
+  split?: boolean
+  offset?: [number, number]
+  placement?: string
+  flip?: boolean
+  customPopperOptions?: object
+}
+
+export declare class CDropdownDivider extends Vue {
+  tag?: string
+}
+
+export declare class CDropdownHeader extends Vue {
+  tag?: string
+}
+
+export declare class CDropdownItem extends CLink {}
+
+export declare class CElementCover extends Vue {
+  boundaries?: Array<{sides: string[], query: string }>
+  center?: boolean
+  opacity?: number
+}
+
+
+export declare class CEmbed extends Vue {
+  type?: string
+  ratio?: string
+  tag?: string
+}
+
+export declare class CFooter extends Vue {
+  tag?: string
+  fixed?: boolean
+}
+
+declare class formSharedProps extends Vue {
+  validFeedback?: string
+  invalidFeedback?: string
+  tooltipFeedback?: boolean
+  description?: string
+}
+
+export declare class CInputFile extends formSharedProps {
+  label?: string
+  wasValidated?: boolean
+  isValid?: boolean | Function
+  addInputClasses?: string | Array<any> | object
+  addLabelClasses?: string | Array<any> | object
+  horizontal?: boolean | object
+  size?: string
+  addWrapperClasses?: string | Array<any> | object
+
+  custom?: boolean
+  placeholder?: string
+  multiple?: boolean
+}
+export declare class CForm extends formSharedProps {
+  inline?: boolean
+  wasValidated?: boolean
+}
+
+export declare class CFormGroup extends formSharedProps {
+  append?: string
+  prepend?: string
+  wrapperClasses?: string | Array<any> | object
+}
+
+export declare class CInput extends formSharedProps {
+  type?: string
+  append?: string
+  prepend?: string
+  readonly?: boolean
+  plaintext?: boolean
+  value?: string
+  lazy?: boolean | number
+  label?: string
+  wasValidated?: boolean
+  isValid?: boolean | Function
+  addInputClasses?: string | Array<any> | object
+  addLabelClasses?: string | Array<any> | object
+  horizontal?: boolean | object
+  size?: string
+  addWrapperClasses?: string | Array<any> | object
+}
+
+export declare class CInputRadio extends formSharedProps {
+  append?: string
+  prepend?: string
+
+  label?: string
+  wasValidated?: boolean
+  isValid?: boolean | Function
+  addInputClasses?: string | Array<any> | object
+  addLabelClasses?: string | Array<any> | object
+
+  checked?: boolean
+  custom?: boolean
+  inline?: boolean
+}
+
+export declare class CInputRadioGroup extends Vue {
+  name?: string
+  options: [string | { label: string, value: string, props?: object }]
+  checked?: string
+  custom?: boolean
+  inline?: boolean
+}
+
+export declare class CInputCheckbox extends CInputRadio {}
+
+export declare class CSelect extends formSharedProps {
+  append?: string
+  prepend?: string
+
+  label?: string
+  wasValidated?: boolean
+  isValid?: boolean | Function
+  addInputClasses?: string | Array<any> | object
+  addLabelClasses?: string | Array<any> | object
+  horizontal?: boolean | object
+  size?: string
+  addWrapperClasses?: string | Array<any> | object
+
+  options?: Array<any>
+  value?: string | number | boolean | Array<any>
+  plaintext?: boolean
+  placeholder?: string
+  custom?: boolean
+}
+
+export declare class CTextarea extends formSharedProps {
+  append?: string
+  prepend?: string
+  readonly?: boolean
+  plaintext?: boolean
+  value?: string
+  lazy?: boolean | number
+  label?: string
+  wasValidated?: boolean
+  isValid?: boolean | Function
+  addInputClasses?: string | Array<any> | object
+  addLabelClasses?: string | Array<any> | object
+  horizontal?: boolean | object
+  size?: string
+  addWrapperClasses?: string | Array<any> | object
+}
+
+export declare class CCol extends Vue {
+  col?:  boolean | string | number | object 
+  xs?:  boolean | string | number | object 
+  sm?:  boolean | string | number | object 
+  md?:  boolean | string | number | object 
+  lg?:  boolean | string | number | object 
+  xl?:  boolean | string | number | object 
+  xxl?:  boolean | string | number | object
+  tag?: string
+}
+
+export declare class CContainer extends Vue {
+  fluid?: boolean
+  tag?: string
+}
+
+export declare class CRow extends Vue {
+  tag?: string
+  gutters?: boolean
+  alignVertical?: string
+  alignHorizontal?: string
+  form?: boolean
+}
+
+export declare class CHeader extends Vue {
+  fixed?: boolean
+  tag?: string
+  colorScheme?: string
+  withSubheader?: boolean
+}
+
+export declare class CHeaderBrand extends CLink {
+  tag?: string
+}
+
+export declare class CHeaderNav extends Vue {}
+
+export declare class CHeaderNavItem extends CLink {}
+
+export declare class CHeaderNavLink extends CLink {}
+
+export declare class CSubheader extends CLink {
+  tag?: string
+}
+
+export declare class CIcon extends Vue {
+  name?: string
+  content?: string | Array<string>
+  size?: string
+  customClasses?: string | Array<any> | object
+  src?: string
+  use?: string
+}
+
+export declare class CImg extends Vue {
+  src?: string
+  alt?: string
+  width?: number | string
+  height?: number | string
+  block?: boolean
+  fluid?: boolean
+  fluidGrow?: boolean
+  rounded?: boolean | string
+  thumbnail?: boolean
+  align?: string
+  placeholderColor?: string
+}
+
+export declare class CJumbotron extends Vue {
+  tag?: string
+  fluid?: boolean
+  color?: string
+  borderColor?: string
+  textColor?: string
+}
+
+export declare class CLink extends Vue {
+  href?: string
+  rel?: string
+  target?: string
+  disabled?: boolean
+  active?: boolean
+  activeClass?: string
+  append?: boolean
+  event?: string | Array<any>
+  exact?: boolean
+  exactActiveClass?: string
+  replace?: boolean
+  routerTag?: string
+  to?: string | object
+}
+
+export declare class CListGroup extends Vue {
+  tag?: string
+  flush?: boolean
+  horizontal?: string | boolean
+  accent?: boolean
+}
+
+export declare class CListGroupItem extends CLink {
+  tag?: string
+  action?: boolean
+  color?: string
+  accent?: string
+}
+
+export declare class CListGroupItemDivider extends Vue {}
+
+export declare class CMedia extends Vue {
+  addAsideMargin?: boolean
+  addAsideClasses?: string | Array<any> | object
+  addBodyClasses?: string | Array<any> | object
+  asideRight?: boolean
+  asideImageProps?: object
+  asideVerticalPosition?: string
+}
+
+export declare class CModal extends Vue {
+  show?: boolean
+  centered?: boolean
+  scrollable?: boolean
+  title?: string
+  size?: string
+  color?: string
+  borderColor?: string
+  fade?: boolean
+  backdrop?: boolean
+  closeOnBackdrop?: boolean
+  addContentClasses?: string | Array<any> | object
+  onKey?: Function
+}
+
+export declare class CNav extends Vue {
+  fill?: boolean
+  justified?: boolean
+  variant?: string
+  vertical?: boolean
+  inCard?: boolean
+  tag?: boolean
+}
+
+export declare class CNavItem extends CLink {}
+
+export declare class CNavbar extends Vue {
+  tag?: string
+  light?: boolean
+  color?: string
+  expandable?: boolean | string
+  fixed?: string
+  sticky?: boolean
+}
+
+export declare class CNavbarBrand extends CLink {
+  tag?: string
+}
+export declare class CNavbarText extends Vue {
+  tag?: string
+}
+
+export declare class CNavbarNav extends Vue {
+  tag?: string
+}
+
+export declare class CPagination extends Vue {
+  activePage?: number
+  pages?: number
+  size?: string
+  align?: string
+  limit?: number
+  dots?: boolean
+  arrows?: boolean
+  doubleArrows?: boolean
+  responsive?: boolean
+}
+
+export declare class CProgressBar extends Vue {
+  color?: string
+  striped?: boolean
+  animated?: boolean
+  precision?: number
+  showPercentage?: boolean
+  showValue?: boolean
+  max?: number
+  value?: number
+}
+
+export declare class CProgress extends CProgressBar {
+  height?: string
+  size?: string
+}
+
+
+type ContentFlat = [NodeFlat]
+declare interface NodeFlat {
+  _name: string;
+  _children?: Array<string | NodeFlat>;
+  [key: string]: any;
+}
+
+type ContentNotFlat = [
+  string,
+  object,
+  NodeNotFlat
+]
+declare interface NodeNotFlat extends Array<ContentNotFlat | string | { slot: string }> { }
+
+type ContentToRender = ContentFlat | ContentNotFlat
+
+export declare class CRenderFunction extends Vue {
+  contentToRender: ContentToRender
+  flat?: boolean
+}
+
+export declare class CScrollbar extends Vue {
+  settings?: object
+  switcher?: boolean
+  tag?: string
+}
+
+export declare class CSidebar extends Vue {
+  fixed?: boolean
+  unfoldable?: boolean
+  overlaid?: boolean
+  breakpoint?: string | boolean
+  minimize?: boolean
+  show?: boolean | string
+  size?: string
+  hideOnMobileClick?: boolean
+  aside?: boolean
+  colorScheme?: string
+  dropdownMode?: string
+}
+
+export declare class CSidebarBrand extends CLink { 
+  tag?: string
+}
+
+
+export declare class CSidebarClose extends Vue { }
+
+export declare class CSidebarFooter extends Vue {}
+
+export declare class CSidebarForm extends Vue {}
+
+export declare class CSidebarHeader extends Vue {}
+
+export declare class CSidebarMinimizer extends Vue {}
+
+export declare class CSidebarNav extends Vue {}
+
+export declare class CSidebarNavDivider extends Vue {}
+
+export declare class CSidebarNavDropdown extends Vue {
+  name?: string
+  route?: string
+  icon?: string | object
+  fontIcon?: string
+  show?: boolean
+  items?: Array<object>
+}
+
+export declare class CSidebarNavItem extends CLink {
+  name?: string
+  icon?: string | object
+  fontIcon?: string
+  badge?: object
+  addLinkClasses?: string
+  label?: boolean
+  color?: string
+}
+
+export declare class CSidebarNavTitle extends Vue {}
+
+export declare class CSpinner extends Vue {
+  grow?: boolean
+  color?: string
+  size?: string
+  tag?: string
+}
+
+export declare class CSwitch extends Vue {
+  color?: string
+  outline?: boolean | string
+  size?: string
+  shape?: string
+  checked?: boolean
+  labelOn?: string
+  labelOff?: string
+  type?: string
+}
+
+export declare class CDataTable extends Vue {
+  items?: Array<any>
+  fields?: Array<any>
+  itemsPerPage?: number
+  activePage?: number
+  filterRow?: boolean
+  pagination?: boolean | object
+  addTableClasses?: string | Array<any> | object
+  responsive?: boolean
+  small?: boolean
+  dark?: boolean
+  striped?: boolean
+  fixed?: boolean
+  hover?: boolean
+  border?: boolean
+  outlined?: boolean
+  itemsPerPageSelect?: boolean | {
+    label?: string, values?: number[], external?: boolean 
+  }
+  sorter?: boolean | { external?: boolean, resetable?: boolean }
+  columnFilter?: boolean | { external?: boolean, lazy?: boolean}
+  tableFilter?: boolean | { 
+    external?: boolean, lazy?: boolean, label?: string, placeholder?: string
+  }
+  sorterValue?: { column: string, asc?: boolean }
+  tableFilterValue?: string
+  columnFilterValue?: object
+  header?: boolean
+  footer?: boolean
+  loading?: boolean
+  clickableRows?: boolean
+  noItemsView?: {
+    noItems?: string, noResults?: string
+  }
+  cleaner?: boolean
+}
+
+export declare class CTabs extends Vue {
+  fill?: boolean
+  justified?: boolean
+  variant?: string
+  fade?: boolean
+  vertical?: boolean | object
+  addNavWrapperClasses?: string | Array<any> | object
+  addNavClasses?: string | Array<any> | object
+  addTabsWrapperClasses?: string | Array<any> | object
+  addTabsClasses?: string | Array<any> | object
+  addTabClasses?: string | Array<any> | object
+  activeTab?: number
+}
+
+export declare class CTab extends CLink {
+  title?: string
+}
+
+declare class ToastProps extends Vue {
+  position?: string
+  autohide?: number
+  closeButton?: boolean
+  fade?: boolean
+}
+
+export declare class CToast extends ToastProps {
+  show?: boolean
+  header?: string
+  color?: string
+}
+
+export declare class CToaster extends ToastProps {
+  reverse?: boolean
+}
+
+export declare class CToggler extends Vue {
+  tag?: string
+  inNavbar?: boolean
+  inHeader?: boolean
+}
+
+export declare class CTreeGenerator extends Vue {
+  items?: object
+  components?: object
+}
+
+export declare class CTreeGeneratorItem extends Vue {
+  item?: string | object
+  name?: string
+  components?: object
+}
+
+export declare class CWidgetBrand extends Vue {
+  color?: string
+  rightHeader?: string
+  rightFooter?: string
+  leftHeader?: string
+  leftFooter?: string
+  addHeaderClasses?: string | Array<any> | object
+}
+
+export declare class CWidgetDropdown extends Vue {
+  color?: string
+  header?: string
+  text?: string
+}
+
+export declare class CWidgetIcon extends Vue {
+  header?: string
+  text?: string
+  iconPadding?: boolean
+  color?: string
+}
+
+export declare class CWidgetProgress extends Vue {
+  header?: string
+  text?: string
+  footer?: string
+  color?: string
+  inverse?: boolean
+  value?: number
+}
+
+export declare class CWidgetProgressIcon extends Vue {
+  header?: string
+  text?: string
+  color?: string
+  inverse?: boolean
+  value?: number
+}
+
+export declare class CWidgetSimple extends Vue {
+  header?: string
+  text?: string
+}
+
+export declare class CWrapper extends Vue {
+  fluid?: boolean
+  tag?: string
+}
diff --git a/src/components/index.js b/src/components/index.js
new file mode 100644
index 00000000..8ecd2bdf
--- /dev/null
+++ b/src/components/index.js
@@ -0,0 +1,36 @@
+export * from './alert'
+export * from './badge'
+export * from './breadcrumb'
+export * from './button'
+export * from './callout'
+export * from './carousel'
+export * from './card'
+export * from './collapse'
+export * from './dropdown'
+export * from './element-cover'
+export * from './embed'
+export * from './form'
+export * from './grid'
+export * from './image'
+export * from './jumbotron'
+export * from './link'
+export * from './list-group'
+export * from './media'
+export * from './modal'
+export * from './nav'
+export * from './navbar'
+export * from './pagination'
+export * from './progress'
+export * from './render-function'
+export * from './scrollbar'
+export * from './spinner'
+export * from './switch'
+export * from './table'
+export * from './tabs'
+export * from './template'
+export * from './toast'
+export * from './toggler'
+export * from './widgets'
+
+import CIcon from '@coreui/icons-vue/src/CIconRaw.vue'
+export { CIcon }
\ No newline at end of file
diff --git a/src/components/jumbotron/CJumbotron.vue b/src/components/jumbotron/CJumbotron.vue
new file mode 100644
index 00000000..06950fa9
--- /dev/null
+++ b/src/components/jumbotron/CJumbotron.vue
@@ -0,0 +1,34 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CJumbotron',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    },
+    fluid: Boolean,
+    color: String,
+    borderColor: String,
+    textColor: String
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'jumbotron',
+        class: {
+          'jumbotron-fluid': props.fluid,
+          [`text-${props.textColor}`]: props.textColor,
+          [`bg-${props.color}`]: props.color,
+          [`border-${props.borderColor}`]: props.borderColor,
+          'border': props.borderColor
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/jumbotron/index.js b/src/components/jumbotron/index.js
new file mode 100644
index 00000000..d9e9341b
--- /dev/null
+++ b/src/components/jumbotron/index.js
@@ -0,0 +1,5 @@
+import CJumbotron from './CJumbotron'
+
+export {
+  CJumbotron
+}
diff --git a/src/components/jumbotron/tests/CJumbotron.spec.js b/src/components/jumbotron/tests/CJumbotron.spec.js
new file mode 100644
index 00000000..668fe164
--- /dev/null
+++ b/src/components/jumbotron/tests/CJumbotron.spec.js
@@ -0,0 +1,28 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CJumbotron'
+
+const ComponentName = 'CJumbotron'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    fluid: true,
+    color: 'success',
+    borderColor: 'secondary',
+    textColor: 'dark'
+  },
+  slots: {
+    default: 'content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/jumbotron/tests/__snapshots__/CJumbotron.spec.js.snap b/src/components/jumbotron/tests/__snapshots__/CJumbotron.spec.js.snap
new file mode 100644
index 00000000..40bf81f2
--- /dev/null
+++ b/src/components/jumbotron/tests/__snapshots__/CJumbotron.spec.js.snap
@@ -0,0 +1,17 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CJumbotron renders correctly 1`] = `
+<div
+  class="jumbotron"
+/>
+`;
+
+exports[`CJumbotron renders correctly 2`] = `
+<div
+  class="jumbotron jumbotron-fluid text-dark bg-success border-secondary border"
+>
+  <template>
+    content
+  </template>
+</div>
+`;
diff --git a/src/components/link/CLink.vue b/src/components/link/CLink.vue
new file mode 100644
index 00000000..e28a0504
--- /dev/null
+++ b/src/components/link/CLink.vue
@@ -0,0 +1,107 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export function propsFactory () {
+  return {
+    href: String,
+    rel: String,
+    target: {
+      type: String,
+      default: '_self'
+    },
+    disabled: Boolean,
+    active: Boolean,
+
+    //these are router-link component props (default active class changed)
+    activeClass: {
+      type: String,
+      default: 'router-link-active'
+    },
+    append: Boolean,
+    event: {
+      type: [String, Array],
+      default: 'click'
+    },
+    exact: Boolean,
+    exactActiveClass: {
+      type: String,
+      default: 'router-link-exact-active'
+    },
+    replace: Boolean,
+    routerTag: {
+      type: String,
+      default: 'a'
+    },
+    to: [String, Object]
+  }
+}
+
+export const props = propsFactory()
+
+function getComputedTag ({to, disabled}, parent) {
+  return Boolean(parent.$router) && to && !disabled ? 'router-link' : 'a'
+}
+
+function clickHandlerFactory ({ disabled, tag, href, suppliedHandler }) {
+  return function onClick (e) {
+    if (disabled && e instanceof Event) {
+      // Stop event from bubbling up.
+      e.stopPropagation()
+      // Kill the event loop attached to this specific EventTarget.
+      e.stopImmediatePropagation()
+    } else if (typeof suppliedHandler === 'function') {
+      suppliedHandler(...arguments)
+    }
+
+    if ((tag !== 'router-link' && href === '#') || disabled) {
+      // Stop scroll-to-top behavior or navigation.
+      e.preventDefault()
+    }
+  }
+}
+
+export default {
+  functional: true,
+  name: 'CLink',
+  props,
+  render (h, { props, data, parent, children }) {
+    const tag = getComputedTag(props, parent)
+    const rel = props.target === '_blank' && !props.rel ? 'noopener' : props.rel
+    const href = props.href || '#'
+
+    const eventType = tag === 'router-link' ? 'nativeOn' : 'on'
+    const suppliedHandler = (data[eventType] || {}).click
+    const handlers = { click: clickHandlerFactory(
+      { tag, href, disabled: props.disabled, suppliedHandler }
+    )}
+
+    const tabindex = data.attrs ? data.attrs.tabindex : null
+
+    const componentData = mergeData(data, {
+      class: {
+        'disabled': props.disabled,
+        'active': props.active
+      },
+      attrs: {
+        rel,
+        href,
+        target: props.target,
+        tabindex: props.disabled ? '-1' : tabindex,
+        'aria-disabled': tag === 'a' && props.disabled ? 'true' : null
+      },
+      props: Object.assign(props, { tag: props.routerTag })
+    })
+
+    // If href prop exists on router-link (even undefined or null) it fails working on SSR
+    if (tag === 'router-link') {
+      delete componentData.attrs.href
+    }
+
+    // We want to overwrite any click handler since our callback
+    // will invoke the supplied handler if !props.disabled
+    componentData[eventType] = Object.assign(componentData[eventType] || {}, handlers)
+
+    return h(tag, componentData, children)
+  }
+}
+</script>
diff --git a/src/components/link/index.js b/src/components/link/index.js
new file mode 100644
index 00000000..810cb9ea
--- /dev/null
+++ b/src/components/link/index.js
@@ -0,0 +1,5 @@
+import CLink from './CLink'
+
+export {
+  CLink
+}
diff --git a/src/components/link/tests/CLink.spec.js b/src/components/link/tests/CLink.spec.js
new file mode 100644
index 00000000..8eda19bb
--- /dev/null
+++ b/src/components/link/tests/CLink.spec.js
@@ -0,0 +1,58 @@
+import { mount, createLocalVue } from '@vue/test-utils'
+import CLink from '../CLink'
+import VueRouter from 'vue-router'
+
+const ComponentName = 'CLink'
+const wrapper = mount(CLink)
+
+
+const localVue = new createLocalVue()
+localVue.use(VueRouter)
+const router = new VueRouter()
+
+let triggerLink = jest.fn()
+const click = () => { triggerLink() }
+
+const App = localVue.extend({
+  router,
+  components: { CLink },
+  render (h) {
+    return h('main', {}, [
+      // router-link
+      h('CLink', { props: { to: '/a' }, nativeOn: { click } }, ['to-path-a']),
+      // regular link
+      h('CLink', { props: { href: '/a' }, on: { click } }, ['href-a']),
+      // disabled link
+      h('CLink', { props: { disabled: true, href: '/a' }, on: { click } }, ['href-a']),
+      //no click additional behavior
+      h('CLink', { props: { href: '/a' } }, ['href-a'])
+    ])
+  }
+})
+
+const customWrapper = mount(App, { localVue })
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(CLink.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('triggers events properly', () => {
+    const links = customWrapper.findAll('a')
+
+    links.at(2).trigger('click')
+    links.at(3).trigger('click')  
+    expect(triggerLink).not.toBeCalled()
+
+    links.at(0).trigger('click')
+    expect(triggerLink).toBeCalled()
+
+    links.at(1).trigger('click')  
+    expect(triggerLink).toBeCalledTimes(2)
+  })
+});
diff --git a/src/components/link/tests/__snapshots__/CLink.spec.js.snap b/src/components/link/tests/__snapshots__/CLink.spec.js.snap
new file mode 100644
index 00000000..4ce99c78
--- /dev/null
+++ b/src/components/link/tests/__snapshots__/CLink.spec.js.snap
@@ -0,0 +1,44 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CLink .vue renders correctly 1`] = `
+<a
+  class=""
+  href="#"
+  target="_self"
+/>
+`;
+
+exports[`CLink .vue renders correctly 2`] = `
+<main>
+  <a
+    class=""
+    href="#/a"
+    target="_self"
+  >
+    to-path-a
+  </a>
+  <a
+    class=""
+    href="/a"
+    target="_self"
+  >
+    href-a
+  </a>
+  <a
+    aria-disabled="true"
+    class="disabled"
+    href="/a"
+    tabindex="-1"
+    target="_self"
+  >
+    href-a
+  </a>
+  <a
+    class=""
+    href="/a"
+    target="_self"
+  >
+    href-a
+  </a>
+</main>
+`;
diff --git a/src/components/list-group/CListGroup.vue b/src/components/list-group/CListGroup.vue
new file mode 100644
index 00000000..936d96d8
--- /dev/null
+++ b/src/components/list-group/CListGroup.vue
@@ -0,0 +1,33 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export default {
+  functional: true,
+  name: 'CListGroup',
+  props: {
+    tag: {
+      type: String,
+      default: 'ul'
+    },
+    flush: Boolean,
+    horizontal: [Boolean, String],
+    accent: Boolean
+  },
+  render (h, { props, data, children }) {
+    const hor = props.horizontal
+    const horizontalClassSuffix = typeof hor === 'string' ? `-${hor}` : ''
+    const componentData = {
+      staticClass: 'list-group',
+      class: { 
+        'list-group-flush': !hor && props.flush,
+        [`list-group-horizontal${horizontalClassSuffix}`]: hor,
+        'list-group-accent': props.accent
+      },
+      attrs: {
+        role: data.attrs ? data.attrs.role || 'list-items' : 'list-items'
+      }
+    }
+    return h(props.tag, mergeData(data, componentData), children)
+  }
+}
+</script>
diff --git a/src/components/list-group/CListGroupItem.vue b/src/components/list-group/CListGroupItem.vue
new file mode 100644
index 00000000..62370d9e
--- /dev/null
+++ b/src/components/list-group/CListGroupItem.vue
@@ -0,0 +1,58 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+import { pickByKeys } from '@coreui/utils/src'
+import CLink, { propsFactory as linkPropsFactory } from '../link/CLink'
+
+const props = Object.assign(
+  {
+    tag: {
+      type: String,
+      default: 'li'
+    },
+    action: Boolean,
+    color: String,
+    accent: String
+  },
+  linkPropsFactory()
+)
+
+export default {
+  functional: true,
+  name: 'CListGroupItem',
+  props,
+  render (h, { props, data, children }) {
+    const tag = props.href || props.to ? CLink : props.tag
+    const isAction = Boolean(
+      props.action ||
+      props.href ||
+      props.to ||
+      props.tag === 'button'
+    )
+    const attrs = {}
+    let itemProps = {}
+    if (tag === 'button') {
+      if (!data.attrs || !data.attrs.type) {
+        attrs.type = 'button'
+      }
+      if (props.disabled) {
+        attrs.disabled = true
+      }
+    } else {
+      itemProps = pickByKeys(props, Object.keys(linkPropsFactory()))
+    }
+    const componentData = {
+      attrs,
+      props: itemProps,
+      staticClass: 'list-group-item',
+      class: {
+        [`list-group-item-${props.color}`]: props.color,
+        [`list-group-item-accent-${props.accent}`]: props.accent,
+        'list-group-item-action': isAction,
+        'active': props.active,
+        'disabled': props.disabled
+      }
+    }
+    return h(tag, mergeData(data, componentData), children)
+  }
+}
+</script>
diff --git a/src/components/list-group/CListGroupItemDivider.vue b/src/components/list-group/CListGroupItemDivider.vue
new file mode 100644
index 00000000..4054d2c0
--- /dev/null
+++ b/src/components/list-group/CListGroupItemDivider.vue
@@ -0,0 +1,9 @@
+<template>
+  <div class="list-group-item-divider"></div>
+</template>
+
+<script>
+export default {
+  name: 'CListGroupItemDivider'
+}
+</script>
\ No newline at end of file
diff --git a/src/components/list-group/index.js b/src/components/list-group/index.js
new file mode 100644
index 00000000..bb77bf7d
--- /dev/null
+++ b/src/components/list-group/index.js
@@ -0,0 +1,9 @@
+import CListGroup from './CListGroup'
+import CListGroupItem from './CListGroupItem'
+import CListGroupItemDivider from './CListGroupItemDivider'
+
+export {
+  CListGroup,
+  CListGroupItem,
+  CListGroupItemDivider
+}
diff --git a/src/components/list-group/tests/CListGroup.spec.js b/src/components/list-group/tests/CListGroup.spec.js
new file mode 100644
index 00000000..e4f6d240
--- /dev/null
+++ b/src/components/list-group/tests/CListGroup.spec.js
@@ -0,0 +1,31 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CListGroup'
+
+const ComponentName = 'CListGroup'
+const wrapper = mount(Component, {
+  propsData: {
+    horizontal: 'sm'
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    flush: true,
+    accent: true
+  },
+  slots: {
+    default: 'CListGroup content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with flush option', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/list-group/tests/CListGroupItem.spec.js b/src/components/list-group/tests/CListGroupItem.spec.js
new file mode 100644
index 00000000..05c74d76
--- /dev/null
+++ b/src/components/list-group/tests/CListGroupItem.spec.js
@@ -0,0 +1,44 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CListGroupItem'
+
+const ComponentName = 'CListGroupItem'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    tag: 'button',
+    action: true,
+    color: 'success',
+    accent: 'success'
+  },
+  slots: {
+    default: 'CListGroupItem content'
+  }
+})
+
+const disabledWrapper = mount(Component, {
+  propsData: {
+    tag: 'button',
+    disabled: true
+  },
+  attrs: {
+    type: 'submit'
+  },
+  slots: {
+    default: 'disabled CListGroupItem content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly disabled', () => {
+    expect(disabledWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/list-group/tests/__snapshots__/CListGroup.spec.js.snap b/src/components/list-group/tests/__snapshots__/CListGroup.spec.js.snap
new file mode 100644
index 00000000..e3468279
--- /dev/null
+++ b/src/components/list-group/tests/__snapshots__/CListGroup.spec.js.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CListGroup renders correctly 1`] = `
+<ul
+  class="list-group list-group-horizontal-sm"
+  role="list-items"
+/>
+`;
+
+exports[`CListGroup renders correctly with flush option 1`] = `
+<ul
+  class="list-group list-group-flush list-group-accent"
+  role="list-items"
+>
+  <template>
+    CListGroup content
+  </template>
+</ul>
+`;
diff --git a/src/components/list-group/tests/__snapshots__/CListGroupItem.spec.js.snap b/src/components/list-group/tests/__snapshots__/CListGroupItem.spec.js.snap
new file mode 100644
index 00000000..3bdb7f54
--- /dev/null
+++ b/src/components/list-group/tests/__snapshots__/CListGroupItem.spec.js.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CListGroupItem renders correctly 1`] = `
+<li
+  class="list-group-item"
+/>
+`;
+
+exports[`CListGroupItem renders correctly 2`] = `
+<button
+  class="list-group-item list-group-item-success list-group-item-accent-success list-group-item-action"
+  type="button"
+>
+  <template>
+    CListGroupItem content
+  </template>
+</button>
+`;
+
+exports[`CListGroupItem renders correctly disabled 1`] = `
+<button
+  class="list-group-item list-group-item-action disabled"
+  disabled="disabled"
+  type="submit"
+>
+  <template>
+    disabled CListGroupItem content
+  </template>
+</button>
+`;
diff --git a/src/components/media/CMedia.vue b/src/components/media/CMedia.vue
new file mode 100644
index 00000000..7f1b86ca
--- /dev/null
+++ b/src/components/media/CMedia.vue
@@ -0,0 +1,65 @@
+<template>
+  <div :class="mediaClasses">
+    <div :class="asideClasses">
+      <slot name="aside">
+        <CImg v-bind="computedAsideImageProps"/>
+      </slot>
+    </div>
+    <div :class="mediaBodyClasses">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+
+<script>
+import CImg from '../image/CImg'
+export default {
+  name: 'CMedia',
+  components: {
+    CImg
+  },
+  props: {
+    addAsideMargin: {
+      type: Boolean,
+      default: true
+    },
+    addAsideClasses: [String, Array, Object],
+    addBodyClasses: [String, Array, Object],
+    asideRight: Boolean,
+    asideImageProps: Object,
+    asideVerticalPosition: {
+      type: String,
+      default: 'start',
+      validator: val => ['start', 'center', 'end', 'stretch'].includes(val)
+    }
+  },
+  computed: {
+    computedAsideImageProps () {
+      return Object.assign(
+        {
+          placeholderColor: '#777777',
+          width: '64px',
+          height: this.asideVerticalPosition === 'stretch' ? '100%' : '64px'
+        },
+        this.asideImageProps || {}
+      )
+    },
+    asideClasses () {
+      return [
+        this.addAsideMargin ? `m${this.asideRight? 'l' : 'r' }-3` : '',
+        this.addAsideClasses,
+        `align-self-${this.asideVerticalPosition}`
+      ]
+    },
+    mediaBodyClasses () {
+      return [ 'media-body', this.addBodyClasses ]
+    },
+    mediaClasses () {
+      return [
+        'media',
+        { 'd-flex flex-row-reverse': this.asideRight }
+      ]
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/media/index.js b/src/components/media/index.js
new file mode 100644
index 00000000..54832f21
--- /dev/null
+++ b/src/components/media/index.js
@@ -0,0 +1,5 @@
+import CMedia from './CMedia'
+
+export {
+  CMedia
+}
diff --git a/src/components/media/tests/CMedia.spec.js b/src/components/media/tests/CMedia.spec.js
new file mode 100644
index 00000000..a9634008
--- /dev/null
+++ b/src/components/media/tests/CMedia.spec.js
@@ -0,0 +1,29 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CMedia'
+
+const ComponentName = 'CMedia'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    addAsideMargin: false,
+    addAsideClasses: 'additional-aside-class',
+    addBodyClasses: 'additional-body-class',
+    asideRight: true,
+    asideVerticalPosition: 'stretch'
+  },
+  slots: {
+    default: 'CMedia content'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/media/tests/__snapshots__/CMedia.spec.js.snap b/src/components/media/tests/__snapshots__/CMedia.spec.js.snap
new file mode 100644
index 00000000..1d6c6fe4
--- /dev/null
+++ b/src/components/media/tests/__snapshots__/CMedia.spec.js.snap
@@ -0,0 +1,45 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CMedia renders correctly 1`] = `
+<div
+  class="media"
+>
+  <div
+    class="mr-3 align-self-start"
+  >
+    <svg
+      class=""
+      height="64px"
+      style="background-color: rgb(119, 119, 119);"
+      width="64px"
+    />
+  </div>
+   
+  <div
+    class="media-body"
+  />
+</div>
+`;
+
+exports[`CMedia renders correctly 2`] = `
+<div
+  class="media d-flex flex-row-reverse"
+>
+  <div
+    class="additional-aside-class align-self-stretch"
+  >
+    <svg
+      class=""
+      height="100%"
+      style="background-color: rgb(119, 119, 119);"
+      width="64px"
+    />
+  </div>
+   
+  <div
+    class="media-body additional-body-class"
+  >
+    CMedia content
+  </div>
+</div>
+`;
diff --git a/src/components/modal/CModal.vue b/src/components/modal/CModal.vue
new file mode 100644
index 00000000..6bcb66dc
--- /dev/null
+++ b/src/components/modal/CModal.vue
@@ -0,0 +1,188 @@
+<template>
+  <div>
+    <div
+      :class="modalClasses"
+      tabindex="-1"
+      role="dialog"
+      @click="modalClick($event)"
+    >
+      <div :class="dialogClasses" role="document">
+        <div :class="contentClasses">
+          <slot name="header-wrapper">
+            <header class="modal-header">
+              <slot name="header">
+                <h5 class="modal-title">
+                  {{title}}
+                </h5>
+                <CButtonClose @click="hide($event)"/>
+              </slot>
+            </header>
+          </slot>
+          <slot name="body-wrapper">
+            <div class="modal-body">
+              <slot></slot>
+            </div>
+          </slot>
+          <slot name="footer-wrapper">
+            <footer class="modal-footer">
+              <slot name="footer">
+                <button
+                  type="button"
+                  class="btn btn-secondary"
+                  @click="hide($event)"
+                >
+                  Cancel
+                </button>
+                <button
+                  type="button"
+                  :class="btnClasses"
+                  @click="hide($event, true)"
+                >
+                  OK
+                </button>
+              </slot>
+            </footer>
+          </slot>
+        </div>
+      </div>
+    </div>
+    <div
+      v-if="backdrop && (visible || isTransitioning)"
+      :class="backdropClasses"
+    >
+    </div>
+  </div>
+</template>
+
+<script>
+import CButtonClose from '../button/CButtonClose'
+
+export default {
+  name: 'CModal',
+  components: {
+    CButtonClose
+  },
+  props: {
+    show: Boolean,
+    centered: Boolean,
+    scrollable: Boolean,
+    title: String,
+    size: {
+      type: String,
+      validator: val => ['', 'sm', 'lg', 'xl'].includes(val)
+    },
+    color: String,
+    borderColor: String,
+    fade: {
+      type: Boolean,
+      default: true
+    },
+    backdrop: {
+      type: Boolean,
+      default: true
+    },
+    closeOnBackdrop: {
+      type: Boolean,
+      default: true
+    },
+    addContentClasses: [String, Array, Object],
+    onKey: Function,
+  },
+  data () {
+    return {
+      visible: this.show,
+      isTransitioning: false,
+      timeout: null
+    }
+  },
+  computed: {
+    backdropClasses () {
+      return {
+        'modal-backdrop': true,
+        'fade': this.fade,
+        'show': this.visible || !this.fade
+      }
+    },
+    modalClasses () {
+      return [
+        'modal overflow-auto',
+        {
+          'fade': this.fade,
+          'show': this.visible,
+          'd-block': this.visible || this.isTransitioning,
+          [`modal-${this.color}`]: this.color
+        }
+      ]
+    },
+    dialogClasses () {
+      return [
+        'modal-dialog',
+        {
+          'modal-dialog-centered': this.centered,
+          'modal-dialog-scrollable': this.scrollable,
+          [`modal-${this.size}`]: this.size
+        }
+      ]
+    },
+    contentClasses () {
+      return [
+        this.addContentClasses,
+        'modal-content',
+        {
+          [`border-${this.borderColor}`]: this.borderColor
+        }
+      ]
+    },
+    btnClasses () {
+      return [`btn btn-${this.color || 'primary'}`]
+    }
+  },
+  watch: {
+    show (val) {
+      this.toggle(val)
+    }
+  },
+  methods: {
+    modalClick (e) {
+      if (e.target === this.$el.firstElementChild && this.closeOnBackdrop) {
+        this.hide(e)
+      }
+    },
+    hide (e, accept = false) {
+      this.$emit('update:show', false, e, accept)
+      if(this.visible){
+        window.removeEventListener("keydown", this.hideEsc );
+      }
+    },
+    hideEsc (event){
+      if(typeof this.onKey != 'undefined'){
+        if(this.onKey('', event.keyCode)!==false){
+          this.hide(event)
+        }
+      }else{
+        if(event.keyCode == '27'){
+          this.hide(event)
+        }
+      }
+    },
+    toggle (newVal) {
+      setTimeout(() => { this.visible = newVal }, 0)
+      if(newVal){
+        window.addEventListener('keydown', this.hideEsc );
+      }
+      if (this.fade) {
+        this.isTransitioning = true
+        clearTimeout(this.timeout)
+        this.timeout = setTimeout(() => {
+          this.isTransitioning = false
+        }, 150)
+      }
+    }
+  },
+  mounted: function(){
+    if(this.show){
+      window.addEventListener('keydown', this.hideEsc );
+    }
+  }
+}
+</script>
diff --git a/src/components/modal/index.js b/src/components/modal/index.js
new file mode 100644
index 00000000..5b5cfa49
--- /dev/null
+++ b/src/components/modal/index.js
@@ -0,0 +1,5 @@
+import CModal from './CModal'
+
+export {
+  CModal
+}
diff --git a/src/components/modal/tests/CModal.spec.js b/src/components/modal/tests/CModal.spec.js
new file mode 100644
index 00000000..4cd833b3
--- /dev/null
+++ b/src/components/modal/tests/CModal.spec.js
@@ -0,0 +1,82 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CModal'
+
+const ComponentName = 'CModal'
+const defaultWrapper = mount(Component, { attachToDocument: true })
+const defaultWrapper2 = mount(Component, { 
+  propsData: {
+    show: true,
+    onKey: function(type, key){
+      return key===32
+    }
+  },
+  attachToDocument: true 
+})
+const customWrapper = mount(Component, {
+  propsData: {
+    show: true,
+    centered: true,
+    title: 'modal title',
+    size: 'lg',
+    color: 'success',
+    borderColor: 'success',
+    fade: true,
+    backdrop: true,
+    closeOnBackdrop: false,
+    addContentClasses: 'additional-content-class',
+  },
+  slots: {
+    default: 'CModal body'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('hides on backdrop click when closeOnBackdrop prop is true', () => {
+    const click = () => customWrapper.find('.modal').trigger('click')
+    click()
+    expect(customWrapper.emitted()['update:show']).not.toBeTruthy()
+
+    customWrapper.setProps({ closeOnBackdrop: true })
+    click()
+    expect(customWrapper.emitted()['update:show']).toBeTruthy()
+  })
+  it('doesnt animate when fade prop is set to false', () => {
+    defaultWrapper.setProps({ fade: false })
+    defaultWrapper.vm.toggle(true)
+    expect(defaultWrapper.vm.isTransitioning).toBe(false)
+  })
+  it('toggles visibility correctly', () => {
+    jest.useFakeTimers()
+
+    customWrapper.setProps({ show: false })
+    expect(customWrapper.vm.isTransitioning).toBe(true)
+    jest.runAllTimers()
+
+    jest.useFakeTimers()
+    setTimeout(() => {
+      expect(customWrapper.vm.isTransitioning).toBe(false)
+    }, 200)
+    jest.runAllTimers()
+  })
+  it('Close on default key -> ESC (modal donot show=true on mounted)', () => {
+    defaultWrapper.setProps(
+    { 
+      show: true, 
+    })
+    defaultWrapper.trigger('keydown.esc')
+    expect(defaultWrapper.emitted()['update:show']).toBeTruthy()
+  })
+  it('Close on key defined in onKey function (modal show=true on mounted)', () => {
+    defaultWrapper2.trigger('keydown.space')
+    expect(defaultWrapper2.emitted()['update:show']).toBeTruthy()
+  })
+})
diff --git a/src/components/modal/tests/__snapshots__/CModal.spec.js.snap b/src/components/modal/tests/__snapshots__/CModal.spec.js.snap
new file mode 100644
index 00000000..aecc2202
--- /dev/null
+++ b/src/components/modal/tests/__snapshots__/CModal.spec.js.snap
@@ -0,0 +1,139 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CModal renders correctly 1`] = `
+<div>
+  <div
+    class="modal overflow-auto fade"
+    role="dialog"
+    tabindex="-1"
+  >
+    <div
+      class="modal-dialog"
+      role="document"
+    >
+      <div
+        class="modal-content"
+      >
+        <header
+          class="modal-header"
+        >
+          <h5
+            class="modal-title"
+          >
+            
+                
+              
+          </h5>
+           
+          <button
+            aria-label="Close"
+            class="close"
+            type="button"
+          >
+            ×
+          </button>
+        </header>
+         
+        <div
+          class="modal-body"
+        />
+         
+        <footer
+          class="modal-footer"
+        >
+          <button
+            class="btn btn-secondary"
+            type="button"
+          >
+            
+                Cancel
+              
+          </button>
+           
+          <button
+            class="btn btn-primary"
+            type="button"
+          >
+            
+                OK
+              
+          </button>
+        </footer>
+      </div>
+    </div>
+  </div>
+   
+  <!---->
+</div>
+`;
+
+exports[`CModal renders correctly 2`] = `
+<div>
+  <div
+    class="modal overflow-auto fade show d-block modal-success"
+    role="dialog"
+    tabindex="-1"
+  >
+    <div
+      class="modal-dialog modal-dialog-centered modal-lg"
+      role="document"
+    >
+      <div
+        class="additional-content-class modal-content border-success"
+      >
+        <header
+          class="modal-header"
+        >
+          <h5
+            class="modal-title"
+          >
+            
+                modal title
+              
+          </h5>
+           
+          <button
+            aria-label="Close"
+            class="close"
+            type="button"
+          >
+            ×
+          </button>
+        </header>
+         
+        <div
+          class="modal-body"
+        >
+          CModal body
+        </div>
+         
+        <footer
+          class="modal-footer"
+        >
+          <button
+            class="btn btn-secondary"
+            type="button"
+          >
+            
+                Cancel
+              
+          </button>
+           
+          <button
+            class="btn btn-success"
+            type="button"
+          >
+            
+                OK
+              
+          </button>
+        </footer>
+      </div>
+    </div>
+  </div>
+   
+  <div
+    class="modal-backdrop fade show"
+  />
+</div>
+`;
diff --git a/src/components/nav/CNav.vue b/src/components/nav/CNav.vue
new file mode 100644
index 00000000..f2f99206
--- /dev/null
+++ b/src/components/nav/CNav.vue
@@ -0,0 +1,56 @@
+<template>
+  <component :is="tag || 'ul'" :class="navClasses" @click="onClick">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CNav',
+  props: {
+    variant: {
+      type: String,
+      validator: val => ['', 'tabs', 'pills'].includes(val)
+    },
+    fill: Boolean,
+    justified: Boolean,
+    vertical: [Boolean, String],
+    inCard: Boolean,
+    tag: String
+  },
+  provide () {
+    const nav = {}
+    Object.defineProperty(nav, 'active', {
+      get: () => this.activeItemInstance
+    })
+    return { nav }
+  },
+  data () {
+    return {
+      activeItemInstance: null
+    }
+  },
+  computed: {
+    navClasses () {
+      const verticalSuffix = this.vertical === true ? '' : '-' + this.vertical
+      return {
+        'nav': true,
+        [`nav-${this.variant}`]: this.variant,
+        [`flex${verticalSuffix}-column`]: this.vertical,
+        'nav-fill': this.fill,
+        'nav-justified': this.justified,
+        [`card-header-${this.variant}`]: this.inCard && this.variant
+      }
+    }
+  },
+  methods: {
+    onClick (e) {
+      this.$children.forEach(item => {
+        if (item.$el.contains(e.target) && !item.disabled) {
+          this.activeItemInstance = item
+        }
+      })
+    }
+  }
+}
+</script>
diff --git a/src/components/nav/CNavItem.vue b/src/components/nav/CNavItem.vue
new file mode 100644
index 00000000..c1ca089a
--- /dev/null
+++ b/src/components/nav/CNavItem.vue
@@ -0,0 +1,28 @@
+<template>
+  <li class="nav-item">
+    <CLink
+      class="nav-link"
+      v-bind="$props"
+      :active="isActive"
+    >
+      <slot></slot>
+    </CLink>
+  </li>
+</template>
+
+<script>
+import CLink, { props } from '../link/CLink'
+export default {
+  name: 'CNavItem',
+  components: {
+    CLink
+  },
+  inject: { nav: { default: {} }},
+  props,
+  computed: {
+    isActive () {
+      return this.nav.active ? this.nav.active === this : this.active
+    }
+  }
+}
+</script>
diff --git a/src/components/nav/index.js b/src/components/nav/index.js
new file mode 100644
index 00000000..dab8ba8e
--- /dev/null
+++ b/src/components/nav/index.js
@@ -0,0 +1,7 @@
+import CNav from './CNav'
+import CNavItem from './CNavItem'
+
+export {
+  CNav,
+  CNavItem
+}
diff --git a/src/components/nav/tests/CNav.spec.js b/src/components/nav/tests/CNav.spec.js
new file mode 100644
index 00000000..f6b4faec
--- /dev/null
+++ b/src/components/nav/tests/CNav.spec.js
@@ -0,0 +1,61 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CNav'
+import CNavItem from '../CNavItem'
+
+
+const ComponentName = 'CNav'
+const wrapper = mount(Component, {
+  propsData: {
+    variant: 'tabs',
+  },
+  slots: {
+    default: 'CNav items'
+  }
+})
+
+// const disabledNavItem = { render(h) {
+//   return h(CNavItem, { props: { disabled: true }  })
+// }}
+
+const customWrapper = mount(Component, {
+  propsData: {
+    fill: true,
+    justified: true,
+    variant: 'pills',
+    vertical: true,
+    inCard: true
+  },
+  slots: {
+    default: [CNavItem, CNavItem, CNavItem, CNavItem]
+  }
+})
+const items = customWrapper.findAll('.nav-item')
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('activate item on click', () => {
+    const items = customWrapper.findAll('.nav-item')
+    items.at(1).trigger('click')
+    expect(items.at(1).vm.isActive).toBe(true)
+  })
+  it('activate item on click', () => {
+    items.at(1).trigger('click')
+    expect(items.at(1).vm.isActive).toBe(true)
+    const third = items.at(3).vm
+
+    items.at(3).setProps({ disabled: true })
+    items.at(3).trigger('click')
+    expect(items.at(3).vm.isActive).toBe(false)
+  })
+  // it('do not change state when clicked on disabled item', () => {
+
+  // })
+})
diff --git a/src/components/nav/tests/CNavItem.spec.js b/src/components/nav/tests/CNavItem.spec.js
new file mode 100644
index 00000000..b9c2c4fa
--- /dev/null
+++ b/src/components/nav/tests/CNavItem.spec.js
@@ -0,0 +1,25 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CNavItem'
+
+const ComponentName = 'CNavItem'
+const defaultWrapper = mount(Component)
+const disabledWrapper = mount(Component, {
+  propsData: {
+    disabled: true
+  },
+  slots: {
+    default: 'CNavItem text'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(disabledWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/nav/tests/__snapshots__/CNav.spec.js.snap b/src/components/nav/tests/__snapshots__/CNav.spec.js.snap
new file mode 100644
index 00000000..69a5f4aa
--- /dev/null
+++ b/src/components/nav/tests/__snapshots__/CNav.spec.js.snap
@@ -0,0 +1,52 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CNav renders correctly 1`] = `
+<ul
+  class="nav nav-tabs"
+>
+  CNav items
+</ul>
+`;
+
+exports[`CNav renders correctly 2`] = `
+<ul
+  class="nav nav-pills flex-column nav-fill nav-justified card-header-pills"
+>
+  <li
+    class="nav-item"
+  >
+    <a
+      class="nav-link"
+      href="#"
+      target="_self"
+    />
+  </li>
+  <li
+    class="nav-item"
+  >
+    <a
+      class="nav-link"
+      href="#"
+      target="_self"
+    />
+  </li>
+  <li
+    class="nav-item"
+  >
+    <a
+      class="nav-link"
+      href="#"
+      target="_self"
+    />
+  </li>
+  <li
+    class="nav-item"
+  >
+    <a
+      class="nav-link"
+      href="#"
+      target="_self"
+    />
+  </li>
+</ul>
+`;
diff --git a/src/components/nav/tests/__snapshots__/CNavItem.spec.js.snap b/src/components/nav/tests/__snapshots__/CNavItem.spec.js.snap
new file mode 100644
index 00000000..e1c5ebc6
--- /dev/null
+++ b/src/components/nav/tests/__snapshots__/CNavItem.spec.js.snap
@@ -0,0 +1,29 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CNavItem renders correctly 1`] = `
+<li
+  class="nav-item"
+>
+  <a
+    class="nav-link"
+    href="#"
+    target="_self"
+  />
+</li>
+`;
+
+exports[`CNavItem renders correctly 2`] = `
+<li
+  class="nav-item"
+>
+  <a
+    aria-disabled="true"
+    class="nav-link disabled"
+    href="#"
+    tabindex="-1"
+    target="_self"
+  >
+    CNavItem text
+  </a>
+</li>
+`;
diff --git a/src/components/navbar/CNavbar.vue b/src/components/navbar/CNavbar.vue
new file mode 100644
index 00000000..05970be5
--- /dev/null
+++ b/src/components/navbar/CNavbar.vue
@@ -0,0 +1,49 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+
+export const props = {
+  tag: {
+    type: String,
+    default: 'nav'
+  },
+  light: Boolean,
+  color: String,
+  expandable: {
+    type: [Boolean, String],
+    default: false
+  },
+  fixed: {
+    type: String,
+    validator: val => ['', 'top', 'bottom'].includes(val)
+  },
+  sticky: Boolean
+}
+
+export default {
+  name: 'CNavbar',
+  functional: true,
+  props,
+  render (h, { props, data, children }) {
+    const expandClassSuffix = props.expandable === true ? '' : `-${props.expandable}`
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'navbar',
+        class: [
+          props.light ? 'navbar-light' : 'navbar-dark',
+          {
+            'sticky-top': props.sticky,
+            [`bg-${props.color}`]: props.color,
+            [`fixed-${props.fixed}`]: props.fixed,
+            [`navbar-expand${expandClassSuffix}`]: props.expandable
+          }
+        ],
+        attrs: {
+          role: props.tag === 'nav' ? null : 'navigation'
+        }
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/navbar/CNavbarBrand.vue b/src/components/navbar/CNavbarBrand.vue
new file mode 100644
index 00000000..86a634bf
--- /dev/null
+++ b/src/components/navbar/CNavbarBrand.vue
@@ -0,0 +1,27 @@
+<script>
+import CLink, { propsFactory } from '../link/CLink'
+import { mergeData } from 'vue-functional-data-merge'
+
+const props = Object.assign(
+  propsFactory(), 
+  { tag: { type: String, default: 'div' } }
+)
+
+export default {
+  name: 'CNavbarBrand',
+  functional: true,
+  props,
+  render(h, { props, data, children }) {
+    const isLink = Boolean(props.to || props.href)
+    const tag = isLink ? CLink : props.tag
+    return h(
+      tag,
+      mergeData(data, {
+        staticClass: 'navbar-brand',
+        props: isLink ? props : null
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/navbar/CNavbarNav.vue b/src/components/navbar/CNavbarNav.vue
new file mode 100644
index 00000000..28b9b132
--- /dev/null
+++ b/src/components/navbar/CNavbarNav.vue
@@ -0,0 +1,22 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  name: 'CNavbarNav',
+  functional: true,
+  props:{
+    tag: {
+      type: String,
+      default: 'ul'
+    }
+  },
+  render (h, { props, data, children }) {
+    return h(
+      props.tag,
+      mergeData(data, {
+        staticClass: 'navbar-nav'
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/navbar/CNavbarText.vue b/src/components/navbar/CNavbarText.vue
new file mode 100644
index 00000000..b8ccf331
--- /dev/null
+++ b/src/components/navbar/CNavbarText.vue
@@ -0,0 +1,17 @@
+<template>
+  <component :is="tag" class="navbar-text">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CNavbarText',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  }
+}
+</script>
diff --git a/src/components/navbar/index.js b/src/components/navbar/index.js
new file mode 100644
index 00000000..c75f0096
--- /dev/null
+++ b/src/components/navbar/index.js
@@ -0,0 +1,11 @@
+import CNavbar from './CNavbar'
+import CNavbarBrand from './CNavbarBrand'
+import CNavbarNav from './CNavbarNav'
+import CNavbarText from './CNavbarText'
+
+export {
+  CNavbar,
+  CNavbarBrand,
+  CNavbarNav,
+  CNavbarText
+}
diff --git a/src/components/navbar/tests/CNavbar.spec.js b/src/components/navbar/tests/CNavbar.spec.js
new file mode 100644
index 00000000..355fdac6
--- /dev/null
+++ b/src/components/navbar/tests/CNavbar.spec.js
@@ -0,0 +1,32 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CNavbar'
+
+const ComponentName = 'CNavbar'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    fill: true,
+    justified: true,
+    pills: true,
+    vertical: true,
+    fixed: 'top',
+    expandable: true,
+    light: true,
+    tag: 'div'
+  },
+  slots: {
+    default: 'CNavbar items'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/navbar/tests/CNavbarBrand.spec.js b/src/components/navbar/tests/CNavbarBrand.spec.js
new file mode 100644
index 00000000..f0e6c74d
--- /dev/null
+++ b/src/components/navbar/tests/CNavbarBrand.spec.js
@@ -0,0 +1,25 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CNavbarBrand'
+
+const ComponentName = 'CNavbarBrand'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    href: 'https://coreui.io/'
+  },
+  slots: {
+    default: 'CNavbarBrand'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/navbar/tests/CNavbarNav.spec.js b/src/components/navbar/tests/CNavbarNav.spec.js
new file mode 100644
index 00000000..e45a7b31
--- /dev/null
+++ b/src/components/navbar/tests/CNavbarNav.spec.js
@@ -0,0 +1,25 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CNavbarNav'
+
+const ComponentName = 'CNavbar'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    tag: 'div'
+  },
+  slots: {
+    default: 'CNavbar items'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with content', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/navbar/tests/__snapshots__/CNavbar.spec.js.snap b/src/components/navbar/tests/__snapshots__/CNavbar.spec.js.snap
new file mode 100644
index 00000000..2f1635d7
--- /dev/null
+++ b/src/components/navbar/tests/__snapshots__/CNavbar.spec.js.snap
@@ -0,0 +1,22 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CNavbar renders correctly 1`] = `
+<nav
+  class="navbar navbar-dark"
+/>
+`;
+
+exports[`CNavbar renders correctly 2`] = `
+<div
+  class="navbar navbar-light fixed-top navbar-expand"
+  fill="true"
+  justified="true"
+  pills="true"
+  role="navigation"
+  vertical="true"
+>
+  <template>
+    CNavbar items
+  </template>
+</div>
+`;
diff --git a/src/components/navbar/tests/__snapshots__/CNavbarBrand.spec.js.snap b/src/components/navbar/tests/__snapshots__/CNavbarBrand.spec.js.snap
new file mode 100644
index 00000000..9bd0f418
--- /dev/null
+++ b/src/components/navbar/tests/__snapshots__/CNavbarBrand.spec.js.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CNavbarBrand renders correctly 1`] = `
+<div
+  class="navbar-brand"
+/>
+`;
+
+exports[`CNavbarBrand renders correctly 2`] = `
+<a
+  class="navbar-brand"
+  href="https://coreui.io/"
+  target="_self"
+>
+  <template>
+    CNavbarBrand
+  </template>
+</a>
+`;
diff --git a/src/components/navbar/tests/__snapshots__/CNavbarNav.spec.js.snap b/src/components/navbar/tests/__snapshots__/CNavbarNav.spec.js.snap
new file mode 100644
index 00000000..d8a9f986
--- /dev/null
+++ b/src/components/navbar/tests/__snapshots__/CNavbarNav.spec.js.snap
@@ -0,0 +1,17 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CNavbar renders correctly 1`] = `
+<ul
+  class="navbar-nav"
+/>
+`;
+
+exports[`CNavbar renders correctly with content 1`] = `
+<div
+  class="navbar-nav"
+>
+  <template>
+    CNavbar items
+  </template>
+</div>
+`;
diff --git a/src/components/pagination/CPagination.vue b/src/components/pagination/CPagination.vue
new file mode 100644
index 00000000..bf0cae5e
--- /dev/null
+++ b/src/components/pagination/CPagination.vue
@@ -0,0 +1,208 @@
+<template>
+  <nav aria-label="pagination">
+    <ul :class="computedClasses">
+      <li v-if="doubleArrows" :class="backArrowsClasses">
+        <CLink
+          class="page-link"
+          @click="setPage(1)"
+          :disabled="activePage === 1"
+          aria-label="Go to first page"
+          :aria-disabled="activePage === 1"
+        >
+          <slot name="first-button">&laquo;</slot>
+        </CLink>
+      </li>
+      <li v-if="arrows" :class="backArrowsClasses">
+        <CLink
+          class="page-link"
+          @click="setPage(activePage - 1)"
+          :disabled="activePage === 1"
+          aria-label="Go to previous page"
+          :aria-disabled="activePage === 1"
+        >
+          <slot name="previous-button">&lsaquo;</slot>
+        </CLink>
+      </li>
+      <li
+        v-if="beforeDots"
+        role="separator"
+        class="page-item disabled"
+      >
+        <span class="page-link">…</span>
+      </li>
+
+      <li
+        v-for="item in items"
+        :key="item"
+        :class="[{ 'active': activePage === item }, 'page-item']"
+      >
+        <CLink
+          class="page-link c-page-link-number"
+          @click="setPage(item, $event)"
+          :aria-label="activePage === item ? `Current page ${item}` : `Go to page ${item}`"
+        >
+          {{item}}
+        </CLink>
+      </li>
+
+      <li
+        v-if="afterDots"
+        role="separator"
+        class="page-item disabled"
+      >
+        <span class="page-link">…</span>
+      </li>
+      <li
+        v-if="arrows"
+        :class="nextArrowsClasses"
+      >
+        <CLink
+          class="page-link"
+          @click="setPage(activePage + 1)"
+          :disabled="activePage === pages"
+          aria-label="Go to next page"
+          :aria-disabled="activePage === pages"
+        >
+          <slot name="next-button">&rsaquo;</slot>
+        </CLink>
+      </li>
+      <li v-if="doubleArrows" :class="nextArrowsClasses">
+        <CLink
+          class="page-link"
+          @click="setPage(pages)"
+          :disabled="activePage === pages"
+          aria-label="Go to last page"
+          :aria-disabled="activePage === pages"
+        >
+          <slot name="last-button">&raquo;</slot>
+        </CLink>
+      </li>
+    </ul>
+  </nav>
+</template>
+
+<script>
+  import CLink from '../link/CLink'
+
+  export default {
+    name: 'CPagination',
+    components: {
+      CLink
+    },
+    props: {
+      activePage: {
+        type: Number,
+        default: 1
+      },
+      pages: {
+        type: Number,
+        default: 10
+      },
+      size: {
+        type: String,
+        validator: val => ['', 'sm', 'lg'].includes(val)
+      },
+      align: {
+        type: String,
+        default: 'start',
+        validator: val => ['start', 'center', 'end'].includes(val)
+      },
+      limit: {
+        type: Number,
+        default: 5
+      },
+      dots: {
+        type: Boolean,
+        default: true
+      },
+      arrows: {
+        type: Boolean,
+        default: true
+      },
+      doubleArrows: {
+        type: Boolean,
+        default: true
+      }
+    },
+    watch: {
+      pages: {
+        immediate: true,
+        handler (val) {
+          if (val && val < this.activePage) {
+            this.$emit('update:activePage', val, true)
+          }
+        }
+      }
+    },
+    computed: {
+      backArrowsClasses () {
+        return ['page-item', { 'disabled': this.activePage === 1 }]
+      },
+      nextArrowsClasses () {
+        return ['page-item', { 'disabled': this.activePage === this.pages }]
+      },
+      computedClasses () {
+        const sizeClass = this.size ? `pagination-${this.size}` : ''
+        return `pagination ${sizeClass} justify-content-${this.align}`
+      },
+      showDots () {
+        return this.dots && this.limit > 4 && this.limit < this.pages
+      },
+      maxPrevItems () {
+        return Math.floor((this.limit - 1) / 2)
+      },
+      maxNextItems () {
+        return Math.ceil((this.limit - 1) / 2)
+      },
+      beforeDots () {
+        return this.showDots && this.activePage > this.maxPrevItems + 1
+      },
+      afterDots () {
+        return this.showDots && this.activePage < this.pages - this.maxNextItems
+      },
+      computedLimit () {
+        return this.limit - this.afterDots - this.beforeDots
+      },
+      range () {
+        return this.activePage + this.maxNextItems
+      },
+      lastItem () {
+        return this.range >= this.pages ? this.pages : this.range - this.afterDots
+      },
+      itemsAmount () {
+        return this.pages < this.computedLimit ? this.pages : this.computedLimit
+      },
+      items () {
+        if (this.activePage - this.maxPrevItems <= 1 ) {
+          return Array.from({ length: this.itemsAmount }, (v, i) => i + 1 )
+        } else {
+          return Array.from({length: this.itemsAmount}, (v, i) => {
+            return this.lastItem - i
+          }).reverse()
+        }
+      }
+    },
+    methods: {
+      setPage (number, e = null) {
+        if (number === this.activePage) {
+          return
+        }
+        this.$emit('update:activePage', number, false)
+        if (e) {
+          this.changeFocus(e)
+        }
+      },
+      changeFocus (e) {
+        const items = this.$el.getElementsByClassName('c-page-link-number')
+        const focused = Number(e.target.innerHTML)
+        this.$nextTick(() => {
+          for (let i = 0; i < items.length; i++) {
+            if (Number(items[i].innerHTML) === focused) {
+              items[i].focus()
+            }
+          }
+        })
+      }
+    }
+  }
+</script>
diff --git a/src/components/pagination/index.js b/src/components/pagination/index.js
new file mode 100644
index 00000000..1e2c9cc0
--- /dev/null
+++ b/src/components/pagination/index.js
@@ -0,0 +1,5 @@
+import CPagination from './CPagination'
+
+export {
+  CPagination
+}
diff --git a/src/components/pagination/tests/CPagination.spec.js b/src/components/pagination/tests/CPagination.spec.js
new file mode 100644
index 00000000..6407f7ea
--- /dev/null
+++ b/src/components/pagination/tests/CPagination.spec.js
@@ -0,0 +1,58 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CPagination'
+
+const ComponentName = 'CPagination'
+const wrapper = mount(Component, {
+  slots: {
+    'first-button': 'Go to first',
+    'previous-button': 'Go to previous',
+    'next-button': 'Go to next',
+    'last-button': 'Go to last',
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    activePage: 9,
+    pages: 20,
+    size: 'lg',
+    align: 'center',
+    limit: 7,
+    dots: false,
+    arrows: false,
+    doubleArrows: false
+  },
+
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('emits update:activePage event when number of pages change', () => {
+    customWrapper.setProps({ pages: 6 })
+    expect(customWrapper.emitted()['update:activePage'][0]).toMatchObject([6, true])
+  })
+  it('emits update:activePage event when inactive item is clicked', () => {
+    const links = wrapper.findAll('.page-link')
+    links.at(2).trigger('click')
+    expect(wrapper.emitted()['update:activePage']).not.toBeTruthy()
+
+    links.at(4).trigger('click')
+    expect(wrapper.emitted()['update:activePage'][0]).toMatchObject([3, false])
+  })
+  it('calls focus function when clicked on numeric item', () => {
+    const spy = jest.spyOn(wrapper.vm, 'changeFocus')
+    const links = wrapper.findAll('.page-link')
+    links.at(7).trigger('click')
+    expect(spy).not.toBeCalled()
+    links.at(4).trigger('click')
+    expect(spy).toBeCalled()
+  })
+})
diff --git a/src/components/pagination/tests/__snapshots__/CPagination.spec.js.snap b/src/components/pagination/tests/__snapshots__/CPagination.spec.js.snap
new file mode 100644
index 00000000..ecbdfcf6
--- /dev/null
+++ b/src/components/pagination/tests/__snapshots__/CPagination.spec.js.snap
@@ -0,0 +1,258 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CPagination renders correctly 1`] = `
+<nav
+  aria-label="pagination"
+>
+  <ul
+    class="pagination  justify-content-start"
+  >
+    <li
+      class="page-item disabled"
+    >
+      <a
+        aria-disabled="true"
+        aria-label="Go to first page"
+        class="page-link disabled"
+        href="#"
+        tabindex="-1"
+        target="_self"
+      >
+        Go to first
+      </a>
+    </li>
+     
+    <li
+      class="page-item disabled"
+    >
+      <a
+        aria-disabled="true"
+        aria-label="Go to previous page"
+        class="page-link disabled"
+        href="#"
+        tabindex="-1"
+        target="_self"
+      >
+        Go to previous
+      </a>
+    </li>
+     
+    <!---->
+     
+    <li
+      class="active page-item"
+    >
+      <a
+        aria-label="Current page 1"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        1
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 2"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        2
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 3"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        3
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 4"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        4
+      
+      </a>
+    </li>
+     
+    <li
+      class="page-item disabled"
+      role="separator"
+    >
+      <span
+        class="page-link"
+      >
+        …
+      </span>
+    </li>
+     
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to next page"
+        class="page-link"
+        href="#"
+        target="_self"
+      >
+        Go to next
+      </a>
+    </li>
+     
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to last page"
+        class="page-link"
+        href="#"
+        target="_self"
+      >
+        Go to last
+      </a>
+    </li>
+  </ul>
+</nav>
+`;
+
+exports[`CPagination renders correctly 2`] = `
+<nav
+  aria-label="pagination"
+>
+  <ul
+    class="pagination pagination-lg justify-content-center"
+  >
+    <!---->
+     
+    <!---->
+     
+    <!---->
+     
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 6"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        6
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 7"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        7
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 8"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        8
+      
+      </a>
+    </li>
+    <li
+      class="active page-item"
+    >
+      <a
+        aria-label="Current page 9"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        9
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 10"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        10
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 11"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        11
+      
+      </a>
+    </li>
+    <li
+      class="page-item"
+    >
+      <a
+        aria-label="Go to page 12"
+        class="page-link c-page-link-number"
+        href="#"
+        target="_self"
+      >
+        
+        12
+      
+      </a>
+    </li>
+     
+    <!---->
+     
+    <!---->
+     
+    <!---->
+  </ul>
+</nav>
+`;
diff --git a/src/components/progress/CProgress.vue b/src/components/progress/CProgress.vue
new file mode 100644
index 00000000..4f756ae6
--- /dev/null
+++ b/src/components/progress/CProgress.vue
@@ -0,0 +1,43 @@
+<template>
+  <div 
+    :class="['progress', size && `progress-${size}`]" 
+    :style="{ height }"
+  >
+    <slot>
+      <CProgressBar :value="value"/>
+    </slot>
+  </div>
+</template>
+
+<script>
+import CProgressBar from './CProgressBar'
+import shared from './shared-props'
+
+const props = {
+  ...shared,
+  height: String,
+  size: {
+    type: String,
+    validator: val => ['', 'xs', 'sm'].includes(val)
+  },
+}
+
+export default {
+  name:'CProgress',
+  components: { CProgressBar },
+  props,
+  mounted () {
+    /* istanbul ignore next */ 
+    if (this.height && process && process.env && process.env.NODE_ENV === 'development') {
+      console.error("CProgress component: 'height' prop is deprecated and will be removed in the next version. Use 'size' prop instead or pass custom height in 'style' attribute.")
+    }
+  },
+  provide () {
+    const progress = {}
+    Object.defineProperty(progress, 'props', {
+      get: () => this._props
+    })
+    return { progress }
+  }
+}
+</script>
diff --git a/src/components/progress/CProgressBar.vue b/src/components/progress/CProgressBar.vue
new file mode 100644
index 00000000..82da0503
--- /dev/null
+++ b/src/components/progress/CProgressBar.vue
@@ -0,0 +1,68 @@
+<template>
+  <div
+    :class="progressBarClasses"
+    :style="progressBarStyles"
+    role="progressbar"
+    aria-valuemin="0"
+    :aria-valuemax="props.max.toString()"
+    :aria-valuenow="computedValue"
+  >
+    <slot>{{ text }}</slot>
+  </div>
+</template>
+
+<script>
+import props from './shared-props'
+
+export default {
+  name: 'CProgressBar',
+  props,
+  inject: {
+    progress: {
+      default: { props: {} }
+    }
+  },
+  computed: {
+    directlyDeclaredProps () {
+      return Object.keys(this.$options.propsData)
+    },
+    props () {
+      return Object.keys(props).reduce((computedProps, key) => {
+        const propIsDirectlyDeclared = this.directlyDeclaredProps.includes(key)
+        const parentPropExists = this.progress.props[key] !== undefined
+        const isInherited = parentPropExists && !propIsDirectlyDeclared
+        computedProps[key] = isInherited ? this.progress.props[key] : this[key]
+        return computedProps
+      }, {})
+    },
+    progressBarClasses () {
+      return [
+        'progress-bar',
+        {
+          [`bg-${this.props.color}`]: this.props.color,
+          'progress-bar-striped': this.props.striped || this.props.animated,
+          'progress-bar-animated': this.props.animated
+        }
+      ]
+    },
+
+    progressBarStyles () {
+      return { width: `${(100 * (this.props.value / this.props.max))}%` }
+    },
+    progressValue () {
+      const p = Math.pow(10, this.props.precision)
+      return Math.round((100 * p * this.props.value) / this.props.max) / p
+    },
+    computedValue () {
+      return this.props.value.toFixed(props.precision)
+    },
+    text () {
+      if (this.props.showPercentage) {
+        return this.progressValue + '%'
+      } else if (this.props.showValue) {
+        return this.computedValue
+      }  
+    }
+  }
+}
+</script>
diff --git a/src/components/progress/index.js b/src/components/progress/index.js
new file mode 100644
index 00000000..bb90eeec
--- /dev/null
+++ b/src/components/progress/index.js
@@ -0,0 +1,7 @@
+import CProgress from './CProgress'
+import CProgressBar from './CProgressBar'
+
+export {
+  CProgress,
+  CProgressBar
+}
diff --git a/src/components/progress/shared-props.js b/src/components/progress/shared-props.js
new file mode 100644
index 00000000..9e10bb2e
--- /dev/null
+++ b/src/components/progress/shared-props.js
@@ -0,0 +1,19 @@
+export default {
+  color: String,
+  striped: Boolean,
+  animated: Boolean,
+  precision: {
+    type: Number,
+    default: 0
+  },
+  showPercentage: Boolean,
+  showValue: Boolean,
+  max: {
+    type: Number,
+    default: 100
+  },
+  value: {
+    type: Number,
+    default: 0
+  }
+}
diff --git a/src/components/progress/tests/CProgress.spec.js b/src/components/progress/tests/CProgress.spec.js
new file mode 100644
index 00000000..9e17ea2e
--- /dev/null
+++ b/src/components/progress/tests/CProgress.spec.js
@@ -0,0 +1,30 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CProgress'
+
+const ComponentName = 'CProgress'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    color: 'black',
+    value: 20,
+    size: 'sm',
+    height: '2rem'
+  },
+  attrs: {
+    class: 'test'
+  }
+})
+
+
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/progress/tests/CProgressBar.spec.js b/src/components/progress/tests/CProgressBar.spec.js
new file mode 100644
index 00000000..5050374e
--- /dev/null
+++ b/src/components/progress/tests/CProgressBar.spec.js
@@ -0,0 +1,35 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CProgressBar'
+
+const ComponentName = 'CProgressBar'
+const defaultWrapper = mount(Component)
+
+const customWrapper = mount(Component,{
+  propsData: {
+    color: 'success',
+    value: 50,
+    striped: true,
+    showValue: true,
+    max: 200
+  },
+  slots: {
+    default: '234'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('renders progress correctly', () => {
+    expect(customWrapper.vm.text).toBe('50')
+    customWrapper.setProps({ showPercentage: true })
+    expect(customWrapper.vm.text).toBe('25%')
+  })
+})
diff --git a/src/components/progress/tests/__snapshots__/CProgress.spec.js.snap b/src/components/progress/tests/__snapshots__/CProgress.spec.js.snap
new file mode 100644
index 00000000..5bbd71c7
--- /dev/null
+++ b/src/components/progress/tests/__snapshots__/CProgress.spec.js.snap
@@ -0,0 +1,36 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CProgress renders correctly 1`] = `
+<div
+  class="progress"
+>
+  <div
+    aria-valuemax="100"
+    aria-valuemin="0"
+    aria-valuenow="0"
+    class="progress-bar"
+    role="progressbar"
+    style="width: 0%;"
+  >
+    
+  </div>
+</div>
+`;
+
+exports[`CProgress renders correctly 2`] = `
+<div
+  class="test"
+  style="height: 2rem;"
+>
+  <div
+    aria-valuemax="100"
+    aria-valuemin="0"
+    aria-valuenow="20"
+    class="progress-bar bg-black"
+    role="progressbar"
+    style="width: 20%;"
+  >
+    
+  </div>
+</div>
+`;
diff --git a/src/components/progress/tests/__snapshots__/CProgressBar.spec.js.snap b/src/components/progress/tests/__snapshots__/CProgressBar.spec.js.snap
new file mode 100644
index 00000000..8669bc7b
--- /dev/null
+++ b/src/components/progress/tests/__snapshots__/CProgressBar.spec.js.snap
@@ -0,0 +1,27 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CProgressBar renders correctly 1`] = `
+<div
+  aria-valuemax="100"
+  aria-valuemin="0"
+  aria-valuenow="0"
+  class="progress-bar"
+  role="progressbar"
+  style="width: 0%;"
+>
+  
+</div>
+`;
+
+exports[`CProgressBar renders correctly 2`] = `
+<div
+  aria-valuemax="200"
+  aria-valuemin="0"
+  aria-valuenow="50"
+  class="progress-bar bg-success progress-bar-striped"
+  role="progressbar"
+  style="width: 25%;"
+>
+  234
+</div>
+`;
diff --git a/src/components/render-function/CRenderFunction.vue b/src/components/render-function/CRenderFunction.vue
new file mode 100644
index 00000000..40290cd6
--- /dev/null
+++ b/src/components/render-function/CRenderFunction.vue
@@ -0,0 +1,95 @@
+<script>
+import clonedeep from 'lodash.clonedeep'
+export default {
+  name: 'CRenderFunction',
+  props: {
+    contentToRender: Array,
+    flat: Boolean
+  },
+  computed: {
+    copiedContent () {
+      return clonedeep(this.contentToRender)
+    },
+    content () {
+      if (!this.flat) {
+        return this.copiedContent
+      } else {
+        return this.convertedContent[0]
+      }
+    },
+    convertedContent () {
+      return this.copiedContent.map(item => this.convertItem(item))
+    }
+  },
+  methods: {
+    convertItem (item) {
+      if (typeof item === 'string') {
+        return item
+      }
+      let newItem = []
+      newItem[0] = item._name || 'div'
+      newItem[1] = {}
+      newItem[1].props = this.getProps(item)
+
+      this.$options.renderFunctionOptions.forEach(option => {
+        //on option doesn't work, possible to use only nativeOn
+        if (item[`_${option}`]) {
+          newItem[1][option] = item[`_${option}`]
+        }
+      })
+
+      if (item._children) {
+        newItem[2] = item._children.map(item => this.convertItem(item))
+      }
+      return newItem
+    },
+    getProps (item) {
+      return Object.keys(item).reduce((itemProps, key) => {
+        if (!key.includes('_')) {
+          itemProps[key] = item[key]
+        }
+        return itemProps
+      }, {})
+    }
+  },
+  renderFunctionOptions:  [
+    'attrs',
+    'directives',
+    'on',
+    'nativeOn',
+    'class',
+    'style',
+    'domProps',
+    'scopedSlots',
+    'slot',
+    'key',
+    'ref',
+    'refInFor'
+  ],
+  render (h) {
+    const computeRenderFunction = (renderFunction) => {
+      return renderFunction.map(item => {
+        if (Array.isArray(item)) {
+          return item.map(child => {
+            if (typeof child === 'string') {
+              return child
+            } else if (Array.isArray(child)) {
+              const el = computeRenderFunction(child)
+              return h(...el)
+            } else if (child.slot) {
+              return this.$scopedSlots[child.slot]()
+            }
+          })
+        }
+        return item
+      })
+    }
+    
+    if (Array.isArray(this.content) && this.content.length) {
+      return h(...computeRenderFunction(this.content))
+    } else {
+      return h(false)
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/render-function/index.js b/src/components/render-function/index.js
new file mode 100644
index 00000000..7d1cd8e8
--- /dev/null
+++ b/src/components/render-function/index.js
@@ -0,0 +1,5 @@
+import CRenderFunction from './CRenderFunction'
+
+export {
+  CRenderFunction
+}
\ No newline at end of file
diff --git a/src/components/render-function/tests/CRenderFunction.spec.js b/src/components/render-function/tests/CRenderFunction.spec.js
new file mode 100644
index 00000000..21cc073a
--- /dev/null
+++ b/src/components/render-function/tests/CRenderFunction.spec.js
@@ -0,0 +1,59 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CRenderFunction'
+
+const ComponentName = 'CRenderFunction'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    contentToRender: [
+      'div', 
+      [
+        [
+          'div',
+          [
+            'text',
+            { slot: 'slot_name'},
+            { slot2: 'no effect object'}
+          ] 
+        ]
+      ]
+    ]
+  },
+  slots: {
+    slot_name: 'slot content'
+  }
+})
+
+const flatWrapper = mount(Component, {
+  propsData: {
+    flat: true,
+    contentToRender: [
+      {
+        '_name': 'p',
+        '_attrs': { class: 'class' },
+        someProp: true,
+        '_children': [
+          '1st level child',
+          {
+            '_attrs': { class: 'class' },
+          }
+        ]
+      }
+    ]
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('not rendering anything without contentToRender', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly with flat structure', () => {
+    expect(flatWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/render-function/tests/__snapshots__/CRenderFunction.spec.js.snap b/src/components/render-function/tests/__snapshots__/CRenderFunction.spec.js.snap
new file mode 100644
index 00000000..d3294a6f
--- /dev/null
+++ b/src/components/render-function/tests/__snapshots__/CRenderFunction.spec.js.snap
@@ -0,0 +1,22 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CRenderFunction not rendering anything without contentToRender 1`] = `<!---->`;
+
+exports[`CRenderFunction renders correctly 1`] = `
+<div>
+  <div>
+    textslot content
+  </div>
+</div>
+`;
+
+exports[`CRenderFunction renders correctly with flat structure 1`] = `
+<p
+  class="class"
+>
+  1st level child
+  <div
+    class="class"
+  />
+</p>
+`;
diff --git a/src/components/scrollbar/CScrollbar.vue b/src/components/scrollbar/CScrollbar.vue
new file mode 100644
index 00000000..382fbba9
--- /dev/null
+++ b/src/components/scrollbar/CScrollbar.vue
@@ -0,0 +1,82 @@
+<script>
+// this component is a refector of vue-perfect-scrollbar component https://github.com/lecion/vue-perfect-scrollbar
+import PerfectScrollbar from 'perfect-scrollbar'
+
+export default {
+  name: 'CScrollbar',
+  props: {
+    settings: {
+      type: Object,
+      default () {
+        return {}
+      },
+    },
+    switcher: {
+      type: Boolean,
+      default: true
+    },
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+
+  watch: {
+    switcher (val) {
+      if (!val) {
+        this.__uninit()
+      } else {
+        this.__init()
+      }
+    }
+  },
+
+  mounted () {
+    if (!this.$isServer && this.switcher) {
+      this.__init()
+    }
+  },
+
+  updated () {
+    this.$nextTick(this.__update)
+  },
+
+  beforeDestroy () {
+    this.__uninit()
+  },
+
+  methods: {
+    __init() {
+      if (!this._ps_bar) {
+        this.__createPerfectScrollbar()
+      }
+    },
+
+    __createPerfectScrollbar() {
+      this._ps_bar = new PerfectScrollbar(this.$el, this.settings)
+    },
+    
+    __uninit() {
+      if (this._ps_bar) {
+        this._ps_bar.destroy()
+        this._ps_bar = null
+      }
+    },
+    __update() {
+      if (this._ps_bar) {
+        this._ps_bar.update()
+      }
+    }
+  },
+
+  render (h) {
+    return h(
+      this.tag,
+      { style: 'position: relative' },
+      this.$slots.default
+    )
+  }
+}
+</script>
+
+<style scoped src="perfect-scrollbar/css/perfect-scrollbar.css"></style>
\ No newline at end of file
diff --git a/src/components/scrollbar/index.js b/src/components/scrollbar/index.js
new file mode 100644
index 00000000..0d8e5d17
--- /dev/null
+++ b/src/components/scrollbar/index.js
@@ -0,0 +1,5 @@
+import CScrollbar from './CScrollbar'
+
+export {
+  CScrollbar
+}
\ No newline at end of file
diff --git a/src/components/scrollbar/tests/CScrollbar.spec.js b/src/components/scrollbar/tests/CScrollbar.spec.js
new file mode 100644
index 00000000..52980e82
--- /dev/null
+++ b/src/components/scrollbar/tests/CScrollbar.spec.js
@@ -0,0 +1,71 @@
+import { mount } from '@vue/test-utils'
+import CSidebarNav from '../../template/CSidebarNav'
+import CSidebar from '../../template/CSidebar'
+import Component from '../CScrollbar'
+import Vue from 'vue'
+
+
+const ComponentName = 'CScrollbar'
+const wrapper = mount(Component, {
+  propsData: {
+    switcher: false
+  }
+})
+
+const Sidebar = Vue.extend({
+  components: { CSidebar, CSidebarNav },
+  data () {
+    return {
+      minimized: false
+    }
+  },
+  render (h) {
+    return h(
+      'CSidebar', 
+      { props: { minimize: this.minimized } }, 
+      [h('CSidebarNav')]
+    )
+  }
+})
+
+const sidebarWrapper = mount(Sidebar)
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly in sidebar', () => {
+    expect(sidebarWrapper.element).toMatchSnapshot()
+  })
+  it('do not throws errors on updates when perfect scrollbar is not set', () => {
+    try {
+      wrapper.vm.__uninit()
+      wrapper.vm.__update()
+    } catch (e) {
+      const errors = e
+    }
+    expect(typeof errors).toBe('undefined')
+  })
+  it('do not initialize new instance when one is already set', () => {
+    wrapper.setProps({ switcher: true })
+    const spy = jest.spyOn(wrapper.vm, '__createPerfectScrollbar')
+    wrapper.vm.__init()
+    expect(spy).not.toBeCalled()
+  })
+  it('calls __uninit function on switch to false', () => {
+    const spy = jest.spyOn(wrapper.vm, '__uninit')
+    expect(spy).not.toBeCalled()
+    wrapper.setProps({ switcher: false })
+    expect(spy).toBeCalled()
+  })
+  it('calls __uninit function before destroy', () => {
+    const spy = jest.spyOn(wrapper.vm, '__uninit')
+    spy.mockClear()
+    expect(spy).not.toBeCalled()
+    wrapper.destroy()
+    expect(spy).toBeCalled()
+  })
+})
diff --git a/src/components/scrollbar/tests/__snapshots__/CScrollbar.spec.js.snap b/src/components/scrollbar/tests/__snapshots__/CScrollbar.spec.js.snap
new file mode 100644
index 00000000..ad0d584e
--- /dev/null
+++ b/src/components/scrollbar/tests/__snapshots__/CScrollbar.spec.js.snap
@@ -0,0 +1,39 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CScrollbar .vue renders correctly 1`] = `
+<div
+  style="position: relative;"
+/>
+`;
+
+exports[`CScrollbar .vue renders correctly in sidebar 1`] = `
+<div
+  class="c-sidebar c-sidebar-dark c-sidebar-lg-show c-sidebar-fixed"
+>
+  <ul
+    class="c-sidebar-nav h-100 ps"
+    style="position: relative;"
+  >
+    <div
+      class="ps__rail-x"
+      style="left: 0px; top: 0px;"
+    >
+      <div
+        class="ps__thumb-x"
+        style="left: 0px; width: 0px;"
+        tabindex="0"
+      />
+    </div>
+    <div
+      class="ps__rail-y"
+      style="top: 0px; left: 0px;"
+    >
+      <div
+        class="ps__thumb-y"
+        style="top: 0px; height: 0px;"
+        tabindex="0"
+      />
+    </div>
+  </ul>
+</div>
+`;
diff --git a/src/components/spinner/CSpinner.vue b/src/components/spinner/CSpinner.vue
new file mode 100644
index 00000000..e0c1a91e
--- /dev/null
+++ b/src/components/spinner/CSpinner.vue
@@ -0,0 +1,36 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  name: 'CSpinner',
+  functional: true,
+  props: {
+    grow: Boolean,
+    color: String,
+    size: String,
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+  render(h, { props, data }) {
+    const type = props.grow ? 'grow' : 'border'
+    return h(
+      props.tag,
+      mergeData(data, {
+        attrs: {
+          role: 'status',
+          'aria-hidden': 'false',
+          'aria-label': 'Loading'
+        },
+        class: [
+          `spinner-${type}`,
+          {
+            [`spinner-${type}-${props.size}`]: props.size,
+            [`text-${props.color}`]: props.color
+          }
+        ]
+      })
+    )
+  }
+}
+</script>
diff --git a/src/components/spinner/index.js b/src/components/spinner/index.js
new file mode 100644
index 00000000..dc37bcb1
--- /dev/null
+++ b/src/components/spinner/index.js
@@ -0,0 +1,5 @@
+import CSpinner from './CSpinner'
+
+export {
+  CSpinner
+}
diff --git a/src/components/spinner/tests/CSpinner.spec.js b/src/components/spinner/tests/CSpinner.spec.js
new file mode 100644
index 00000000..7dcf3720
--- /dev/null
+++ b/src/components/spinner/tests/CSpinner.spec.js
@@ -0,0 +1,25 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSpinner'
+
+const ComponentName = 'CSpinner'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    grow: true,
+    color: 'success',
+    size: 'sm'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
+
diff --git a/src/components/spinner/tests/__snapshots__/CSpinner.spec.js.snap b/src/components/spinner/tests/__snapshots__/CSpinner.spec.js.snap
new file mode 100644
index 00000000..54eeeeca
--- /dev/null
+++ b/src/components/spinner/tests/__snapshots__/CSpinner.spec.js.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSpinner renders correctly 1`] = `
+<div
+  aria-hidden="false"
+  aria-label="Loading"
+  class="spinner-border"
+  role="status"
+/>
+`;
+
+exports[`CSpinner renders correctly 2`] = `
+<div
+  aria-hidden="false"
+  aria-label="Loading"
+  class="spinner-grow spinner-grow-sm text-success"
+  role="status"
+/>
+`;
diff --git a/src/components/switch/CSwitch.vue b/src/components/switch/CSwitch.vue
new file mode 100644
index 00000000..07ac7ff2
--- /dev/null
+++ b/src/components/switch/CSwitch.vue
@@ -0,0 +1,80 @@
+<template>
+  <label :class="classList">
+    <input
+      v-bind="$attrs"
+      :type="type"
+      :checked="state"
+      class="c-switch-input form-check-input"
+      @change="onChange"
+    >
+    <span
+      :data-checked="labelOn"
+      :data-unchecked="labelOff"
+      class="c-switch-slider"
+    >
+    </span>
+  </label>
+</template>
+
+<script>
+export default {
+  name:'CSwitch',
+  inheritAttrs: false,
+  props: {
+    color: String,
+    variant: {
+      type: String,
+      validator: value => ['', 'outline', 'opposite', '3d'].includes(value)
+    },
+    size: {
+      type: String,
+      validator: value => ['','lg', 'sm'].includes(value)
+    },
+    shape: {
+      type: String,
+      validator: value => ['','pill', 'square'].includes(value)
+    },
+    checked: Boolean,
+    labelOn: String,
+    labelOff: String,
+    type: {
+      type: String,
+      default: 'checkbox',
+      validator: type => ['checkbox', 'radio'].includes(type)
+    }
+  },
+  data () {
+    return {
+      state: undefined
+    }
+  },
+  watch: {
+    checked: {
+      immediate: true,
+      handler (val) {
+        this.state = val
+      }
+    }
+  },
+  computed: {
+    classList () {
+      const variant = this.variant ? `-${this.variant}` : ''
+      return [
+        'c-switch form-check-label',
+        {
+          [`c-switch-${this.size}`]: this.size,
+          [`c-switch-${this.shape}`]: this.shape,
+          [`c-switch${variant}-${this.color}`]: this.color,
+          'c-switch-label': this.labelOn || this.labelOff
+        }
+      ]
+    }
+  },
+  methods: {
+    onChange (e) {
+      this.state = e.target.checked
+      this.$emit('update:checked', e.target.checked, e)
+    }
+  }
+}
+</script>
diff --git a/src/components/switch/index.js b/src/components/switch/index.js
new file mode 100644
index 00000000..45f20994
--- /dev/null
+++ b/src/components/switch/index.js
@@ -0,0 +1,5 @@
+import CSwitch from './CSwitch'
+
+export {
+  CSwitch
+}
diff --git a/src/components/switch/tests/CSwitch.spec.js b/src/components/switch/tests/CSwitch.spec.js
new file mode 100644
index 00000000..7c7cf6ef
--- /dev/null
+++ b/src/components/switch/tests/CSwitch.spec.js
@@ -0,0 +1,52 @@
+import { mount } from "@vue/test-utils";
+import Component from '../CSwitch'
+
+const ComponentName = 'CSwitch'
+const radioWrapper = mount(Component, {
+  propsData: {
+    type: 'radio'
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    color: 'info',
+    variant: 'opposite',
+    size: 'lg',
+    shape: 'pill',
+    name:'myName',
+    id:'myId',
+    checked: true,
+    value: 'checked',
+    required: true,
+    dataOn: 'dataOn',
+    dataOff: 'dataOff'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(radioWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('emits events correctly when checked', () => {
+    const updateEvents = () => customWrapper.emitted()['update:checked']
+    const lastEmittedUpdateValue = () => updateEvents().slice(-1)[0][0]
+
+    customWrapper.find('input').setChecked(false)
+    expect(lastEmittedUpdateValue()).toBe(false)
+
+    customWrapper.find('input').setChecked(true)
+    expect(lastEmittedUpdateValue()).toBe(true)
+
+  })
+  it('emits event correctly when checked on type radio', () => {
+    radioWrapper.find('input').setChecked(true)
+    expect(radioWrapper.emitted()['update:checked']).toBeTruthy()
+  })
+})
diff --git a/src/components/switch/tests/__snapshots__/CSwitch.spec.js.snap b/src/components/switch/tests/__snapshots__/CSwitch.spec.js.snap
new file mode 100644
index 00000000..5a8b1ffc
--- /dev/null
+++ b/src/components/switch/tests/__snapshots__/CSwitch.spec.js.snap
@@ -0,0 +1,37 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSwitch renders correctly 1`] = `
+<label
+  class="c-switch form-check-label"
+>
+  <input
+    class="c-switch-input form-check-input"
+    type="radio"
+  />
+   
+  <span
+    class="c-switch-slider"
+  />
+</label>
+`;
+
+exports[`CSwitch renders correctly 2`] = `
+<label
+  class="c-switch form-check-label c-switch-lg c-switch-pill c-switch-opposite-info"
+>
+  <input
+    class="c-switch-input form-check-input"
+    dataoff="dataOff"
+    dataon="dataOn"
+    id="myId"
+    name="myName"
+    required="required"
+    type="checkbox"
+    value="checked"
+  />
+   
+  <span
+    class="c-switch-slider"
+  />
+</label>
+`;
diff --git a/src/components/table/CDataTable.vue b/src/components/table/CDataTable.vue
new file mode 100644
index 00000000..d36465f7
--- /dev/null
+++ b/src/components/table/CDataTable.vue
@@ -0,0 +1,634 @@
+<template>
+  <div>
+    <div 
+      v-if="itemsPerPageSelect || haveFilterOption" 
+      class="row my-2 mx-0"
+    >
+      <div
+        class="col-sm-6 form-inline p-0"
+        v-if="haveFilterOption"
+      >
+        <template v-if="tableFilter">
+          <label class="mfe-2">{{tableFilterData.label}}</label>
+          <input
+            class="form-control"
+            type="text"
+            :placeholder="tableFilterData.placeholder"
+            @input="tableFilterChange($event.target.value, 'input')"
+            @change="tableFilterChange($event.target.value, 'change')"
+            :value="tableFilterState"
+            aria-label="table filter input"
+          >
+        </template>
+        <slot name="cleaner" :clean="clean" :isFiltered="isFiltered">
+          <template v-if="cleaner">
+            <CIcon
+              v-if="cleaner"
+              v-bind="cleanerProps"
+              @click.native="clean"
+            />
+          </template>
+        </slot>
+      </div>
+
+      <div
+        v-if="itemsPerPageSelect"
+        class="col-sm-6 p-0"
+        :class="{ 'offset-sm-6': !haveFilterOption }"
+      >
+        <div class="form-inline justify-content-sm-end">
+          <label class="mfe-2">{{paginationSelect.label}}</label>
+          <select
+            class="form-control"
+            @change="paginationChange"
+            aria-label="changes number of visible items"
+          >
+            <option value="" selected disabled hidden>
+              {{perPageItems}}
+            </option>
+            <option
+              v-for="(number, key) in paginationSelect.values"
+              :val="number"
+              :key="key"
+            >
+              {{number}}
+            </option>
+          </select>
+
+        </div>
+      </div>
+    </div>
+
+
+    <slot name="over-table"/>
+    <div :class="`position-relative ${responsive ? 'table-responsive' : '' }`">
+      <table :class="tableClasses">
+        <thead>
+          <slot name="thead-top"/>
+          <tr v-if="header">
+            <template v-for="(name, index) in columnNames">
+              <th
+                @click="changeSort(rawColumnNames[index], index)"
+                :class="[headerClass(index), sortingIconStyles]"
+                :style="headerStyles(index)"
+                :key="index"
+              >
+                <slot :name="`${rawColumnNames[index]}-header`">
+                  <div>{{name}}</div>
+                </slot>
+                <slot
+                  v-if="isSortable(index)"
+                  name="sorting-icon"
+                  :state="getIconState(index)"
+                  :classes="iconClasses(index)"
+                >
+                  <CIcon
+                    width="18"
+                    :content="$options.icons.cilArrowTop"
+                    :class="iconClasses(index)"
+                    :aria-label="`change column: '${name}' sorting`"
+                  />
+                </slot>
+              </th>
+            </template>
+          </tr>
+
+          <tr v-if="columnFilter" class="table-sm">
+            <template v-for="(colName, index) in rawColumnNames" >
+              <th :class="headerClass(index)" :key="index">
+                <slot :name="`${rawColumnNames[index]}-filter`">
+                  <input
+                    v-if="!fields || fields[index].filter !== false"
+                    class="form-control form-control-sm"
+                    @input="columnFilterEvent(colName, $event.target.value, 'input')"
+                    @change="columnFilterEvent(colName, $event.target.value, 'change')"
+                    :value="columnFilterState[colName]"
+                    :aria-label="`column name: '${colName}' filter input`"
+                  />
+                </slot>
+              </th>
+            </template>
+          </tr>
+        </thead>
+
+
+        <tbody 
+          :style="clickableRows ? 'cursor:pointer;': null" 
+          class="position-relative"
+        >
+          <template v-for="(item, itemIndex) in currentItems" >
+            <tr
+              @click="rowClicked(item, itemIndex + firstItemIndex, $event)"
+              :class="item._classes" 
+              :tabindex="clickableRows ? 0 : null"
+              :key="itemIndex"
+            >
+              <template v-for="(colName, index) in rawColumnNames" >
+                <template v-if="$scopedSlots[colName]">
+                  <slot
+                    :name="colName"
+                    :item="item"
+                    :index="itemIndex + firstItemIndex"
+                  />
+                </template>
+                <td
+                  v-else
+                  :class="cellClass(item, colName, index)"
+                  :key="index"
+                >
+                  {{ String(item[colName]) }}
+                </td>
+              </template>
+            </tr>
+            <tr 
+              v-if="$scopedSlots.details && striped"
+              :key="'details-striped' + itemIndex"
+              class="invisible"
+            ></tr>
+            <tr
+              v-if="$scopedSlots.details"
+              @click="rowClicked(item, itemIndex + firstItemIndex, $event, true)"
+              class="p-0"
+              style="border:none !important"
+              :key="'details' + itemIndex"
+            >
+              <td
+                :colspan="colspan"
+                class="p-0"
+                style="border:none !important"
+              >
+                <slot
+                  name="details"
+                  :item="item"
+                  :index="itemIndex + firstItemIndex"
+                />
+              </td>
+            </tr>
+          </template>
+          <tr v-if="!currentItems.length && !loading">
+            <td :colspan="colspan">
+              <slot name="no-items-view">
+                <div class="text-center my-5">
+                  <h2>
+                    {{ noItemsText }}
+                    <CIcon
+                      width="30"
+                      :content="$options.icons.cilBan"
+                      class="text-danger mb-2"
+                    />
+                  </h2>
+                </div>
+              </slot>
+            </td>
+          </tr>
+        </tbody>
+
+
+        <tfoot v-if="footer && currentItems.length > 0">
+          <tr>
+            <template v-for="(name, index) in columnNames">
+              <th
+                @click="changeSort(rawColumnNames[index], index)"
+                :class="[headerClass(index), sortingIconStyles]"
+                :style="headerStyles(index)"
+                :key="index"
+              >
+                <slot :name="`${rawColumnNames[index]}-header`">
+                  <div>{{name}}</div>
+                </slot>
+                <slot
+                  v-if="isSortable(index)"
+                  name="sorting-icon"
+                  :state="getIconState(index)"
+                >
+                  <CIcon
+                    width="18"
+                    :content="$options.icons.cilArrowTop"
+                    :class="iconClasses(index)"
+                  />
+                </slot>
+              </th>
+            </template>
+          </tr>
+        </tfoot>
+        <slot name="footer" :itemsAmount="currentItems.length"/>
+        <slot name="caption"/>
+      </table>
+
+      <slot name="loading" v-if="loading">
+        <CElementCover 
+          :boundaries="[
+            { sides: ['top'], query: 'td' },
+            { sides: ['bottom'], query: 'tbody' }
+          ]"
+        />
+      </slot>
+    </div>
+    
+    <slot name="under-table"/>
+
+
+    <CPagination
+      v-if="pagination"
+      v-show="totalPages > 1"
+      :activePage.sync="page"
+      :pages="totalPages"
+      v-bind="typeof pagination === 'object' ? pagination : null"
+    />
+  </div>
+</template>
+
+<script>
+import CElementCover from '../element-cover/CElementCover'
+import CPagination from '../pagination/CPagination'
+import CIcon from '@coreui/icons-vue/src/CIconRaw.vue'
+import { cilArrowTop, cilBan, cilFilterX } from '@coreui/icons'
+
+export default {
+  name: 'CDataTable',
+  icons: { cilArrowTop, cilBan, cilFilterX },
+  components: {
+    CPagination,
+    CElementCover,
+    CIcon
+  },
+  props: {
+    items: Array,
+    fields: Array,
+    itemsPerPage: {
+      type: Number,
+      default: 10
+    },
+    activePage: Number,    
+    pagination: [Boolean, Object],
+    addTableClasses: [String, Array, Object],
+    responsive: {
+      type: Boolean,
+      default: true
+    },
+    size: String,
+    dark: Boolean,
+    striped: Boolean,
+    fixed: Boolean,
+    hover: Boolean,
+    border: Boolean,
+    outlined: Boolean,
+    itemsPerPageSelect: [Boolean, Object],
+    sorter: [Boolean, Object],
+    tableFilter: [Boolean, Object],
+    columnFilter: [Boolean, Object],
+    sorterValue: {
+      type: Object,
+      default: () => { return {} }
+    },
+    tableFilterValue: String,
+    columnFilterValue: Object,
+    header: {
+      type: Boolean,
+      default: true
+    },
+    footer: Boolean,
+    loading: Boolean,
+    clickableRows: Boolean,
+    noItemsView: Object,
+    cleaner: Boolean
+  },
+  data () {
+    return {
+      tableFilterState: this.tableFilterValue,
+      columnFilterState: {},
+      sorterState: {
+        column: null,
+        asc: true
+      },
+      page: this.activePage || 1,
+      perPageItems: this.itemsPerPage,
+      passedItems: this.items || []
+    }
+  },
+  watch: {
+    itemsPerPage (val) {
+      this.perPageItems = val
+    },
+    sorterValue: {
+      immediate: true,
+      handler (val) {
+        const asc = val.asc === false ? false : true
+        this.sorterState = Object.assign({}, { asc, column: val.column })
+      }
+    },
+    tableFilterValue (val) {
+      this.tableFilterState = val
+    },
+    columnFilterValue: {
+      immediate: true,
+      handler (val) {
+        this.columnFilterState = Object.assign({}, val) 
+      }
+    },
+    items (val, oldVal) {
+      if (val && oldVal && this.objectsAreIdentical(val, oldVal)) {
+        return
+      }
+      this.passedItems = val || []
+    },
+    totalPages: {
+      immediate: true,
+      handler (val) {
+        this.$emit('pages-change', val)
+      }
+    },
+    computedPage (val) {
+      this.$emit('page-change', val)
+    },
+    sortedItems: {
+      immediate: true,
+      handler (val, oldVal) {
+        if (val && oldVal && this.objectsAreIdentical(val, oldVal)) {
+          return
+        }
+        this.$emit('filtered-items-change', val)
+      }
+    }
+  },
+  computed: {
+    columnFiltered () {
+      let items = this.passedItems
+      if (this.columnFilter && this.columnFilter.external) {
+        return items
+      }
+      Object.entries(this.columnFilterState).forEach(([key, value]) => {
+        const columnFilter = String(value).toLowerCase()
+        if (columnFilter && this.rawColumnNames.includes(key)) {
+          items = items.filter(item => {
+            return String(item[key]).toLowerCase().includes(columnFilter)
+          })
+        }
+      })
+      return items
+    },
+    itemsDataColumns () {	
+      return this.rawColumnNames.filter(name => {	
+        return this.generatedColumnNames.includes(name)	
+      })	
+    },
+    tableFiltered () {
+      let items = this.columnFiltered
+      if (!this.tableFilterState || (this.tableFilter && this.tableFilter.external)) {
+        return items
+      }
+      const filter = this.tableFilterState.toLowerCase()
+      const hasFilter = (item) => String(item).toLowerCase().includes(filter)
+      items = items.filter(item => {
+        return this.itemsDataColumns.filter(key => hasFilter(item[key])).length
+      })
+      return items
+    },
+    sortedItems () {
+      const col = this.sorterState.column
+      if (!col || !this.rawColumnNames.includes(col) || this.sorter.external) {
+        return this.tableFiltered
+      }
+
+      //if values in column are to be sorted by numeric value they all have to be type number
+      const flip = this.sorterState.asc ? 1 : -1
+      return this.tableFiltered.slice().sort((item, item2) => {
+        const value  = item[col]
+        const value2 = item2[col]
+        const a = typeof value === 'number' ? value : String(value).toLowerCase()
+        const b = typeof value2 === 'number' ? value2 : String(value2).toLowerCase()
+        return a > b ? 1 * flip : b > a ? -1 * flip : 0
+      })
+    },
+    firstItemIndex () {
+      return (this.computedPage - 1) * this.perPageItems || 0
+    },
+    paginatedItems () {
+      return this.sortedItems.slice(
+        this.firstItemIndex,
+        this.firstItemIndex + this.perPageItems
+      )
+    },
+    currentItems () {
+      return this.computedPage ? this.paginatedItems : this.sortedItems
+    },
+    totalPages () {
+      return Math.ceil((this.sortedItems.length)/ this.perPageItems) || 1
+    },
+    computedPage () {
+      return this.pagination ? this.page : this.activePage
+    },
+    generatedColumnNames () {
+      return Object.keys(this.passedItems[0] || {}).filter(el => el.charAt(0) !== '_')
+    },
+    rawColumnNames () {
+      if (this.fields) {
+        return this.fields.map(el => el.key || el)
+      }
+      return this.generatedColumnNames
+    },
+    columnNames () {
+      if (this.fields) {
+        return this.fields.map(f => {
+          return f.label !== undefined ? f.label : this.pretifyName(f.key || f)
+        })
+      }
+      return this.rawColumnNames.map(el => this.pretifyName(el))
+    },
+    tableClasses () {
+      return [
+        'table',
+        this.addTableClasses,
+        {
+          [`table-${this.size}`]: this.size,
+          'table-dark': this.dark,
+          'table-striped': this.striped,
+          'table-fixed': this.fixed,
+          'table-hover': this.hover,
+          'table-bordered': this.border,
+          'border': this.outlined
+        }
+      ]
+    },
+    sortingIconStyles () {
+      return {'position-relative pr-4' : this.sorter }
+    },
+    colspan () {
+      return this.rawColumnNames.length
+    },
+    tableFilterData () {
+      return {
+        label: this.tableFilter.label || 'Filter:',
+        placeholder: this.tableFilter.placeholder || 'type string...'
+      }
+    },
+    paginationSelect () {
+      return {
+        label: this.itemsPerPageSelect.label || 'Items per page:',
+        values: this.itemsPerPageSelect.values || [5, 10, 20, 50]
+      }
+    },
+    noItemsText () {
+      const customValues = this.noItemsView || {}
+      if (this.passedItems.length) {
+        return customValues.noResults || 'No filtering results'
+      }
+      return customValues.noItems || 'No items'
+    },
+    isFiltered () {
+      return this.tableFilterState || 
+             Object.values(this.columnFilterState).join('') || 
+             this.sorterState.column
+    },
+    cleanerProps () {
+      return { 
+        content: this.$options.icons.cilFilterX,
+        class: `mfs-2 ${this.isFiltered ? 'text-danger' : 'transparent'}`,
+        role: this.isFiltered ? 'button' : null,
+        tabindex: this.isFiltered ? 0 : null,
+      }
+    },
+    haveFilterOption () {
+      return this.tableFilter || this.cleaner || this.$scopedSlots.cleaner
+    }
+  },
+  methods: {
+    changeSort (column, index) {
+      if (!this.isSortable(index)) {
+        return
+      }
+      //if column changed or sort was descending change asc to true
+      const state = this.sorterState
+      const columnRepeated = state.column === column 
+      if (!this.sorter || !this.sorter.resetable) {
+        state.column = column 
+      } else {
+        state.column = columnRepeated && state.asc === false ? null : column
+      }
+      state.asc = !(columnRepeated && state.asc)
+      this.$emit('update:sorter-value', this.sorterState)
+    },
+    columnFilterEvent (colName, value, type) {
+      const isLazy = this.columnFilter && this.columnFilter.lazy === true
+      if (isLazy && type === 'input' || !isLazy && type === 'change') {
+        return
+      }
+      this.$set(this.columnFilterState, colName, value)
+      this.$emit('update:column-filter-value', this.columnFilterState)
+    },
+    tableFilterChange (value, type) {
+      const isLazy = this.tableFilter && this.tableFilter.lazy === true
+      if (isLazy && type === 'input' || !isLazy && type === 'change') {
+        return
+      }
+      this.tableFilterState = value
+      this.$emit('update:table-filter-value', this.tableFilterState)
+    },
+    pretifyName (name) {
+      return name.replace(/[-_.]/g, ' ')
+        .replace(/ +/g, ' ')
+        .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
+        .split(' ')
+        .map(word => word.charAt(0).toUpperCase() + word.slice(1))
+        .join(' ')
+    },
+    cellClass (item, colName, index) {
+      let classes = []
+      if (item._cellClasses && item._cellClasses[colName]) {
+        classes.push(item._cellClasses[colName])
+      }
+      if (this.fields && this.fields[index]._classes) {
+        classes.push(this.fields[index]._classes)
+      }
+      return classes
+    },
+    isSortable (index) {
+      return this.sorter && 
+             (!this.fields || this.fields[index].sorter !== false) && 
+             this.itemsDataColumns.includes(this.rawColumnNames[index])
+    },
+    headerClass (index) {
+      const fields = this.fields
+      return fields && fields[index]._classes ? fields[index]._classes : ''
+    },
+    headerStyles (index) {
+      let style = 'vertical-align:middle;overflow:hidden;'
+      if (this.isSortable(index)) {
+        style += `cursor:pointer;`
+      }
+      if (this.fields && this.fields[index] && this.fields[index]._style) {
+        style += this.fields[index]._style
+      }
+      return style
+    },
+    rowClicked (item, index, e, detailsClick = false) {
+      this.$emit(
+        'row-clicked', item, index, this.getClickedColumnName(e, detailsClick), e
+      )
+    },
+    getClickedColumnName (e, detailsClick) {
+      if (detailsClick) {
+        return 'details'
+      } else {
+        const children = Array.from(e.target.closest('tr').children)
+        const clickedCell = children.filter(child => child.contains(e.target))[0]
+        return this.rawColumnNames[children.indexOf(clickedCell)]
+      }
+    },
+    getIconState (index) {
+      const direction = this.sorterState.asc ? 'asc' : 'desc'
+      return this.rawColumnNames[index] === this.sorterState.column ? direction : 0
+    },
+    iconClasses (index) {
+      const state = this.getIconState(index)
+      return [
+        'icon-transition position-absolute arrow-position',
+        {
+          'transparent': !state,
+          'rotate-icon': state === 'desc'
+        }
+      ]
+    },
+    paginationChange (e) {
+      this.$emit('pagination-change', Number(e.target.value))
+      if (this.itemsPerPageSelect.external) {
+        return
+      }
+      this.perPageItems = Number(e.target.value)
+    },
+    objectsAreIdentical (obj1, obj2) {
+      return obj1.length === obj2.length && 
+             JSON.stringify(obj1) === JSON.stringify(obj2)
+    },
+    clean() {
+      this.tableFilterState = ""
+      this.columnFilterState = {}
+      this.sorterState = { column: "", asc: true }
+    }
+  }
+}
+</script>
+
+<style scoped>
+thead tr:not(:last-child) th {
+  border-bottom: 1px;
+}
+
+.transparent {
+  opacity: 0.4;
+}
+.icon-transition {
+  -webkit-transition: transform 0.3s;
+  transition: transform 0.3s;
+}
+.arrow-position {
+  right: 0;
+  top: 50%;
+  -ms-transform: translateY(-50%);
+  transform: translateY(-50%);
+}
+.rotate-icon {
+  -ms-transform: translateY(-50%) rotate(-180deg);
+  transform: translateY(-50%) rotate(-180deg);
+}
+</style>
diff --git a/src/components/table/index.js b/src/components/table/index.js
new file mode 100644
index 00000000..8f19586d
--- /dev/null
+++ b/src/components/table/index.js
@@ -0,0 +1,5 @@
+import CDataTable from './CDataTable'
+
+export {
+  CDataTable
+}
diff --git a/src/components/table/tests/CDataTable.spec.js b/src/components/table/tests/CDataTable.spec.js
new file mode 100644
index 00000000..2d3b1442
--- /dev/null
+++ b/src/components/table/tests/CDataTable.spec.js
@@ -0,0 +1,237 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CDataTable'
+
+const ComponentName = 'CDataTable'
+const defaultWrapper = mount(Component)
+
+const items = [
+  {username: 'Estavan Lykos', registered: 2014, role: 'Staff', status: 'Banned'},
+  {username: 'Chetan Mohamed', registered: 2011, role: 'Admin', status: 'Inactive'},
+  {username: 'Derick Maximinus', registered: 212, role: 'Member', status: 'Pending'},
+  {username: 'Yiorgos Avraamu', registered: 2013, role: 'Member', status: 'Active'},
+  {
+    username: 'Friderik Dávid', 
+    registered: 1999,
+    role: 'Staff', 
+    status: 'Active',
+    _cellClasses: { registered: 'custom-cell-class' }
+  },
+]
+const customWrapper = createCustomWrapper()
+
+function createCustomWrapper () {
+  return mount(Component, {
+    propsData: {
+      items,
+      fields: [
+        { key: 'username', _style:'width:40%', _classes: 'user-custom-class' },
+        'registered',
+        { key: 'role', _style:'width:20%;' },
+        { key: 'status', _style:'width:20%;' },
+        { key: 'show_details' , label:'', _style:'width:1%', sorter: false, filter: false },
+      ],
+
+      tableFilter: true,
+      itemsPerPageSelect: true,
+      addTableClasses: 'additional-table-class',
+      sorter: true,
+      small: false,
+      dark: true,
+      striped: true,
+      fixed: false,
+      hover: true,
+      border: true,
+      outlined: true,
+      columnFilter: true,
+      footer: true,
+      sorterValue: { column: 'username', asc: false },
+      columnFilterValue: { registered: '2', 'non_existing': 'smh' },
+      pagination: true,
+      cleaner: true
+    },
+    slots: {
+      details: '<div class="details">Details slot</div>'
+    }
+  })
+}
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('changes sorting correctly', () => {
+    expect(customWrapper.vm.sortedItems[0].username).toBe('Yiorgos Avraamu')
+    customWrapper.find('tr').findAll('th').at(3).trigger('click')
+    expect(customWrapper.vm.sortedItems[0].status).toBe('Active')
+
+    customWrapper.find('tr').findAll('th').at(3).trigger('click')
+    expect(customWrapper.vm.sortedItems[0].status).toBe('Pending')
+
+    customWrapper.find('tr').findAll('th').at(1).trigger('click')
+    expect(customWrapper.vm.sortedItems[0].registered).toBe(212)
+  })
+  it('doesnt change sorter when clicked on not sortable column', () => {
+    const oldSorterColumn = customWrapper.vm.sorter.column
+    customWrapper.find('tr').findAll('th').at(4).trigger('click')
+    expect(customWrapper.vm.sorter.column).toBe(oldSorterColumn)
+  })
+  it('renders pretified column names when fields are not defined', () => {
+    customWrapper.setProps({ fields: undefined })
+    expect(customWrapper.vm.columnNames[0]).toBe('Username')
+  })
+  it('shows loading layer when loading prop is set', () => {
+    customWrapper.setProps({ loading: true })
+    expect(customWrapper.contains('.spinner-grow')).toBe(true)
+    customWrapper.setProps({ loading: false })
+  })
+  it('emits event when items per page changes', () => {
+    customWrapper.findAll('option').at(2).setSelected()
+    expect(customWrapper.emitted()['pagination-change'][0][0]).toBe(10)
+  })
+  it('emits correct event when row is clicked', () => {
+    customWrapper.find('tbody').find('td').trigger('click')
+    expect(customWrapper.emitted()['row-clicked'][0][2]).toBe('username')
+    customWrapper.find('.details').trigger('click')
+    expect(customWrapper.emitted()['row-clicked'][1][2]).toBe('details')
+    expect(
+      customWrapper.emitted()['row-clicked'][1][3] instanceof Event
+    ).toBe(true)
+  })
+  it('emits page-change event when clicked on computedPage change', () => {
+    customWrapper.setData({ page: 2 })
+    expect(customWrapper.emitted()['page-change'][0][0]).toBe(2)
+  })
+  it('correctly triggers items update', () => {
+    const localWrapper = createCustomWrapper()
+    //set to cover branch, could not detect if computed prop is changed
+    localWrapper.setProps({ items: items.slice() })
+    localWrapper.setProps({ items: null })
+    expect(localWrapper.vm.columnFiltered.length).toBe(0)
+  })
+  it('updates column filter on events depending on lazy modifier', () => {
+    const localWrapper = createCustomWrapper()
+    const input = localWrapper.findAll('tr').at(1).find('input')
+    const updateEmitted = () => localWrapper.emitted()['update:column-filter-value']
+    localWrapper.setProps({ columnFilter: { lazy: true } })
+    input.trigger('input')
+    expect(updateEmitted()).not.toBeTruthy()
+    localWrapper.setProps({ columnFilter: true })
+    input.trigger('input')
+    expect(updateEmitted()).toBeTruthy()
+  })
+  it('updates table filter on events depending on lazy modifier', () => {
+    const localWrapper = createCustomWrapper()
+    const input = localWrapper.find('input')
+    const firstUsername = () => localWrapper.vm.sortedItems[0].username
+    input.element.value = "Estavan"
+    input.trigger('input')
+    expect(firstUsername()).toMatch('Estavan')
+    localWrapper.setProps({ tableFilter: { lazy: true } })
+    input.element.value = "Chetan"
+    input.trigger('input')
+    expect(firstUsername()).toMatch('Estavan')
+    input.trigger('change')
+    expect(firstUsername()).toMatch('Chetan')
+  })
+  it('table filter works correctly', () => {
+    customWrapper.setProps({tableFilterValue: 'Yiorgos', tableFilter: false})
+    expect(customWrapper.vm.sortedItems.length).toBe(1)
+  })
+  it('changes pagination number correctly', () => {
+    customWrapper.setProps({
+      itemsPerPage: 13
+    })
+    expect(customWrapper.vm.perPageItems).toBe(13)
+  })
+  it('Disable component sorting and filtering when using \'external\' keys', () => {
+    const localWrapper = createCustomWrapper()
+    localWrapper.setProps({
+      tableFilterValue: 'Yiorgos'
+    })
+    expect(localWrapper.vm.sortedItems.length).toBe(1)
+    localWrapper.setProps({
+      tableFilter: { external: true }
+    })
+    expect(localWrapper.vm.sortedItems.length).toBe(4)
+
+    localWrapper.setProps({
+      columnFilter: { external: true },
+    })
+    expect(localWrapper.vm.sortedItems.length).toBe(5)
+
+    expect(localWrapper.vm.sortedItems[0].username).toBe('Yiorgos Avraamu')
+    localWrapper.setProps({
+      sorter: { external: true }
+    })
+    expect(localWrapper.vm.sortedItems[0].username).toBe('Estavan Lykos')
+  })
+  it('Sorter reset mechanism is working properly', () => {
+    const localWrapper = createCustomWrapper()
+    const click = (clickCount = 1) => {
+      for (let i = 0; i < clickCount; i++) {
+        localWrapper.find('tr').findAll('th').at(2).trigger('click')
+      }
+    }
+    localWrapper.setProps({
+      sorter: { resetable : true }
+    })
+    click(3)
+    expect(localWrapper.vm.sorterState.column).toBe(null)
+    click(2)
+    expect(localWrapper.vm.sorterState.asc).toBe(false)
+  })
+  it('Properly sets itemsPerPageSelect options', () => {
+    const localWrapper = createCustomWrapper()
+
+    localWrapper.setProps({
+      itemsPerPageSelect: {
+        label: 'new label',
+        values: [10, 25, 50],
+        external: true
+      }
+    })
+    expect(localWrapper.vm.paginationSelect.label).toBe('new label')
+    expect(localWrapper.vm.paginationSelect.values[1]).toBe(25)
+    localWrapper.find('select').setValue(25)
+    expect(localWrapper.emitted()['pagination-change'][0][0]).toBe(25)
+    expect(localWrapper.vm.perPageItems).not.toBe(25)
+  })
+  it('Properly sets no items view text', () => {
+    const localWrapper = createCustomWrapper()
+    localWrapper.setProps({
+      tableFilterValue: '12322'
+    })
+    expect(localWrapper.text()).toContain('No filtering results')
+    localWrapper.setProps({
+      noItemsView: {
+        noResults: 'no results text'
+      }
+    })
+    expect(localWrapper.text()).toContain('no results text')
+
+
+    localWrapper.setProps({
+      items: []
+    })
+    expect(localWrapper.text()).toContain('No items')
+    localWrapper.setProps({
+      noItemsView: {
+        noItems: 'no items text'
+      }
+    })
+    expect(localWrapper.text()).toContain('no items text')
+  })
+  it('Cleaner works properly', () => {
+    const localWrapper = createCustomWrapper()
+    const icon = localWrapper.find('svg')
+    expect(icon.classes()).toContain('text-danger')
+    icon.trigger('click')
+    expect(icon.classes()).toContain('transparent')
+  })
+})
diff --git a/src/components/table/tests/__snapshots__/CDataTable.spec.js.snap b/src/components/table/tests/__snapshots__/CDataTable.spec.js.snap
new file mode 100644
index 00000000..5606af8c
--- /dev/null
+++ b/src/components/table/tests/__snapshots__/CDataTable.spec.js.snap
@@ -0,0 +1,749 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CDataTable renders correctly 1`] = `
+<div>
+  <!---->
+    
+  <div
+    class="position-relative table-responsive"
+  >
+    <table
+      class="table"
+    >
+      <thead>
+         
+        <tr />
+         
+        <!---->
+      </thead>
+       
+      <tbody
+        class="position-relative"
+      >
+         
+        <tr>
+          <td
+            colspan="0"
+          >
+            <div
+              class="text-center my-5"
+            >
+              <h2>
+                
+                  No items
+                  
+                <svg
+                  class="text-danger mb-2 c-icon c-icon-custom-size"
+                  role="img"
+                  viewBox="0 0 512 512"
+                  width="30"
+                  xmlns="http://www.w3.org/2000/svg"
+                >
+                  <path
+                    class="ci-primary"
+                    d="M425.706,86.294A240,240,0,0,0,86.294,425.705,240,240,0,0,0,425.706,86.294ZM256,48A207.1,207.1,0,0,1,391.528,98.345L98.345,391.528A207.1,207.1,0,0,1,48,256C48,141.309,141.309,48,256,48Zm0,416a207.084,207.084,0,0,1-134.986-49.887l293.1-293.1A207.084,207.084,0,0,1,464,256C464,370.691,370.691,464,256,464Z"
+                    fill="var(--ci-primary-color, currentColor)"
+                  />
+                </svg>
+              </h2>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+       
+      <!---->
+        
+    </table>
+     
+    <!---->
+  </div>
+    
+  <!---->
+</div>
+`;
+
+exports[`CDataTable renders correctly 2`] = `
+<div>
+  <div
+    class="row my-2 mx-0"
+  >
+    <div
+      class="col-sm-6 form-inline p-0"
+    >
+      <label
+        class="mfe-2"
+      >
+        Filter:
+      </label>
+       
+      <input
+        aria-label="table filter input"
+        class="form-control"
+        placeholder="type string..."
+        type="text"
+      />
+       
+      <svg
+        class="c-icon mfs-2 text-danger"
+        role="button"
+        tabindex="0"
+        viewBox="0 0 512 512"
+        xmlns="http://www.w3.org/2000/svg"
+      >
+        <polygon
+          class="ci-primary"
+          fill="var(--ci-primary-color, currentColor)"
+          points="40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16"
+        />
+        <polygon
+          class="ci-primary"
+          fill="var(--ci-primary-color, currentColor)"
+          points="166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225"
+        />
+      </svg>
+    </div>
+     
+    <div
+      class="col-sm-6 p-0"
+    >
+      <div
+        class="form-inline justify-content-sm-end"
+      >
+        <label
+          class="mfe-2"
+        >
+          Items per page:
+        </label>
+         
+        <select
+          aria-label="changes number of visible items"
+          class="form-control"
+        >
+          <option
+            disabled="disabled"
+            hidden="hidden"
+            selected="selected"
+            value=""
+          >
+            
+            10
+          
+          </option>
+           
+          <option
+            val="5"
+          >
+            
+            5
+          
+          </option>
+          <option
+            val="10"
+          >
+            
+            10
+          
+          </option>
+          <option
+            val="20"
+          >
+            
+            20
+          
+          </option>
+          <option
+            val="50"
+          >
+            
+            50
+          
+          </option>
+        </select>
+      </div>
+    </div>
+  </div>
+    
+  <div
+    class="position-relative table-responsive"
+  >
+    <table
+      class="table additional-table-class table-dark table-striped table-hover table-bordered border"
+    >
+      <thead>
+         
+        <tr>
+          <th
+            class="user-custom-class position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer; width: 40%;"
+          >
+            <div>
+              Username
+            </div>
+             
+            <svg
+              aria-label="change column: 'Username' sorting"
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position rotate-icon"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer;"
+          >
+            <div>
+              Registered
+            </div>
+             
+            <svg
+              aria-label="change column: 'Registered' sorting"
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position transparent"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer; width: 20%;"
+          >
+            <div>
+              Role
+            </div>
+             
+            <svg
+              aria-label="change column: 'Role' sorting"
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position transparent"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer; width: 20%;"
+          >
+            <div>
+              Status
+            </div>
+             
+            <svg
+              aria-label="change column: 'Status' sorting"
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position transparent"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; width: 1%;"
+          >
+            <div>
+              
+            </div>
+             
+            <!---->
+          </th>
+        </tr>
+         
+        <tr
+          class="table-sm"
+        >
+          <th
+            class="user-custom-class"
+          >
+            <input
+              aria-label="column name: 'username' filter input"
+              class="form-control form-control-sm"
+            />
+          </th>
+          <th
+            class=""
+          >
+            <input
+              aria-label="column name: 'registered' filter input"
+              class="form-control form-control-sm"
+            />
+          </th>
+          <th
+            class=""
+          >
+            <input
+              aria-label="column name: 'role' filter input"
+              class="form-control form-control-sm"
+            />
+          </th>
+          <th
+            class=""
+          >
+            <input
+              aria-label="column name: 'status' filter input"
+              class="form-control form-control-sm"
+            />
+          </th>
+          <th
+            class=""
+          >
+            <!---->
+          </th>
+        </tr>
+      </thead>
+       
+      <tbody
+        class="position-relative"
+      >
+        <tr>
+          <td
+            class="user-custom-class"
+          >
+            
+                Yiorgos Avraamu
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                2013
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Member
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Active
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                undefined
+              
+          </td>
+        </tr>
+         
+        <tr
+          class="invisible"
+        />
+         
+        <tr
+          class="p-0"
+        >
+          <td
+            class="p-0"
+            colspan="5"
+          >
+            <div
+              class="details"
+            >
+              Details slot
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td
+            class="user-custom-class"
+          >
+            
+                Estavan Lykos
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                2014
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Staff
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Banned
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                undefined
+              
+          </td>
+        </tr>
+         
+        <tr
+          class="invisible"
+        />
+         
+        <tr
+          class="p-0"
+        >
+          <td
+            class="p-0"
+            colspan="5"
+          >
+            <div
+              class="details"
+            >
+              Details slot
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td
+            class="user-custom-class"
+          >
+            
+                Derick Maximinus
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                212
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Member
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Pending
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                undefined
+              
+          </td>
+        </tr>
+         
+        <tr
+          class="invisible"
+        />
+         
+        <tr
+          class="p-0"
+        >
+          <td
+            class="p-0"
+            colspan="5"
+          >
+            <div
+              class="details"
+            >
+              Details slot
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td
+            class="user-custom-class"
+          >
+            
+                Chetan Mohamed
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                2011
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Admin
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                Inactive
+              
+          </td>
+          <td
+            class=""
+          >
+            
+                undefined
+              
+          </td>
+        </tr>
+         
+        <tr
+          class="invisible"
+        />
+         
+        <tr
+          class="p-0"
+        >
+          <td
+            class="p-0"
+            colspan="5"
+          >
+            <div
+              class="details"
+            >
+              Details slot
+            </div>
+          </td>
+        </tr>
+         
+        <!---->
+      </tbody>
+       
+      <tfoot>
+        <tr>
+          <th
+            class="user-custom-class position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer; width: 40%;"
+          >
+            <div>
+              Username
+            </div>
+             
+            <svg
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position rotate-icon"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer;"
+          >
+            <div>
+              Registered
+            </div>
+             
+            <svg
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position transparent"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer; width: 20%;"
+          >
+            <div>
+              Role
+            </div>
+             
+            <svg
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position transparent"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; cursor: pointer; width: 20%;"
+          >
+            <div>
+              Status
+            </div>
+             
+            <svg
+              class="c-icon c-icon-custom-size icon-transition position-absolute arrow-position transparent"
+              role="img"
+              viewBox="0 0 512 512"
+              width="18"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <polygon
+                class="ci-primary"
+                fill="var(--ci-primary-color, currentColor)"
+                points="390.624 150.625 256 16 121.376 150.625 144.004 173.252 240.001 77.254 240.001 495.236 272.001 495.236 272.001 77.257 367.996 173.252 390.624 150.625"
+              />
+            </svg>
+          </th>
+          <th
+            class="position-relative pr-4"
+            style="vertical-align: middle; overflow: hidden; width: 1%;"
+          >
+            <div>
+              
+            </div>
+             
+            <!---->
+          </th>
+        </tr>
+      </tfoot>
+        
+    </table>
+     
+    <!---->
+  </div>
+    
+  <nav
+    aria-label="pagination"
+    style="display: none;"
+  >
+    <ul
+      class="pagination  justify-content-start"
+    >
+      <li
+        class="page-item disabled"
+      >
+        <a
+          aria-disabled="true"
+          aria-label="Go to first page"
+          class="page-link disabled"
+          href="#"
+          tabindex="-1"
+          target="_self"
+        >
+          «
+        </a>
+      </li>
+       
+      <li
+        class="page-item disabled"
+      >
+        <a
+          aria-disabled="true"
+          aria-label="Go to previous page"
+          class="page-link disabled"
+          href="#"
+          tabindex="-1"
+          target="_self"
+        >
+          ‹
+        </a>
+      </li>
+       
+      <!---->
+       
+      <li
+        class="active page-item"
+      >
+        <a
+          aria-label="Current page 1"
+          class="page-link c-page-link-number"
+          href="#"
+          target="_self"
+        >
+          
+        1
+      
+        </a>
+      </li>
+       
+      <!---->
+       
+      <li
+        class="page-item disabled"
+      >
+        <a
+          aria-disabled="true"
+          aria-label="Go to next page"
+          class="page-link disabled"
+          href="#"
+          tabindex="-1"
+          target="_self"
+        >
+          ›
+        </a>
+      </li>
+       
+      <li
+        class="page-item disabled"
+      >
+        <a
+          aria-disabled="true"
+          aria-label="Go to last page"
+          class="page-link disabled"
+          href="#"
+          tabindex="-1"
+          target="_self"
+        >
+          »
+        </a>
+      </li>
+    </ul>
+  </nav>
+</div>
+`;
diff --git a/src/components/tabs/CDistributor.vue b/src/components/tabs/CDistributor.vue
new file mode 100644
index 00000000..6f5bc40f
--- /dev/null
+++ b/src/components/tabs/CDistributor.vue
@@ -0,0 +1,28 @@
+<template>
+  <component :is="tag">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CDistributor',
+  inheritAttrs: false,
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  },
+  provide () {
+    return {
+      distributed: this.props
+    }
+  },
+  computed: {
+    props () {
+      return this.$attrs
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/tabs/CTab.vue b/src/components/tabs/CTab.vue
new file mode 100644
index 00000000..ff617635
--- /dev/null
+++ b/src/components/tabs/CTab.vue
@@ -0,0 +1,90 @@
+<template>
+  <li 
+    v-if="distributed.header"
+    @click="navClick"
+    class="nav-item"
+  >
+    <CLink class="nav-link" v-bind="navLinkProps">
+      <slot name="title">{{title}}</slot>
+    </CLink>
+  </li>
+  <transition
+    v-else
+    :name="tabs.fade ? 'fade' : ''"
+    mode="out-in"
+  >
+    <div
+      v-show="isActive"
+      :class="paneClasses"
+    >
+      <slot></slot>
+    </div>
+  </transition>
+</template>
+
+<script>
+import CLink, { propsFactory } from '../link/CLink'
+
+const props = Object.assign(propsFactory(), {
+  title: String
+})
+
+export default {
+  name: 'CTab',
+  inject: ['distributed', 'tabs', 'initialTab'],
+  components: {
+    CLink
+  },
+  beforeMount () {
+    this.index = Array.from(this.$parent.$children).indexOf(this)
+    if (this.active && this.distributed.header && this.initialTab === undefined) {
+      this.distributed.changeTabTo(this.index)
+    }
+  },
+  data () {
+    return {
+      index: null
+    }
+  },
+  props,
+  computed: {
+    navLinkProps () {
+      return Object.assign(
+        {}, this._props, { active: this.isActive }, { title: null }
+      )
+    },
+    paneClasses () {
+      return [
+        this.distributed.addClasses, 
+        'tab-pane',
+        { 'active': this.isActive }
+      ]
+    },
+    isActive () {
+      return this.tabs.activeTab === this.index
+    }
+  },
+  methods: {
+    navClick () {
+      if (!this.isActive && !this.disabled) {
+        this.distributed.changeTabTo(this.index)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .fade-enter {
+    display: none;
+    opacity: 0;
+  }
+  .fade-enter-active {
+    transition: opacity 0.3s;
+  }
+  .fade-leave, .fade-leave-active {
+    position: absolute;
+    display: none;
+    opacity: 0;
+  }
+</style>
\ No newline at end of file
diff --git a/src/components/tabs/CTabs.vue b/src/components/tabs/CTabs.vue
new file mode 100644
index 00000000..73e1f972
--- /dev/null
+++ b/src/components/tabs/CTabs.vue
@@ -0,0 +1,119 @@
+<template>
+  <div :class="wrapperClasses">
+    <div :class="navWrapperClasses">
+      <CDistributor 
+        tag="ul" 
+        :class="navClasses" 
+        :header="true"
+        :changeTabTo="changeTabTo"
+      >
+        <slot></slot>
+      </CDistributor>
+    </div>
+    <div :class="[addTabsWrapperClasses, gridClasses.content]">
+      <CDistributor
+        :class="tabsClasses" 
+        :addClasses="addTabClasses"
+      >
+        <slot></slot>
+      </CDistributor>
+    </div>
+  </div>
+</template>
+
+<script>
+import CDistributor from './CDistributor'
+
+export default {
+  name: 'CTabs',
+  components: {
+    CDistributor
+  },
+  provide () {
+    const tabs = {}
+    Object.defineProperty(tabs, 'activeTab', {
+      get: () => this.activeTabIndex
+    })
+    Object.defineProperty(tabs, 'fade', {
+      get: () => this.fade
+    })
+    return { tabs, initialTab: this.activeTab }
+  },
+  props: {
+    fill: Boolean,
+    justified: Boolean,
+    variant: {
+      type: String,
+      default: 'tabs',
+      validator: val => ['', 'tabs', 'pills'].includes(val)
+    },
+    fade: {
+      type: Boolean,
+      default: true
+    },
+    vertical: [Boolean, Object],
+    addNavWrapperClasses: [String, Array, Object],
+    addNavClasses: [String, Array, Object],
+    addTabsWrapperClasses: [String, Array, Object],
+    addTabsClasses: [String, Array, Object],
+    addTabClasses: [String, Array, Object],
+    activeTab: Number
+  },
+  data () {
+    return {
+      activeTabIndex: this.activeTab || 0
+    }
+  },
+  watch: {
+    activeTab (val) {
+      this.activeTabIndex = val || 0
+    }
+  },
+  computed: {
+    wrapperClasses () {
+      return { 'row no-gutters': this.vertical }
+    },
+    navWrapperClasses () {
+      return [ this.addNavWrapperClasses, this.gridClasses.navs]
+    },
+    navClasses () {
+      return [
+        this.addNavClasses,
+        {
+          'nav': true,
+          'nav-tabs': this.variant === 'tabs',
+          'nav-pills': this.variant === 'pills',
+          'flex-column': this.vertical,
+          'nav-fill': this.fill,
+          'nav-justified': this.justified,
+          'h-100': this.vertical
+        }
+      ]
+    },
+    tabsClasses () {
+      return [
+        this.addTabsClasses,
+        'tab-content',
+        {
+          'pl-3 p-0': this.vertical
+        }
+      ]
+    },
+    gridClasses () {
+      if (this.vertical === true) {
+        return { navs: 'col-sm-4', content: 'col-sm-8'}
+      } else {
+        return this.vertical || {}
+      }
+    }
+  },
+  methods: {
+    changeTabTo (tab) {
+      this.activeTabIndex = tab
+      this.$emit('update:activeTab', tab)
+    }
+  }
+}
+</script>
+
+
diff --git a/src/components/tabs/index.js b/src/components/tabs/index.js
new file mode 100644
index 00000000..2ca0ea8f
--- /dev/null
+++ b/src/components/tabs/index.js
@@ -0,0 +1,7 @@
+import CTab from './CTab'
+import CTabs from './CTabs'
+
+export {
+  CTab,
+  CTabs
+}
diff --git a/src/components/tabs/tests/CTabs.spec.js b/src/components/tabs/tests/CTabs.spec.js
new file mode 100644
index 00000000..7d3c9999
--- /dev/null
+++ b/src/components/tabs/tests/CTabs.spec.js
@@ -0,0 +1,99 @@
+import { mount } from '@vue/test-utils'
+import CTabs from '../CTabs'
+import CTab from '../CTab'
+import Vue from 'vue'
+
+const ComponentName = 'CTabs'
+const defaultWrapper = mount(CTabs)
+
+// export const customWrapper = mount(Component, {
+//   propsData: {
+//     fill: true,
+//     justified: true,
+//     variant: 'pills',
+//     fade: true,
+//     vertical: true,
+//     addNavWrapperClasses: 'additional-nav-wrapper-class',
+//     addNavClasses: 'additional-nav-class',
+//     addTabsWrapperClasses: 'additional-tabs-wrapper-class',
+//     addTabsClasses: 'additional-tabs-class',
+//     addTabClasses: 'additional-tab-class'
+//   },
+//   slots: {
+//     default: [CTab, CTab, customTab]
+//   }
+// })
+const App = Vue.extend({
+  components: { CTabs, CTab },
+  render (h) {
+    return h(
+      'CTabs', 
+      {
+        props: {
+          fill: true,
+          justified: true,
+          variant: 'pills',
+          fade: true,
+          vertical: { navs: 'col-sm-3', content: 'col-sm-9' },
+          addNavWrapperClasses: 'additional-nav-wrapper-class',
+          addNavClasses: 'additional-nav-class',
+          addTabsWrapperClasses: 'additional-tabs-wrapper-class',
+          addTabsClasses: 'additional-tabs-class',
+          addTabClasses: 'additional-tab-class'
+        }
+      }, 
+      [
+        h('CTab', { props: { title: 'tab1' }}, ['tab1 content']),
+        h('CTab', { props: { active: true, title: 'tab2' }}, ['tab2 content']),
+        h('CTab', { props: { title: 'tab3' }}),
+        h(
+          'CTab',
+          { props: { disabled: true }, scopedSlots: { title: () => 'tab 4' }},
+          ['disabled tab']
+        ),
+        h(
+          'div',
+          {},
+          ['ignored element']
+        )
+      ]
+    )
+  }
+})
+
+const customWrapper = mount(App)
+const tabsComponent = customWrapper.vm.$children[0]
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CTabs.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+  it('do not change tab on click when disabled', () => {
+    const tabs = customWrapper.findAll('.nav-item')
+    tabs.at(3).trigger('click')
+    expect(customWrapper.find('.tab-pane').text()).toBe('tab1 content')
+  })
+  it('changes active tab corectly', () => {
+    const tabs = customWrapper.findAll('.nav-item')
+    tabs.at(2).trigger('click')
+    expect(tabsComponent.activeTabIndex).toBe(2)
+    defaultWrapper.setProps({
+      activeTab: 1
+    })
+    expect(defaultWrapper.vm.activeTabIndex).toBe(1)
+    defaultWrapper.setProps({
+      activeTab: null
+    })
+    expect(defaultWrapper.vm.activeTabIndex).toBe(0)
+  })
+  it('properly changes vertical classes', () => {
+    defaultWrapper.setProps({ vertical: true })
+    expect(defaultWrapper.vm.gridClasses.navs).toBe('col-sm-4')
+  })
+})
diff --git a/src/components/tabs/tests/__snapshots__/CTabs.spec.js.snap b/src/components/tabs/tests/__snapshots__/CTabs.spec.js.snap
new file mode 100644
index 00000000..14b4991d
--- /dev/null
+++ b/src/components/tabs/tests/__snapshots__/CTabs.spec.js.snap
@@ -0,0 +1,128 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CTabs renders correctly 1`] = `
+<div
+  class=""
+>
+  <div
+    class=""
+  >
+    <ul
+      class="nav nav-tabs"
+    />
+  </div>
+   
+  <div
+    class=""
+  >
+    <div
+      class="tab-content"
+    />
+  </div>
+</div>
+`;
+
+exports[`CTabs renders correctly 2`] = `
+<div
+  class="row no-gutters"
+>
+  <div
+    class="additional-nav-wrapper-class col-sm-3"
+  >
+    <ul
+      class="additional-nav-class nav nav-pills flex-column nav-fill nav-justified h-100"
+    >
+      <li
+        class="nav-item"
+      >
+        <a
+          class="nav-link"
+          href="#"
+          target="_self"
+        >
+          tab1
+        </a>
+      </li>
+      <li
+        class="nav-item"
+      >
+        <a
+          class="nav-link active"
+          href="#"
+          target="_self"
+        >
+          tab2
+        </a>
+      </li>
+      <li
+        class="nav-item"
+      >
+        <a
+          class="nav-link"
+          href="#"
+          target="_self"
+        >
+          tab3
+        </a>
+      </li>
+      <li
+        class="nav-item"
+      >
+        <a
+          aria-disabled="true"
+          class="nav-link disabled"
+          href="#"
+          tabindex="-1"
+          target="_self"
+        >
+          tab 4
+        </a>
+      </li>
+      <div>
+        ignored element
+      </div>
+    </ul>
+  </div>
+   
+  <div
+    class="additional-tabs-wrapper-class col-sm-9"
+  >
+    <div
+      class="additional-tabs-class tab-content pl-3 p-0"
+    >
+      <div
+        class="additional-tab-class tab-pane"
+        mode="out-in"
+        name="fade"
+        style="display: none;"
+      >
+        tab1 content
+      </div>
+      <div
+        class="additional-tab-class tab-pane active"
+        mode="out-in"
+        name="fade"
+      >
+        tab2 content
+      </div>
+      <div
+        class="additional-tab-class tab-pane"
+        mode="out-in"
+        name="fade"
+        style="display: none;"
+      />
+      <div
+        class="additional-tab-class tab-pane"
+        mode="out-in"
+        name="fade"
+        style="display: none;"
+      >
+        disabled tab
+      </div>
+      <div>
+        ignored element
+      </div>
+    </div>
+  </div>
+</div>
+`;
diff --git a/src/components/template/CFooter.vue b/src/components/template/CFooter.vue
new file mode 100644
index 00000000..f8ee128d
--- /dev/null
+++ b/src/components/template/CFooter.vue
@@ -0,0 +1,29 @@
+<template>
+  <component :is="tag" :class="classList">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CFooter',
+  props: {
+    tag: {
+      type: String,
+      default: 'footer'
+    },
+    fixed: {
+      type: Boolean,
+      default: true
+    }
+  },
+  computed: {
+    classList () {
+      return [
+        'c-footer',
+        { 'c-footer-fixed': this.fixed }
+      ]
+    }
+  }
+}
+</script>
diff --git a/src/components/template/CHeader.vue b/src/components/template/CHeader.vue
new file mode 100644
index 00000000..9274ae30
--- /dev/null
+++ b/src/components/template/CHeader.vue
@@ -0,0 +1,38 @@
+<template>
+  <component :is="tag" :class="classList">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CHeader',
+  props: {
+    tag: {
+      type: String,
+      default: 'header'
+    },
+    colorScheme: {
+      type: String,
+      default: 'light'
+    },
+    fixed: {
+      type: Boolean,
+      default: true
+    },
+    withSubheader: Boolean
+  },
+  computed: {
+    classList () {
+      return [
+        'c-header',
+        `c-header-${this.colorScheme}`,
+        { 
+          'c-header-fixed': this.fixed,
+          'c-header-with-subheader': this.withSubheader
+        }
+      ]
+    }
+  }
+}
+</script>
diff --git a/src/components/template/CHeaderBrand.vue b/src/components/template/CHeaderBrand.vue
new file mode 100644
index 00000000..bd60761d
--- /dev/null
+++ b/src/components/template/CHeaderBrand.vue
@@ -0,0 +1,22 @@
+<script>
+import CLink, { propsFactory } from '../link/CLink'
+import { mergeData } from 'vue-functional-data-merge'
+const props = Object.assign(propsFactory(),  { tag: { type: String, default: 'div' }})
+
+export default {
+  functional: true,
+  name: 'CHeaderBrand',
+  props,
+  render (h, { props, data, children }) {
+    const isLink = props.href || props.to
+    return h(
+      isLink ? CLink : props.tag,
+      mergeData(data, {
+        staticClass: 'c-header-brand',
+        props: isLink ? props : {}
+      }),
+      children
+    )
+  }
+}
+</script>
diff --git a/src/components/template/CHeaderNav.vue b/src/components/template/CHeaderNav.vue
new file mode 100644
index 00000000..eb3d206c
--- /dev/null
+++ b/src/components/template/CHeaderNav.vue
@@ -0,0 +1,11 @@
+<template>
+  <ul class="c-header-nav">
+    <slot></slot>
+  </ul>
+</template>
+
+<script>
+export default {
+  name: 'CHeaderNav'
+}
+</script>
diff --git a/src/components/template/CHeaderNavItem.vue b/src/components/template/CHeaderNavItem.vue
new file mode 100644
index 00000000..aa28fb39
--- /dev/null
+++ b/src/components/template/CHeaderNavItem.vue
@@ -0,0 +1,11 @@
+<template>
+  <li class="c-header-nav-item">
+    <slot></slot>
+  </li>
+</template>
+
+<script>
+export default {
+  name: 'CHeaderNavItem'
+}
+</script>
diff --git a/src/components/template/CHeaderNavLink.vue b/src/components/template/CHeaderNavLink.vue
new file mode 100644
index 00000000..5279e79f
--- /dev/null
+++ b/src/components/template/CHeaderNavLink.vue
@@ -0,0 +1,19 @@
+<template>
+  <CLink
+    class="c-header-nav-link"
+    v-bind="$props"
+  >
+    <slot></slot>
+  </CLink>
+</template>
+
+<script>
+import CLink, { props } from '../link/CLink'
+export default {
+  name: 'CHeaderNavLink',
+  components: {
+    CLink
+  },
+  props
+}
+</script>
diff --git a/src/components/template/CSidebar.vue b/src/components/template/CSidebar.vue
new file mode 100644
index 00000000..eae6373b
--- /dev/null
+++ b/src/components/template/CSidebar.vue
@@ -0,0 +1,145 @@
+<template>
+  <div :class="sidebarClasses" @click="sidebarClick">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CSidebar',
+  props: {
+    fixed: {
+      type: Boolean,
+      default: true
+    },
+    unfoldable: Boolean,
+    overlaid: Boolean,
+    breakpoint: {
+      type: [String, Boolean],
+      default: 'lg',
+      validator: val => [false, '', 'sm', 'md', 'lg', 'xl'].includes(val)
+    },
+    minimize: Boolean,
+    show: {
+      type: [Boolean, String],
+      default: 'responsive'
+    },
+    size: {
+      type: String,
+      validator: (val) => ['', 'sm', 'lg', 'xl'].includes(val)
+    },
+    hideOnMobileClick: {
+      type: Boolean,
+      default: true
+    },
+    aside: Boolean,
+    colorScheme: {
+      type: String,
+      default: 'dark'
+    },
+    dropdownMode: {
+      type: String,
+      default: 'openActive',
+      validator: (mode) => {
+        return [
+          '', 'openActive', 'close', 'closeInactive', 'noAction'
+        ].includes(mode)
+      }
+    }
+  },
+  provide () {
+    const state = {}
+    Object.defineProperty(state, 'minimize', {
+      get: () => this.minimize && !this.unfoldable
+    })
+    return { 
+      state,
+      dropdownMode: this.dropdownMode 
+    }
+  },
+  data () {
+    return {
+      open: this.show,
+    }
+  },
+  watch: {
+    show (val) {
+      this.open = val
+    },
+    open: {
+      immediate: true,
+      handler (val) {
+        val === true ? this.createBackdrop() : this.removeBackdrop()
+      }
+    }
+  },
+  // mounted () {
+  //   if (this.open === true) {
+  //     this.createBackdrop()
+  //   }
+  // },
+  beforeDestroy () {
+    this.removeBackdrop()
+  },
+  computed: {
+    sidebarClasses () {
+      const haveResponsiveClass = this.breakpoint && this.open === 'responsive'
+      return [
+        'c-sidebar',
+        `c-sidebar-${this.colorScheme}`,
+        {
+          'c-sidebar-show': this.open === true,
+          [`c-sidebar-${this.breakpoint}-show`]: haveResponsiveClass,
+          'c-sidebar-fixed': this.fixed && !this.overlaid,
+          'c-sidebar-right': this.aside,
+          'c-sidebar-minimized': this.minimize && !this.unfoldable,
+          'c-sidebar-unfoldable': this.minimize && this.unfoldable,
+          'c-sidebar-overlaid': this.overlaid,
+          [`c-sidebar-${this.size}`]: this.size
+        }
+      ]
+    }
+  },
+  methods: {
+    sidebarClick (e) {
+      if (this.hideOnMobileClick && this.isOnMobile()) {
+        e.target.closest('a.c-sidebar-nav-link') ? this.closeSidebar() : null
+      }
+    },
+    closeSidebar () {
+      this.open = this.overlaid ? false : 'responsive'
+      this.$emit('update:show', this.open)
+    },
+    isOnMobile () {
+      return Boolean(getComputedStyle(this.$el).getPropertyValue('--is-mobile'))
+    },
+    sidebarCloseListener (e) {
+      if (
+        document.getElementById(this._uid + 'backdrop') &&
+        !this.$el.contains(e.target)
+      ) {
+        this.closeSidebar()
+      }
+    },
+    createBackdrop () {
+      const backdrop = document.createElement('div')
+      if (this.overlaid) {
+        document.addEventListener('click', this.sidebarCloseListener, true)
+      } else {
+        backdrop.addEventListener('click', this.closeSidebar)
+      }
+      backdrop.className = 'c-sidebar-backdrop c-show'
+      backdrop.id = this._uid + 'backdrop'
+      document.body.appendChild(backdrop)
+    },
+    removeBackdrop () {
+      const backdrop = document.getElementById(this._uid + 'backdrop')
+      if (backdrop) {
+        document.removeEventListener('click', this.sidebarCloseListener)
+        backdrop.removeEventListener('click', this.closeSidebar)
+        document.body.removeChild(backdrop)
+      }
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/template/CSidebarBrand.vue b/src/components/template/CSidebarBrand.vue
new file mode 100644
index 00000000..0bd6a089
--- /dev/null
+++ b/src/components/template/CSidebarBrand.vue
@@ -0,0 +1,24 @@
+
+
+<script>
+import CLink, { propsFactory } from '../link/CLink'
+import { mergeData } from 'vue-functional-data-merge'
+const props = Object.assign(propsFactory(), { tag: { type: String, default: 'div' }})
+
+export default {
+  functional: true,
+  name: 'CSidebarBrand',
+  props,
+  render (h, { props, data, children }) {
+    const isLink = props.href || props.to
+    return h(
+      isLink ? CLink : props.tag,
+      mergeData(data, {
+        staticClass: 'c-sidebar-brand',
+        props: isLink ? props : {}
+      }),
+      children
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/template/CSidebarClose.vue b/src/components/template/CSidebarClose.vue
new file mode 100644
index 00000000..234e000a
--- /dev/null
+++ b/src/components/template/CSidebarClose.vue
@@ -0,0 +1,18 @@
+<template>
+  <CButtonClose buttonClasses="c-sidebar-close">
+    <svg class="c-icon" width="24" height="24" viewBox="0 0 24 24">
+      <title>x</title>
+      <path d="M20.030 5.030l-1.061-1.061-6.97 6.97-6.97-6.97-1.061 1.061 6.97 6.97-6.97 6.97 1.061 1.061 6.97-6.97 6.97 6.97 1.061-1.061-6.97-6.97 6.97-6.97z"></path>
+    </svg>
+  </CButtonClose>
+</template>
+
+<script>
+import CButtonClose from '../button/CButtonClose'
+export default {
+  name: 'CSidebarClose',
+  components: {
+    CButtonClose
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/template/CSidebarFooter.vue b/src/components/template/CSidebarFooter.vue
new file mode 100644
index 00000000..a3e1ab1d
--- /dev/null
+++ b/src/components/template/CSidebarFooter.vue
@@ -0,0 +1,11 @@
+<template>
+  <div class="c-sidebar-footer">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CSidebarFooter'
+}
+</script>
diff --git a/src/components/template/CSidebarForm.vue b/src/components/template/CSidebarForm.vue
new file mode 100644
index 00000000..857a3102
--- /dev/null
+++ b/src/components/template/CSidebarForm.vue
@@ -0,0 +1,11 @@
+<template>
+  <div class="c-sidebar-form">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CSidebarForm'
+}
+</script>
diff --git a/src/components/template/CSidebarHeader.vue b/src/components/template/CSidebarHeader.vue
new file mode 100644
index 00000000..256c62d7
--- /dev/null
+++ b/src/components/template/CSidebarHeader.vue
@@ -0,0 +1,11 @@
+<template>
+  <div class="c-sidebar-header">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CSidebarHeader'
+}
+</script>
diff --git a/src/components/template/CSidebarMinimizer.vue b/src/components/template/CSidebarMinimizer.vue
new file mode 100644
index 00000000..0557d4fe
--- /dev/null
+++ b/src/components/template/CSidebarMinimizer.vue
@@ -0,0 +1,13 @@
+<template>
+  <button
+    class="c-sidebar-minimizer"
+    type="button"
+  >
+  </button>
+</template>
+
+<script>
+export default {
+  name: 'CSidebarMinimizer'
+}
+</script>
diff --git a/src/components/template/CSidebarNav.vue b/src/components/template/CSidebarNav.vue
new file mode 100644
index 00000000..c32e5340
--- /dev/null
+++ b/src/components/template/CSidebarNav.vue
@@ -0,0 +1,38 @@
+<template>
+  <CScrollbar
+    class="c-sidebar-nav h-100"
+    :settings="psSettings"
+    :switcher="!state.minimize"
+    tag="ul"
+  >
+    <slot></slot>
+  </CScrollbar>
+</template>
+
+<script>
+import CScrollbar from '../scrollbar/CScrollbar'
+
+export default {
+  name: 'CSidebarNav',
+  components: {
+    CScrollbar
+  },
+  inject: {
+    state: {
+      default: false
+    }
+  },
+  computed: {
+    psSettings () {
+      // ToDo: find better rtl fix
+      return {
+        maxScrollbarLength: 200,
+        minScrollbarLength: 40,
+        suppressScrollX: getComputedStyle(document.querySelector('html')).direction !== 'rtl',
+        wheelPropagation: false
+      }
+    }
+  }
+}
+</script>
+
diff --git a/src/components/template/CSidebarNavDivider.vue b/src/components/template/CSidebarNavDivider.vue
new file mode 100644
index 00000000..d668c77e
--- /dev/null
+++ b/src/components/template/CSidebarNavDivider.vue
@@ -0,0 +1,9 @@
+<template>
+  <li class="c-sidebar-nav-divider"></li>
+</template>
+
+<script>
+export default {
+  name: 'CSidebarNavDivider'
+}
+</script>
diff --git a/src/components/template/CSidebarNavDropdown.vue b/src/components/template/CSidebarNavDropdown.vue
new file mode 100644
index 00000000..203ad9f5
--- /dev/null
+++ b/src/components/template/CSidebarNavDropdown.vue
@@ -0,0 +1,101 @@
+<template>
+  <li :class="dropdownClasses">
+    <a class="c-sidebar-nav-dropdown-toggle" @click="handleClick">
+      <CIcon v-if="icon" v-bind="computedIcon"/>
+      <i v-if="fontIcon" :class="['c-sidebar-nav-icon', fontIcon]"></i>
+      {{name}}
+    </a>
+    <ul class="c-sidebar-nav-dropdown-items" @click="itemClicked">
+      <slot>
+        <template v-for="(item, key) in items">
+          <CSidebarNavItem v-bind="item" :key="key"/>
+        </template>
+      </slot>
+    </ul>
+  </li>
+</template>
+
+<script>
+import CIcon from '@coreui/icons-vue/src/CIconRaw.vue'
+import CSidebarNavItem from './CSidebarNavItem'
+
+export default {
+  name:'CSidebarNavDropdown',
+  components: {
+    CIcon,
+    CSidebarNavItem
+  },
+  props: {
+    name: String,
+    route: {
+      type: String,
+      validator: val => val.length > 0
+    },
+    icon: [String, Object],
+    fontIcon: String,
+    show: Boolean,
+    items: Array
+  },
+  data () {
+    return {
+      open: this.show
+    }
+  },
+  inject: {
+    dropdownMode: {
+      default: 'openActive'
+    }
+  },
+  watch: {
+    show (val) {
+      this.open = val
+    },
+    $route: {
+      immediate: true,
+      handler (route) {
+        const mode = this.dropdownMode
+        if (mode === 'close') {
+          this.open = false
+        } else if (mode === 'closeInactive' && this.route) {
+          this.open = route.fullPath.includes(this.route)
+        }  else if (mode === 'openActive' && !this.open && this.route) {
+          this.open = route.fullPath.includes(this.route)
+        }
+        // else if (mode === 'noAction') {
+        //   return
+        // }
+      }
+    }
+  },
+  computed: {
+    dropdownClasses () {
+      return [
+        'c-sidebar-nav-dropdown',
+        { 'c-show': this.open }
+      ]
+    },
+    computedIcon () {
+      if (typeof this.icon === 'object') {
+        const key = this.icon.size ? 'class' : 'customClasses'
+        return {
+          ...this.icon,
+          [`${key}`]: this.icon.customClasses || 
+                      ['c-sidebar-nav-icon', this.icon.className]
+        }
+      } else {
+        return { customClasses: 'c-sidebar-nav-icon', name: this.icon }
+      }
+    }
+  },
+  methods: {
+    handleClick (e) {
+      e.preventDefault()
+      this.open = !this.open
+      this.$emit('update:show', this.open)
+    },
+    itemClicked (e) {
+      this.$emit('item-clicked', e)
+    }
+  }
+}
+</script>
diff --git a/src/components/template/CSidebarNavItem.vue b/src/components/template/CSidebarNavItem.vue
new file mode 100644
index 00000000..47fe8884
--- /dev/null
+++ b/src/components/template/CSidebarNavItem.vue
@@ -0,0 +1,88 @@
+<template>
+  <li class="c-sidebar-nav-item">
+    <slot>
+      <CLink
+        :class="linkClasses"
+        v-bind="computedLinkProps"
+      >
+        <CIcon v-if="icon" v-bind="computedIcon"/>
+        <i v-if="fontIcon" :class="['c-sidebar-nav-icon', fontIcon]"/>
+        {{name}}
+        <CBadge
+          v-if="badge"
+          v-bind="Object.assign({}, badge, { text: null })"
+        >
+          {{badge.text}}
+        </CBadge>
+      </CLink>
+    </slot>
+  </li>
+</template>
+
+<script>
+import CLink, { props as linkProps } from '../link/CLink'
+import CBadge from '../badge/CBadge'
+import CIcon from '@coreui/icons-vue/src/CIconRaw.vue'
+
+const props = Object.assign(
+  {}, 
+  linkProps, 
+  {
+    exact: {
+      type: Boolean,
+      default: true
+    },
+    activeClass: {
+      type: String,
+      default: 'c-active'
+    }
+  },
+  {
+    name: String,
+    icon: [String, Object],
+    fontIcon: String,
+    badge: Object,
+    addLinkClasses: [String, Array, Object],
+    label: Boolean,
+    color: String
+  }
+)
+
+export default {
+  name: 'CSidebarNavItem',
+  components: {
+    CLink, 
+    CBadge,
+    CIcon
+  },
+  props,
+  computed: {
+    computedLinkProps () {
+      return Object.keys(linkProps).reduce((props, key) => {
+        props[key] = this[key]
+        return props
+      }, {})
+    },
+    linkClasses () {
+      return [
+        this.label ? 'c-sidebar-nav-label' : 'c-sidebar-nav-link',
+        this.color && `c-sidebar-nav-link-${this.color}`,
+        this.addLinkClasses
+      ]
+    },
+    computedIcon () {
+      if (typeof this.icon === 'object') {
+        const key = this.icon.size ? 'class' : 'customClasses'
+        return {
+          ...this.icon,
+          [`${key}`]: this.icon.customClasses || 
+                      ['c-sidebar-nav-icon', this.icon.className]
+        }
+      } else {
+        return { customClasses: 'c-sidebar-nav-icon', name: this.icon }
+      }
+    }
+  }
+}
+</script>
+
diff --git a/src/components/template/CSidebarNavTitle.vue b/src/components/template/CSidebarNavTitle.vue
new file mode 100644
index 00000000..8738a848
--- /dev/null
+++ b/src/components/template/CSidebarNavTitle.vue
@@ -0,0 +1,11 @@
+<template>
+  <li class="c-sidebar-nav-title">
+    <slot></slot>
+  </li>
+</template>
+
+<script>
+export default {
+  name: 'CSidebarNavTitle'
+}
+</script>
diff --git a/src/components/template/CSubheader.vue b/src/components/template/CSubheader.vue
new file mode 100644
index 00000000..d537e3cb
--- /dev/null
+++ b/src/components/template/CSubheader.vue
@@ -0,0 +1,17 @@
+<template>
+  <component :is="tag" class="c-subheader">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CSubheader',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/template/CWrapper.vue b/src/components/template/CWrapper.vue
new file mode 100644
index 00000000..36121358
--- /dev/null
+++ b/src/components/template/CWrapper.vue
@@ -0,0 +1,29 @@
+<template>
+  <component :is="tag" :class="classList">
+    <slot></slot>
+  </component>
+</template>
+
+<script>
+export default {
+  name: 'CWrapper',
+  props: {
+    tag: {
+      type: String,
+      default: 'div'
+    },
+    fluid: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {
+    classList () {
+      return [
+        'c-wrapper',
+        { 'c-wrapper-fluid' : this.fluid }
+      ]
+    }
+  }
+}
+</script>
diff --git a/src/components/template/index.js b/src/components/template/index.js
new file mode 100644
index 00000000..2e155be7
--- /dev/null
+++ b/src/components/template/index.js
@@ -0,0 +1,49 @@
+import CFooter from './CFooter'
+
+import CHeader from './CHeader'
+import CHeaderBrand from './CHeaderBrand'
+import CHeaderNav from './CHeaderNav'
+import CHeaderNavItem from './CHeaderNavItem'
+import CHeaderNavLink from './CHeaderNavLink'
+import CSubheader from './CSubheader'
+
+import CSidebar from './CSidebar'
+import CSidebarBrand from './CSidebarBrand'
+import CSidebarClose from './CSidebarClose'
+import CSidebarFooter from './CSidebarFooter'
+import CSidebarForm from './CSidebarForm'
+import CSidebarHeader from './CSidebarHeader'
+import CSidebarMinimizer from './CSidebarMinimizer'
+import CSidebarNav from './CSidebarNav'
+import CSidebarNavDivider from './CSidebarNavDivider'
+import CSidebarNavDropdown from './CSidebarNavDropdown'
+import CSidebarNavItem from './CSidebarNavItem'
+import CSidebarNavTitle from './CSidebarNavTitle'
+
+import CWrapper from './CWrapper'
+
+export {
+  CFooter,
+
+  CHeader,
+  CHeaderBrand,
+  CHeaderNav,
+  CHeaderNavItem,
+  CHeaderNavLink,
+  CSubheader,
+
+  CSidebar,
+  CSidebarBrand,
+  CSidebarClose,
+  CSidebarFooter,
+  CSidebarForm,
+  CSidebarHeader,
+  CSidebarMinimizer,
+  CSidebarNav,
+  CSidebarNavDivider,
+  CSidebarNavDropdown,
+  CSidebarNavItem,
+  CSidebarNavTitle,
+
+  CWrapper
+}
diff --git a/src/components/template/tests/CFooter.spec.js b/src/components/template/tests/CFooter.spec.js
new file mode 100644
index 00000000..d02e3626
--- /dev/null
+++ b/src/components/template/tests/CFooter.spec.js
@@ -0,0 +1,15 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CFooter'
+
+const ComponentName = 'CFooter'
+const wrapper = mount(Component)
+
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/template/tests/CHeader.spec.js b/src/components/template/tests/CHeader.spec.js
new file mode 100644
index 00000000..2e7d2825
--- /dev/null
+++ b/src/components/template/tests/CHeader.spec.js
@@ -0,0 +1,14 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CHeader'
+
+const ComponentName = 'CHeader'
+const wrapper = mount(Component)
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/template/tests/CHeaderBrand.spec.js b/src/components/template/tests/CHeaderBrand.spec.js
new file mode 100644
index 00000000..5e5d25ee
--- /dev/null
+++ b/src/components/template/tests/CHeaderBrand.spec.js
@@ -0,0 +1,22 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CHeaderBrand'
+
+const ComponentName = 'CHeaderBrand'
+const wrapper = mount(Component)
+const linkWrapper = mount(Component, {
+  propsData: {
+    href: 'https://coreui.io'
+  }
+})
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly as div', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly as link', () => {
+    expect(linkWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/template/tests/CHeaderNavLink.spec.js b/src/components/template/tests/CHeaderNavLink.spec.js
new file mode 100644
index 00000000..2051cc62
--- /dev/null
+++ b/src/components/template/tests/CHeaderNavLink.spec.js
@@ -0,0 +1,14 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CHeaderNavLink'
+
+const ComponentName = 'CHeaderNavLink'
+const wrapper = mount(Component)
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/template/tests/CSidebar.spec.js b/src/components/template/tests/CSidebar.spec.js
new file mode 100644
index 00000000..f4d2d191
--- /dev/null
+++ b/src/components/template/tests/CSidebar.spec.js
@@ -0,0 +1,131 @@
+import { mount } from '@vue/test-utils'
+import CSidebar from '../CSidebar'
+import Vue from 'vue'
+
+const ComponentName = 'CSidebar'
+const wrapper = mount(CSidebar,
+  {
+    propsData: {
+      aside: true,
+      colorScheme: 'light',
+      size: 'lg'
+    },
+    attrs: {
+      id: 'sidebar'
+    }
+  }
+)
+
+const App = Vue.extend({
+  components: { CSidebar },
+  data () {
+    return {
+      props: {
+        minimize: false,
+        show: true
+      }
+    }
+  },
+  render (h) {
+    const Sidebar = h('CSidebar', { props: this.props }, [
+      h(
+        'a',
+        {
+          attrs: { 
+            href: '/some-path',
+            class: 'c-sidebar-nav-link'
+          }
+        },
+        ['link']
+      ),
+      h(
+        'a', {
+          attrs: {
+            href: '/some-path',
+            class: 'c-sidebar-nav-dropdown'
+          }
+        },
+        ['link']
+      ),
+    ])
+    const View = h('div', { attrs: { class: 'view' }}, ['content'])
+    return h('div', [
+      Sidebar, View
+    ])
+  }
+})
+
+const generateWrapper = () => mount(App, { attachToDocument: true })
+const sidebarWrapper = generateWrapper()
+const sidebarComponent = sidebarWrapper.vm.$children[0]
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(CSidebar.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly', () => {
+    expect(sidebarWrapper.element).toMatchSnapshot()
+  })
+  it('close sidebar on CSidebarNavLink click when in mobile width', () => {
+    //cover branch, css vars not included in tests yet
+    sidebarComponent.isOnMobile()
+    //for isOnMobileFunction be called
+    sidebarComponent.isOnMobile = () => sidebarComponent.bodyWidth < 768
+    const sidebarClick = (className) => {
+      sidebarWrapper.find(`a.c-sidebar-nav-${className}`).trigger('click')
+    }
+    sidebarComponent.bodyWidth = 1300
+    sidebarClick('link')
+    sidebarComponent.bodyWidth = 200
+    sidebarClick('dropdown')
+    expect(sidebarComponent.open).toBe(true)
+    sidebarClick('link')
+    expect(sidebarComponent.open).toBe('responsive')
+  })
+  it('closes sidebar on outside click when overlaid', () => {
+    const customWrapper = generateWrapper()
+    const customComponent = customWrapper.vm.$children[0]
+    customWrapper.setData({
+      props: {
+        show: false
+      }
+    })
+    customWrapper.setData({
+      props: {
+        overlaid: true,
+        show: true
+      }
+    })
+    expect(customComponent.open).toBe(true)
+    customComponent.$el.click()
+    expect(customComponent.open).toBe(true)
+    document.body.click()
+    expect(customComponent.open).toBe(false)
+  })
+  it('watches for prop changes', () => {
+    sidebarWrapper.setData({
+      props: {
+        show: false,
+      }
+    })
+    expect(sidebarComponent.open).toBe(false)
+    sidebarWrapper.setData({
+      props: {
+        show: true,
+      }
+    })
+    expect(sidebarComponent.open).toBe(true)
+  })
+  it('properly destroys sidebar', () => {
+    const currentBackdropNumber = () => {
+      return document.getElementById(sidebarComponent._uid + 'backdrop')
+    }
+    expect(currentBackdropNumber()).not.toBe(null)
+    sidebarWrapper.destroy()
+    wrapper.destroy()
+    expect(currentBackdropNumber()).toBe(null)
+  })
+})
diff --git a/src/components/template/tests/CSidebarBrand.spec.js b/src/components/template/tests/CSidebarBrand.spec.js
new file mode 100644
index 00000000..400e9e12
--- /dev/null
+++ b/src/components/template/tests/CSidebarBrand.spec.js
@@ -0,0 +1,21 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarBrand'
+const ComponentName = 'CSidebarBrand'
+const wrapper = mount(Component)
+const linkWrapper = mount(Component, {
+  propsData: {
+    href: 'https://coreui.io'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly as div', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly as link', () => {
+    expect(linkWrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/template/tests/CSidebarClose.spec.js b/src/components/template/tests/CSidebarClose.spec.js
new file mode 100644
index 00000000..a02c357c
--- /dev/null
+++ b/src/components/template/tests/CSidebarClose.spec.js
@@ -0,0 +1,13 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarClose'
+const ComponentName = 'CSidebarClose'
+const wrapper = mount(Component)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
\ No newline at end of file
diff --git a/src/components/template/tests/CSidebarFooter.spec.js b/src/components/template/tests/CSidebarFooter.spec.js
new file mode 100644
index 00000000..e0e4635e
--- /dev/null
+++ b/src/components/template/tests/CSidebarFooter.spec.js
@@ -0,0 +1,21 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarFooter'
+
+const ComponentName = 'CSidebarFooter'
+const wrapper = mount(Component, { slots: { default: 'test'}})
+// /* eslint-disable no-console */
+// console.log("something")
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // Inspect the raw component options
+  // it('has hasSlotDefault computed property', () => {
+  //   expect(typeof Component.computed.hasSlotDefault).toBe('function')
+  // })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+    // expect(wrapper.classes()).toContain('sidebar-footer')
+  })
+});
diff --git a/src/components/template/tests/CSidebarForm.spec.js b/src/components/template/tests/CSidebarForm.spec.js
new file mode 100644
index 00000000..89c5d526
--- /dev/null
+++ b/src/components/template/tests/CSidebarForm.spec.js
@@ -0,0 +1,21 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarForm'
+
+const ComponentName = 'CSidebarForm'
+const wrapper = mount(Component, { slots: { default: 'test'}})
+// /* eslint-disable no-console */
+// console.log("something")
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // Inspect the raw component options
+  // it('has hasSlotDefault computed property', () => {
+  //   expect(typeof Component.computed.hasSlotDefault).toBe('function')
+  // })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+    // expect(wrapper.classes()).toContain('sidebar-form')
+  })
+});
diff --git a/src/components/template/tests/CSidebarHeader.spec.js b/src/components/template/tests/CSidebarHeader.spec.js
new file mode 100644
index 00000000..66130f51
--- /dev/null
+++ b/src/components/template/tests/CSidebarHeader.spec.js
@@ -0,0 +1,21 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarHeader'
+
+const ComponentName = 'CSidebarHeader'
+const wrapper = mount(Component, { slots: { default: 'test'}})
+// /* eslint-disable no-console */
+// console.log("something")
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // Inspect the raw component options
+  // it('has hasSlotDefault computed property', () => {
+  //   expect(typeof Component.computed.hasSlotDefault).toBe('function')
+  // })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+    // expect(wrapper.classes()).toContain('sidebar-header')
+  })
+});
diff --git a/src/components/template/tests/CSidebarMinimizer.spec.js b/src/components/template/tests/CSidebarMinimizer.spec.js
new file mode 100644
index 00000000..47fa1758
--- /dev/null
+++ b/src/components/template/tests/CSidebarMinimizer.spec.js
@@ -0,0 +1,27 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarMinimizer'
+
+const ComponentName = 'CSidebarMinimizer'
+const wrapper = mount(Component)
+// /* eslint-disable no-console */
+// console.log("something")
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // Inspect the raw component options
+  // it('has onClick method', () => {
+  //   expect(typeof Component.methods.onClick).toBe('function')
+  // })
+  // it('has sidebarMinimize method', () => {
+  //   expect(typeof Component.methods.sidebarMinimize).toBe('function')
+  // })
+  // it('has brandMinimize method', () => {
+  //   expect(typeof Component.methods.brandMinimize).toBe('function')
+  // })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+    // expect(wrapper.classes()).toContain('sidebar-minimizer')
+  })
+});
diff --git a/src/components/template/tests/CSidebarNav.spec.js b/src/components/template/tests/CSidebarNav.spec.js
new file mode 100644
index 00000000..c152d1f8
--- /dev/null
+++ b/src/components/template/tests/CSidebarNav.spec.js
@@ -0,0 +1,48 @@
+import { mount } from '@vue/test-utils'
+import CSidebarNav from '../CSidebarNav'
+import CSidebar from '../CSidebar'
+import Vue from 'vue'
+
+
+const ComponentName = 'CSidebarNav'
+const wrapper = mount(CSidebarNav)
+
+const Sidebar = Vue.extend({
+  components: { CSidebar, CSidebarNav },
+  data () {
+    return {
+      minimize: false
+    }
+  },
+  render (h) {
+    return h(
+      'CSidebar', 
+      { props: { minimize: this.minimize } }, 
+      [h('CSidebarNav')]
+    )
+  }
+})
+
+const sidebarWrapper = mount(Sidebar)
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(CSidebarNav.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly in sidebar', () => {
+    expect(sidebarWrapper.element).toMatchSnapshot()
+  })
+  it('properly inherits state from sidebar', () => {
+    const nav = sidebarWrapper.vm.$children[0].$children[0]
+    expect(nav.state.minimize).toBe(false)
+
+    sidebarWrapper.setData({minimize: true})
+    expect(nav.state.minimize).toBe(true)
+
+    sidebarWrapper.setData({minimize: false})
+    expect(nav.state.minimize).toBe(false)
+  })
+})
diff --git a/src/components/template/tests/CSidebarNavDivider.spec.js b/src/components/template/tests/CSidebarNavDivider.spec.js
new file mode 100644
index 00000000..874cf1b2
--- /dev/null
+++ b/src/components/template/tests/CSidebarNavDivider.spec.js
@@ -0,0 +1,22 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarNavDivider'
+
+const ComponentName = 'CSidebarNavDivider'
+const wrapper = mount(Component)
+// /* eslint-disable no-console */
+// console.log("something")
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // Inspect the raw component options
+  // it('has hasSlotDefault computed property', () => {
+  //   // expect(typeof Component.computed.classList).toBe('function')
+  //   expect(typeof Component.computed.itemClasses).toBe('function')
+  // })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+    // expect(wrapper.classes()).toContain('divider')
+  })
+});
diff --git a/src/components/template/tests/CSidebarNavDropdown.spec.js b/src/components/template/tests/CSidebarNavDropdown.spec.js
new file mode 100644
index 00000000..338f0a88
--- /dev/null
+++ b/src/components/template/tests/CSidebarNavDropdown.spec.js
@@ -0,0 +1,73 @@
+import { mount, createLocalVue } from '@vue/test-utils'
+import VueRouter from 'vue-router'
+import CSidebarNavDropdown from '../CSidebarNavDropdown'
+
+const localVue = createLocalVue()
+localVue.use(VueRouter)
+const router = new VueRouter()
+
+const ComponentName = 'CSidebarNavDropdown'
+
+const wrapperMounting = (mode, icon = 'cui-settings') => mount(
+  CSidebarNavDropdown,
+  { 
+    localVue, 
+    router, 
+    propsData: { 
+      route: '/somePath' ,
+      icon
+    },
+    provide: {
+      dropdownMode: mode
+    }
+  }
+)
+
+const wrapper = wrapperMounting('openActive', { name: 'cui-settings', size: 'lg' })
+const wrapperCloseMode = wrapperMounting('close', { name: 'cui-settings'})
+const wrapperCloseInactiveMode = wrapperMounting('closeInactive')
+
+const routeChange = (wrapperToChangeRoute, route) => { 
+  wrapperToChangeRoute.vm.$router.push(route)
+}
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CSidebarNavDropdown.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('changes state on show prop change', () => {
+    wrapper.setProps({ show: true })
+    expect(wrapper.vm.open).toBe(true)
+  })
+  it('changes state when clicked on toggle', () => {
+    wrapper.find('.c-sidebar-nav-dropdown-toggle').trigger('click')
+    expect(wrapper.vm.open).toBe(false)
+    expect(wrapper.emitted()['update:show']).toBeTruthy()
+  })
+  it('emitts item-click event when click inside dropdown', () => {
+    wrapper.find('ul').trigger('click')
+    expect(wrapper.emitted()['item-clicked']).toBeTruthy()
+  })
+  it('show active dropdown on route change when in openActive mode', () => {
+    expect(wrapper.vm.open).toBe(false)
+    routeChange(wrapper, '/somePath/sub1')
+    expect(wrapper.vm.open).toBe(true)
+  })
+  it('close dropdown on route change when in close mode', () => {
+    wrapperCloseMode.setProps({show: true})
+    expect(wrapperCloseMode.vm.open).toBe(true)
+    routeChange(wrapperCloseMode, '/somePath/sub2')
+    expect(wrapperCloseMode.vm.open).toBe(false)
+  })
+  it('close inactive dropdown on route change when in closeInactive mode', () => {
+    wrapperCloseInactiveMode.setProps({show: true})
+    expect(wrapperCloseInactiveMode.vm.open).toBe(true)
+    routeChange(wrapperCloseInactiveMode, '/somePath/sub3')
+    expect(wrapperCloseInactiveMode.vm.open).toBe(true)
+    routeChange(wrapperCloseInactiveMode, '/otherDropdownRoute')
+    expect(wrapperCloseInactiveMode.vm.open).toBe(false)
+  })
+})
diff --git a/src/components/template/tests/CSidebarNavItem.spec.js b/src/components/template/tests/CSidebarNavItem.spec.js
new file mode 100644
index 00000000..ae9c3f68
--- /dev/null
+++ b/src/components/template/tests/CSidebarNavItem.spec.js
@@ -0,0 +1,53 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarNavItem'
+
+const ComponentName = 'CSidebarNavItem'
+const wrapper = mount(Component, {
+  attachToDocument: true,
+  propsData: {
+    name: 'test link',
+    icon: 'cui-settings',
+    badge: {
+      color: 'success',
+      text: 'NEW'
+    },
+    color: 'success'
+  },
+  attrs: {
+    id: 'link'
+  }
+})
+
+const wrapperLabel = mount(Component, {
+  attachToDocument: true,
+  propsData: {
+    name: 'test link',
+    label: true,
+    icon: { name: 'cui-settings' },
+    badge: {
+      color: 'success',
+      text: 'NEW'
+    }
+  },
+  attrs: {
+    id: 'link'
+  }
+})
+
+describe(`${ComponentName}.vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly in label mode', () => {
+    expect(wrapperLabel.element).toMatchSnapshot()
+  })
+  it('assign correct classes in case of custom icon size', () => {
+    wrapperLabel.setProps({ icon: { name: 'cui-settings', size: 'lg' }})
+    expect(wrapperLabel.find('svg').classes().join(',')).toBe(
+      'c-icon,c-icon-lg,c-sidebar-nav-icon'
+    )
+  })
+})
\ No newline at end of file
diff --git a/src/components/template/tests/CSidebarNavTitle.spec.js b/src/components/template/tests/CSidebarNavTitle.spec.js
new file mode 100644
index 00000000..63222fc2
--- /dev/null
+++ b/src/components/template/tests/CSidebarNavTitle.spec.js
@@ -0,0 +1,18 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CSidebarNavTitle'
+
+const ComponentName = 'CSidebarNavTitle'
+const wrapper = mount(Component, {
+  slots: {
+    default: 'title'
+  }
+})
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/template/tests/CWrapper.spec.js b/src/components/template/tests/CWrapper.spec.js
new file mode 100644
index 00000000..41b7d5f8
--- /dev/null
+++ b/src/components/template/tests/CWrapper.spec.js
@@ -0,0 +1,15 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWrapper'
+
+const ComponentName = 'CWrapper'
+const wrapper = mount(Component)
+
+
+describe(`${ComponentName}.vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toBe(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/template/tests/__snapshots__/CFooter.spec.js.snap b/src/components/template/tests/__snapshots__/CFooter.spec.js.snap
new file mode 100644
index 00000000..cefcd1ae
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CFooter.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CFooter .vue renders correctly 1`] = `
+<footer
+  class="c-footer c-footer-fixed"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CHeader.spec.js.snap b/src/components/template/tests/__snapshots__/CHeader.spec.js.snap
new file mode 100644
index 00000000..36bf8c74
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CHeader.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CHeader .vue renders correctly 1`] = `
+<header
+  class="c-header c-header-light c-header-fixed"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CHeaderBrand.spec.js.snap b/src/components/template/tests/__snapshots__/CHeaderBrand.spec.js.snap
new file mode 100644
index 00000000..00c41924
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CHeaderBrand.spec.js.snap
@@ -0,0 +1,15 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CHeaderBrand .vue renders correctly as div 1`] = `
+<div
+  class="c-header-brand"
+/>
+`;
+
+exports[`CHeaderBrand .vue renders correctly as link 1`] = `
+<a
+  class="c-header-brand"
+  href="https://coreui.io"
+  target="_self"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CHeaderNavLink.spec.js.snap b/src/components/template/tests/__snapshots__/CHeaderNavLink.spec.js.snap
new file mode 100644
index 00000000..8365c938
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CHeaderNavLink.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CHeaderNavLink .vue renders correctly 1`] = `
+<a
+  class="c-header-nav-link"
+  href="#"
+  target="_self"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebar.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebar.spec.js.snap
new file mode 100644
index 00000000..c6f7e9c1
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebar.spec.js.snap
@@ -0,0 +1,34 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebar .vue renders correctly 1`] = `
+<div
+  class="c-sidebar c-sidebar-light c-sidebar-lg-show c-sidebar-fixed c-sidebar-right c-sidebar-lg"
+  id="sidebar"
+/>
+`;
+
+exports[`CSidebar .vue renders correctly 2`] = `
+<div>
+  <div
+    class="c-sidebar c-sidebar-dark c-sidebar-show c-sidebar-fixed"
+  >
+    <a
+      class="c-sidebar-nav-link"
+      href="/some-path"
+    >
+      link
+    </a>
+    <a
+      class="c-sidebar-nav-dropdown"
+      href="/some-path"
+    >
+      link
+    </a>
+  </div>
+  <div
+    class="view"
+  >
+    content
+  </div>
+</div>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarBrand.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarBrand.spec.js.snap
new file mode 100644
index 00000000..2d688c75
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarBrand.spec.js.snap
@@ -0,0 +1,15 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarBrand renders correctly as div 1`] = `
+<div
+  class="c-sidebar-brand"
+/>
+`;
+
+exports[`CSidebarBrand renders correctly as link 1`] = `
+<a
+  class="c-sidebar-brand"
+  href="https://coreui.io"
+  target="_self"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarClose.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarClose.spec.js.snap
new file mode 100644
index 00000000..28e0b288
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarClose.spec.js.snap
@@ -0,0 +1,24 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarClose renders correctly 1`] = `
+<button
+  aria-label="Close"
+  class="c-sidebar-close"
+  type="button"
+>
+  <svg
+    class="c-icon"
+    height="24"
+    viewBox="0 0 24 24"
+    width="24"
+  >
+    <title>
+      x
+    </title>
+     
+    <path
+      d="M20.030 5.030l-1.061-1.061-6.97 6.97-6.97-6.97-1.061 1.061 6.97 6.97-6.97 6.97 1.061 1.061 6.97-6.97 6.97 6.97 1.061-1.061-6.97-6.97 6.97-6.97z"
+    />
+  </svg>
+</button>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarFooter.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarFooter.spec.js.snap
new file mode 100644
index 00000000..a7ac5b24
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarFooter.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarFooter .vue renders correctly 1`] = `
+<div
+  class="c-sidebar-footer"
+>
+  test
+</div>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarForm.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarForm.spec.js.snap
new file mode 100644
index 00000000..068bd87c
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarForm.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarForm .vue renders correctly 1`] = `
+<div
+  class="c-sidebar-form"
+>
+  test
+</div>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarHeader.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarHeader.spec.js.snap
new file mode 100644
index 00000000..6c01e52e
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarHeader.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarHeader .vue renders correctly 1`] = `
+<div
+  class="c-sidebar-header"
+>
+  test
+</div>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarMinimizer.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarMinimizer.spec.js.snap
new file mode 100644
index 00000000..de6dc67d
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarMinimizer.spec.js.snap
@@ -0,0 +1,8 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarMinimizer .vue renders correctly 1`] = `
+<button
+  class="c-sidebar-minimizer"
+  type="button"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarNav.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarNav.spec.js.snap
new file mode 100644
index 00000000..603c5119
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarNav.spec.js.snap
@@ -0,0 +1,61 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarNav .vue renders correctly 1`] = `
+<ul
+  class="c-sidebar-nav h-100 ps"
+  style="position: relative;"
+>
+  <div
+    class="ps__rail-x"
+    style="left: 0px; top: 0px;"
+  >
+    <div
+      class="ps__thumb-x"
+      style="left: 0px; width: 0px;"
+      tabindex="0"
+    />
+  </div>
+  <div
+    class="ps__rail-y"
+    style="top: 0px; left: 0px;"
+  >
+    <div
+      class="ps__thumb-y"
+      style="top: 0px; height: 0px;"
+      tabindex="0"
+    />
+  </div>
+</ul>
+`;
+
+exports[`CSidebarNav .vue renders correctly in sidebar 1`] = `
+<div
+  class="c-sidebar c-sidebar-dark c-sidebar-lg-show c-sidebar-fixed"
+>
+  <ul
+    class="c-sidebar-nav h-100 ps"
+    style="position: relative;"
+  >
+    <div
+      class="ps__rail-x"
+      style="left: 0px; top: 0px;"
+    >
+      <div
+        class="ps__thumb-x"
+        style="left: 0px; width: 0px;"
+        tabindex="0"
+      />
+    </div>
+    <div
+      class="ps__rail-y"
+      style="top: 0px; left: 0px;"
+    >
+      <div
+        class="ps__thumb-y"
+        style="top: 0px; height: 0px;"
+        tabindex="0"
+      />
+    </div>
+  </ul>
+</div>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarNavDivider.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarNavDivider.spec.js.snap
new file mode 100644
index 00000000..8015650d
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarNavDivider.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarNavDivider .vue renders correctly 1`] = `
+<li
+  class="c-sidebar-nav-divider"
+/>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarNavDropdown.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarNavDropdown.spec.js.snap
new file mode 100644
index 00000000..d4ba1ae8
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarNavDropdown.spec.js.snap
@@ -0,0 +1,29 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarNavDropdown renders correctly 1`] = `
+<li
+  class="c-sidebar-nav-dropdown"
+>
+  <a
+    class="c-sidebar-nav-dropdown-toggle"
+  >
+    <svg
+      class="c-icon c-icon-lg c-sidebar-nav-icon"
+      role="img"
+      viewBox="0 0 64 64"
+      xmlns="http://www.w3.org/2000/svg"
+    >
+      undefined
+    </svg>
+     
+    <!---->
+    
+    
+  
+  </a>
+   
+  <ul
+    class="c-sidebar-nav-dropdown-items"
+  />
+</li>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarNavItem.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarNavItem.spec.js.snap
new file mode 100644
index 00000000..f4381caf
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarNavItem.spec.js.snap
@@ -0,0 +1,69 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarNavItem.vue renders correctly 1`] = `
+<li
+  class="c-sidebar-nav-item"
+  id="link"
+>
+  <a
+    class="c-sidebar-nav-link c-sidebar-nav-link-success"
+    href="#"
+    target="_self"
+  >
+    <svg
+      class="c-sidebar-nav-icon"
+      role="img"
+      viewBox="0 0 64 64"
+      xmlns="http://www.w3.org/2000/svg"
+    >
+      undefined
+    </svg>
+     
+    <!---->
+    
+      test link
+      
+    <span
+      class="badge badge-success"
+    >
+      
+        NEW
+      
+    </span>
+  </a>
+</li>
+`;
+
+exports[`CSidebarNavItem.vue renders correctly in label mode 1`] = `
+<li
+  class="c-sidebar-nav-item"
+  id="link"
+>
+  <a
+    class="c-sidebar-nav-label"
+    href="#"
+    target="_self"
+  >
+    <svg
+      class="c-sidebar-nav-icon"
+      role="img"
+      viewBox="0 0 64 64"
+      xmlns="http://www.w3.org/2000/svg"
+    >
+      undefined
+    </svg>
+     
+    <!---->
+    
+      test link
+      
+    <span
+      class="badge badge-success"
+    >
+      
+        NEW
+      
+    </span>
+  </a>
+</li>
+`;
diff --git a/src/components/template/tests/__snapshots__/CSidebarNavTitle.spec.js.snap b/src/components/template/tests/__snapshots__/CSidebarNavTitle.spec.js.snap
new file mode 100644
index 00000000..24811cc1
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CSidebarNavTitle.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSidebarNavTitle .vue renders correctly 1`] = `
+<li
+  class="c-sidebar-nav-title"
+>
+  title
+</li>
+`;
diff --git a/src/components/template/tests/__snapshots__/CWrapper.spec.js.snap b/src/components/template/tests/__snapshots__/CWrapper.spec.js.snap
new file mode 100644
index 00000000..5875738b
--- /dev/null
+++ b/src/components/template/tests/__snapshots__/CWrapper.spec.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWrapper.vue renders correctly 1`] = `
+<div
+  class="c-wrapper"
+/>
+`;
diff --git a/src/components/toast/CToast.vue b/src/components/toast/CToast.vue
new file mode 100644
index 00000000..2b860e67
--- /dev/null
+++ b/src/components/toast/CToast.vue
@@ -0,0 +1,145 @@
+<template>
+  <transition :name="props.fade ? 'fade' : null" :appear="true"> 
+    <div
+      v-if="isShowed"
+      :class="toastClasses"
+      role="alert"
+      aria-live="assertive"
+      aria-atomic="true"
+    >
+      <div 
+        v-if="header !== undefined || $slots.header" 
+        class="toast-header"
+      >
+        <slot name="header">
+          <strong class="mfe-auto">{{header}}</strong>
+        </slot>
+        <CButtonClose
+          v-if="props.closeButton"
+          @click="close()"
+          class="mfs-2 mb-1"
+        />
+      </div>
+      <div class="toast-body">
+        <slot></slot>
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script>
+import { props } from './toast-props'
+import CButtonClose from '../button/CButtonClose'
+
+export default {
+  name: 'CToast',
+  components: {
+    CButtonClose
+  },
+  props: {
+    ...props,
+    show: Boolean,
+    header: String
+  },
+  inject: {
+    toaster: {
+      default: false
+    }
+  },
+  data () {
+    return {
+      isShowed: this.show,
+      hideTimeout: null,
+      closeTimeout: null
+    }
+  },
+  watch: {
+    show: {
+      immediate: true,
+      handler (val) {
+        val ? this.display() : this.close()
+      }
+    }
+  },
+  computed: {
+    directlyDeclaredProps () {
+      return Object.keys(this.$options.propsData)
+    },
+    injectedProps () {
+      return this.toaster && this.toaster.props ? this.toaster.props : {}
+    },
+    props () {
+      return Object.keys(props).reduce((computedProps, key) => {
+        const propIsDirectlyDeclared = this.directlyDeclaredProps.includes(key)
+        const parentPropExists = this.injectedProps[key] !== undefined
+        const propIsInherited = parentPropExists && !propIsDirectlyDeclared
+        computedProps[key] = propIsInherited ? this.injectedProps[key] : this[key]
+        return computedProps
+      }, {})
+    },
+    toastClasses () {
+      return [
+        'toast',
+        { [`toast-${this.color}`]: !!this.color }
+      ]
+    }
+  },
+  methods: {
+    display () {
+      this.isShowed = true
+      this.$nextTick(() => {
+        if (this.props.autohide) {
+          this.setAutohide()
+        }
+      })
+    },
+    close () {
+      this.isShowed = false
+      this.$emit('update:show', false)
+      this.$el.removeEventListener('mouseover', this.onHover)
+      this.$el.removeEventListener('mouseover', this.restoreHiddingToast)
+      this.$el.removeEventListener('mouseout', this.onHoverOut)
+    },
+    setHiddingMode () {
+      this.isShowed = false
+      this.$el.removeEventListener('mouseover', this.onHover)
+      this.closeTimeout = setTimeout(() => this.close(), 1500)
+      this.$el.addEventListener('mouseover', this.restoreHiddingToast)
+    },
+    restoreHiddingToast () {
+      clearTimeout(this.closeTimeout)
+      this.display()
+    },
+    onHover () {
+      this.$el.removeEventListener('mouseover', this.onHover)
+      clearTimeout(this.hideTimeout)
+      this.$el.addEventListener('mouseout', this.onHoverOut)
+    },
+    onHoverOut () {
+      this.$el.removeEventListener('mouseout', this.onHoverOut)
+      this.setAutohide()
+    },
+    setAutohide () {
+      this.hideTimeout = setTimeout(() => {
+        this.setHiddingMode()
+      }, this.props.autohide)
+      this.$el.addEventListener('mouseover', this.onHover)
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .toast {
+    opacity: inherit;
+  }
+  .fade-enter-active {
+    transition: opacity .5s;
+  }
+  .fade-leave-active {
+    transition: opacity 2s;
+  }
+  .fade-enter, .fade-leave-to {
+    opacity: 0;
+  }
+</style>
diff --git a/src/components/toast/CToaster.vue b/src/components/toast/CToaster.vue
new file mode 100644
index 00000000..60b829c8
--- /dev/null
+++ b/src/components/toast/CToaster.vue
@@ -0,0 +1,42 @@
+<template>
+  <div :class="toasterClasses">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+import { props } from './toast-props'
+
+export default {
+  name: 'CToaster',
+  provide () {
+    const toaster = {}
+    Object.defineProperty(toaster, 'props', {
+      get: () => this._props
+    })
+    return { toaster }
+  },
+  props: {
+    ...props,
+    position: {
+      type: String,
+      default: 'top-right',
+      validator: position => {
+        return [
+          '', 'static', 'top-right', 'top-left', 'top-center', 'top-full',
+          'bottom-right', 'bottom-left', 'bottom-center', 'bottom-full'
+        ].includes(position)
+      }
+    }
+  },
+  computed: {
+    toasterClasses () {
+      const hasFixedPosition = this.position && this.position !== 'static'
+      return [
+        'toaster',
+        { [`toaster-${this.position}`]: hasFixedPosition }
+      ]
+    }
+  }
+}
+</script>
diff --git a/src/components/toast/index.js b/src/components/toast/index.js
new file mode 100644
index 00000000..e175699b
--- /dev/null
+++ b/src/components/toast/index.js
@@ -0,0 +1,7 @@
+import CToast from './CToast'
+import CToaster from './CToaster'
+
+export {
+  CToast,
+  CToaster
+}
diff --git a/src/components/toast/tests/CToast.spec.js b/src/components/toast/tests/CToast.spec.js
new file mode 100644
index 00000000..0209de32
--- /dev/null
+++ b/src/components/toast/tests/CToast.spec.js
@@ -0,0 +1,75 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CToast'
+
+const ComponentName = 'CToast'
+const wrapper = mount(Component, {
+  propsData: {
+    show: true,
+    fade: false,
+    position: 'static'
+  }
+})
+
+const customWrapper = mount(Component, {
+  propsData: {
+    show: true,
+    position: 'bottom-center',
+    header: 'title',
+    autohide: 1000,
+    color: 'danger'
+  },
+  slots: {
+    default: 'CToast body'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly custom wrapper', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+
+  it('closes by watcher correctly', () => {
+    wrapper.setProps({ show: false })
+    expect(wrapper.vm.isShowed).toBe(false)
+  })
+  // it('closes by close button correctly', () => {
+  //   wrapper.find('.close').trigger('click')
+  //   expect(wrapper.vm.isShowed).toBe(false)
+  // })
+  it('autohiding works correctly', (done) => {
+    setTimeout(() => {
+      customWrapper.find('div').trigger('mouseover')
+      customWrapper.find('div').trigger('mouseout')
+    }, 900)
+
+    setTimeout(() => {
+      expect(customWrapper.vm.isShowed).toBe(true)
+    }, 1100)
+
+    setTimeout(() => {
+      expect(customWrapper.vm.closeTimeout).toBeTruthy()
+      expect(customWrapper.vm.isShowed).toBe(false)
+      customWrapper.vm.restoreHiddingToast()
+      expect(customWrapper.vm.isShowed).toBe(true)
+    }, 2000)
+
+    setTimeout(() => {
+      expect(customWrapper.emitted()['update:show']).toBeTruthy()
+      done()
+    }, 4600)
+
+
+  })
+    // it('closes by watcher correctly', () => {
+    //   wrapper.vm.$nextTick(() => {
+    //     wrapper.find('.close').trigger('click')
+    //     expect(wrapper.vm.isShowed).toBe(false)
+    //   })
+    // })
+})
diff --git a/src/components/toast/tests/CToaster.spec.js b/src/components/toast/tests/CToaster.spec.js
new file mode 100644
index 00000000..6bbea2e4
--- /dev/null
+++ b/src/components/toast/tests/CToaster.spec.js
@@ -0,0 +1,39 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CToaster'
+import CToast from '../CToast'
+const ComponentName = 'CToaster'
+
+const toast = {
+  render (h) {
+    return h(
+      CToast, 
+      { props: { show: true } }, 
+      'toast body'
+    )
+  }
+}
+
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    position: 'top-left',
+    autohide: 3000,
+    closeButton: false,
+    fade: false
+  },
+  slots: {
+    default: toast
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly custom wrapper', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/toast/tests/__snapshots__/CToast.spec.js.snap b/src/components/toast/tests/__snapshots__/CToast.spec.js.snap
new file mode 100644
index 00000000..4de83d9f
--- /dev/null
+++ b/src/components/toast/tests/__snapshots__/CToast.spec.js.snap
@@ -0,0 +1,54 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CToast renders correctly 1`] = `
+<div
+  appear="true"
+  aria-atomic="true"
+  aria-live="assertive"
+  class="toast"
+  position="static"
+  role="alert"
+>
+  <!---->
+   
+  <div
+    class="toast-body"
+  />
+</div>
+`;
+
+exports[`CToast renders correctly custom wrapper 1`] = `
+<div
+  appear="true"
+  aria-atomic="true"
+  aria-live="assertive"
+  class="toast toast-danger"
+  name="fade"
+  position="bottom-center"
+  role="alert"
+>
+  <div
+    class="toast-header"
+  >
+    <strong
+      class="mfe-auto"
+    >
+      title
+    </strong>
+     
+    <button
+      aria-label="Close"
+      class="mfs-2 mb-1 close"
+      type="button"
+    >
+      ×
+    </button>
+  </div>
+   
+  <div
+    class="toast-body"
+  >
+    CToast body
+  </div>
+</div>
+`;
diff --git a/src/components/toast/tests/__snapshots__/CToaster.spec.js.snap b/src/components/toast/tests/__snapshots__/CToaster.spec.js.snap
new file mode 100644
index 00000000..56f5622e
--- /dev/null
+++ b/src/components/toast/tests/__snapshots__/CToaster.spec.js.snap
@@ -0,0 +1,29 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CToaster renders correctly 1`] = `
+<div
+  class="toaster toaster-top-right"
+/>
+`;
+
+exports[`CToaster renders correctly custom wrapper 1`] = `
+<div
+  class="toaster toaster-top-left"
+>
+  <div
+    appear="true"
+    aria-atomic="true"
+    aria-live="assertive"
+    class="toast"
+    role="alert"
+  >
+    <!---->
+     
+    <div
+      class="toast-body"
+    >
+      toast body
+    </div>
+  </div>
+</div>
+`;
diff --git a/src/components/toast/toast-props.js b/src/components/toast/toast-props.js
new file mode 100644
index 00000000..156c557a
--- /dev/null
+++ b/src/components/toast/toast-props.js
@@ -0,0 +1,18 @@
+export const props = {
+  autohide: {
+    type: [Number, Boolean],
+    validator: val => typeof val === 'number' || val === false
+  },
+  closeButton: {
+    type: Boolean,
+    default: true
+  },
+  fade: {
+    type: Boolean,
+    default: true
+  },
+  color: {
+    type: String,
+    default: ''
+  }
+}
diff --git a/src/components/toggler/CToggler.vue b/src/components/toggler/CToggler.vue
new file mode 100644
index 00000000..c58930a6
--- /dev/null
+++ b/src/components/toggler/CToggler.vue
@@ -0,0 +1,32 @@
+<script>
+import { mergeData } from 'vue-functional-data-merge'
+export default {
+  name: 'CToggler',
+  functional: true,
+  props: {
+    tag: {
+      type: String,
+      default: 'button'
+    },
+    inHeader: Boolean,
+    inNavbar: Boolean
+  },
+  render (h, { data, props, slots }) {
+    const attrs = props.tag === 'button' ? { type: 'button' } : null
+    const type = props.inNavbar ? 'navbar' : props.inHeader ? 'c-header' : null 
+    const staticClass = type ? `${type}-toggler` : ''
+    const iconClass = type ? `${staticClass}-icon` : ''
+    return h(
+      props.tag,
+      mergeData({
+        staticClass,
+        attrs
+      }, data),
+      [ 
+        slots().default || 
+        h('span', { class: iconClass })
+      ]
+    )
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/toggler/index.js b/src/components/toggler/index.js
new file mode 100644
index 00000000..7d2a3873
--- /dev/null
+++ b/src/components/toggler/index.js
@@ -0,0 +1,5 @@
+import CToggler from './CToggler'
+
+export {
+  CToggler
+}
diff --git a/src/components/toggler/tests/CToggler.spec.js b/src/components/toggler/tests/CToggler.spec.js
new file mode 100644
index 00000000..cb088d7e
--- /dev/null
+++ b/src/components/toggler/tests/CToggler.spec.js
@@ -0,0 +1,36 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CToggler'
+
+const ComponentName = 'CToggler'
+const wrapper = mount(Component)
+
+const wrapperNavbar = mount(Component, {
+  propsData: {
+    inNavbar: true
+  },
+  slots: {
+    default: 'icon'
+  }
+})
+
+const wrapperHeader = mount(Component, {
+  propsData: {
+    inHeader: true,
+    tag: 'div'
+  }
+})
+
+describe(`${ComponentName} .vue`, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  it('renders correctly', () => {
+    expect(wrapper.element).toMatchSnapshot()
+  })
+  it('renders correctly inNavbar', () => {
+    expect(wrapperNavbar.element).toMatchSnapshot()
+  })
+  it('renders correctly inHeader', () => {
+    expect(wrapperHeader.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/toggler/tests/__snapshots__/CToggler.spec.js.snap b/src/components/toggler/tests/__snapshots__/CToggler.spec.js.snap
new file mode 100644
index 00000000..bb9f0d59
--- /dev/null
+++ b/src/components/toggler/tests/__snapshots__/CToggler.spec.js.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CToggler .vue renders correctly 1`] = `
+<button
+  type="button"
+>
+  <span
+    class=""
+  />
+</button>
+`;
+
+exports[`CToggler .vue renders correctly inHeader 1`] = `
+<div
+  class="c-header-toggler"
+>
+  <span
+    class="c-header-toggler-icon"
+  />
+</div>
+`;
+
+exports[`CToggler .vue renders correctly inNavbar 1`] = `
+<button
+  class="navbar-toggler"
+  type="button"
+>
+  icon
+</button>
+`;
diff --git a/src/components/widgets/CWidgetBrand.vue b/src/components/widgets/CWidgetBrand.vue
new file mode 100644
index 00000000..4c5bf250
--- /dev/null
+++ b/src/components/widgets/CWidgetBrand.vue
@@ -0,0 +1,45 @@
+<template>
+  <div class="card">
+    <div
+      class="card-header content-center text-white p-0"
+      :class="[`bg-${color}`, addHeaderClasses]"
+    >
+      <slot></slot>
+    </div>
+    <slot name="body">
+      <div class="card-body row text-center">
+        <div class="col">
+          <div v-if="rightHeader" class="text-value-lg">
+            {{rightHeader}}
+          </div>
+          <div v-if="rightFooter" class="text-uppercase text-muted small">
+            {{rightFooter}}
+          </div>
+        </div>
+        <div class="c-vr"></div>
+        <div class="col">
+          <div v-if="leftHeader" class="text-value-lg">
+            {{leftHeader}}
+          </div>
+          <div v-if="leftFooter" class="text-uppercase text-muted small">
+            {{leftFooter}}
+          </div>
+        </div>
+      </div>
+    </slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CWidgetBrand',
+  props: {
+    color: String,
+    rightHeader: String,
+    rightFooter: String,
+    leftHeader: String,
+    leftFooter: String,
+    addHeaderClasses: [String, Array, Object]
+  }
+}
+</script>
\ No newline at end of file
diff --git a/src/components/widgets/CWidgetDropdown.vue b/src/components/widgets/CWidgetDropdown.vue
new file mode 100644
index 00000000..2c979013
--- /dev/null
+++ b/src/components/widgets/CWidgetDropdown.vue
@@ -0,0 +1,23 @@
+<template>
+  <div class="card" :class="`bg-${color} text-white`">
+    <div class="card-body pb-0 d-flex justify-content-between">
+      <div>
+        <div v-if="header" class="text-value-lg">{{header}}</div>
+        <div v-if="text">{{text}}</div>
+      </div>
+      <slot></slot>
+    </div>
+    <slot name="footer"></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CWidgetDropdown',
+  props: {
+    color: String,
+    header: String,
+    text: String
+  }
+}
+</script>
diff --git a/src/components/widgets/CWidgetIcon.vue b/src/components/widgets/CWidgetIcon.vue
new file mode 100644
index 00000000..bd88be4d
--- /dev/null
+++ b/src/components/widgets/CWidgetIcon.vue
@@ -0,0 +1,42 @@
+<template>
+  <div class="card">
+    <div
+      class="card-body d-flex align-items-center"
+      :class="iconPadding ? 'p-3' : 'p-0'"
+    >
+      <div
+        class="mr-3 text-white"
+        :class="[`bg-${color}`, iconPadding ? 'p-3' : 'p-4']"
+      >
+        <slot></slot>
+      </div>
+      <div>
+        <div v-if="header" :class="`text-value text-${color}`">
+          {{header}}
+        </div>
+        <div
+          v-if="text"
+          class="text-muted text-uppercase font-weight-bold small"
+        >
+          {{text}}
+        </div>
+      </div>
+    </div>
+    <slot name="footer"></slot>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CWidgetIcon',
+  props: {
+    header: String,
+    text: String,
+    iconPadding: {
+      type: Boolean,
+      default: true
+    },
+    color: String
+  }
+}
+</script>
diff --git a/src/components/widgets/CWidgetProgress.vue b/src/components/widgets/CWidgetProgress.vue
new file mode 100644
index 00000000..a535b9af
--- /dev/null
+++ b/src/components/widgets/CWidgetProgress.vue
@@ -0,0 +1,40 @@
+<template>
+  <div :class="inverse ? `card text-white bg-${color}` : 'card'">
+    <div class="card-body">
+      <div v-if="header" class="h4 m-0">{{header}}</div>
+      <div v-if="text">{{text}}</div>
+      <slot>
+        <CProgress
+          :color="!inverse ? color : ''"
+          :value="value"
+          :class="{ 'progress-white' : inverse }"
+          class="progress-xs my-3 mb-0"
+        />
+      </slot>
+      <small v-if="footer" class="text-muted">
+        {{footer}}
+      </small>
+    </div>
+  </div>
+</template>
+
+<script>
+import CProgress from '../progress/CProgress'
+export default {
+  name: 'CWidgetProgress',
+  components: {
+    CProgress
+  },
+  props: {
+    header: String,
+    text: String,
+    footer: String,
+    color: String,
+    inverse: Boolean,
+    value: {
+      type: Number,
+      default: 25
+    }
+  }
+}
+</script>
diff --git a/src/components/widgets/CWidgetProgressIcon.vue b/src/components/widgets/CWidgetProgressIcon.vue
new file mode 100644
index 00000000..a33ac00f
--- /dev/null
+++ b/src/components/widgets/CWidgetProgressIcon.vue
@@ -0,0 +1,47 @@
+<template>
+  <div :class="inverse ? `card text-white bg-${color}` : 'card'">
+    <div class="card-body">
+      <div
+        v-if="$slots.default"
+        class="h1 text-muted text-right mb-4"
+      >
+        <slot></slot>
+      </div>
+      <div v-if="header" class="h4 mb-0">{{header}}</div>
+      <small
+        v-if="text"
+        class="text-muted text-uppercase font-weight-bold"
+      >
+        {{text}}
+      </small>
+      <slot name="progress">
+        <CProgress
+          :color="!inverse ? color : ''"
+          :value="value"
+          :class="{ 'progress-white' : inverse }"
+          class="progress-xs my-3 mb-0"
+        />
+      </slot>
+    </div>
+  </div>
+</template>
+
+<script>
+import CProgress from '../progress/CProgress'
+export default {
+  name: 'CWidgetProgressIcon',
+  components: {
+    CProgress
+  },
+  props: {
+    header: String,
+    text: String,
+    color: String,
+    inverse: Boolean,
+    value: {
+      type: Number,
+      default: 25
+    }
+  }
+}
+</script>
diff --git a/src/components/widgets/CWidgetSimple.vue b/src/components/widgets/CWidgetSimple.vue
new file mode 100644
index 00000000..86cf72da
--- /dev/null
+++ b/src/components/widgets/CWidgetSimple.vue
@@ -0,0 +1,26 @@
+<template>
+  <div class="card">
+    <div class="card-body text-center">
+      <div
+        v-if="header"
+        class="text-muted small text-uppercase font-weight-bold"
+      >
+        {{header}}
+      </div>
+      <div v-if="text" class="h2 py-3">
+        {{text}}
+      </div>
+      <slot></slot>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CWidgetSimple',
+  props: {
+    header: String,
+    text: String
+  }
+}
+</script>
diff --git a/src/components/widgets/index.js b/src/components/widgets/index.js
new file mode 100644
index 00000000..efc453d6
--- /dev/null
+++ b/src/components/widgets/index.js
@@ -0,0 +1,15 @@
+import CWidgetProgress from './CWidgetProgress'
+import CWidgetIcon from './CWidgetIcon'
+import CWidgetBrand from './CWidgetBrand'
+import CWidgetProgressIcon from './CWidgetProgressIcon'
+import CWidgetDropdown from './CWidgetDropdown'
+import CWidgetSimple from './CWidgetSimple'
+
+export {
+  CWidgetProgress,
+  CWidgetIcon,
+  CWidgetBrand,
+  CWidgetProgressIcon,
+  CWidgetDropdown,
+  CWidgetSimple
+}
diff --git a/src/components/widgets/tests/CWidgetBrand.spec.js b/src/components/widgets/tests/CWidgetBrand.spec.js
new file mode 100644
index 00000000..6f10c9db
--- /dev/null
+++ b/src/components/widgets/tests/CWidgetBrand.spec.js
@@ -0,0 +1,42 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWidgetBrand'
+
+const ComponentName = 'CWidgetBrand'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component,{
+  propsData: {
+    color: 'twitter',
+    rightHeader: 'rightHeader',
+    leftHeader: 'leftHeader',
+    rightFooter: 'rightFooter',
+    leftFooter: 'leftFooter'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // it('correctly render component with default props', () => {
+  //   // expect(defaultWrapper.findAll('div').at(1).attributes().class).toMatch('brand-card-header bg-facebook')
+  //   expect(defaultWrapper.findAll('div').at(4).text()).toMatch('rightHeader:string')
+  //   expect(defaultWrapper.findAll('div').at(5).text()).toMatch('rightFooter:string')
+  //   expect(defaultWrapper.findAll('div').at(7).text()).toMatch('leftHeader:string')
+  //   // expect(defaultWrapper.findAll('div').at(8).text()).toMatch('leftFooter:string')
+  //   // expect(defaultWrapper.find('i').attributes().class).toMatch('fa fa-facebook')
+  // })
+  it('matches default props snapshot', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  // it('correctly render component with custom props', () => {
+  //   // expect(customWrapper.findAll('div').at(1).attributes().class).toMatch('brand-card-header bg-twitter')
+  //   expect(customWrapper.findAll('div').at(4).text()).toMatch('rightHeader')
+  //   expect(customWrapper.findAll('div').at(5).text()).toMatch('rightFooter')
+  //   expect(customWrapper.findAll('div').at(7).text()).toMatch('leftHeader')
+  //   // expect(customWrapper.findAll('div').at(8).text()).toMatch('leftFooter')
+  //   // expect(customWrapper.find('i').attributes().class).toMatch('fa fa-twitter')
+  // })
+  it('matches custom props snapshot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/widgets/tests/CWidgetDropdown.spec.js b/src/components/widgets/tests/CWidgetDropdown.spec.js
new file mode 100644
index 00000000..c21b306d
--- /dev/null
+++ b/src/components/widgets/tests/CWidgetDropdown.spec.js
@@ -0,0 +1,34 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWidgetDropdown'
+const ComponentName = 'CWidgetDropdown'
+
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component,{
+  propsData: {
+    color: 'info',
+    header: 'header',
+    text: 'text',
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // it('correctly render component with default props', () => {
+  //   expect(defaultWrapper.find('h4').text()).toMatch('header:string')
+  //   expect(defaultWrapper.find('p').text()).toMatch('text:string')
+  //   // expect(defaultWrapper.find('div').attributes().class).toMatch('card')
+  // })
+  it('matches default props snapshot', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  // it('correctly render component with custom props', () => {
+  //   expect(customWrapper.find('h4').text()).toMatch('header')
+  //   expect(customWrapper.find('p').text()).toMatch('text')
+  //   // expect(customWrapper.find('div').attributes().class).toMatch('card bg-info')
+  // })
+  it('matches custom props snapshot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/widgets/tests/CWidgetIcon.spec.js b/src/components/widgets/tests/CWidgetIcon.spec.js
new file mode 100644
index 00000000..c966dc0e
--- /dev/null
+++ b/src/components/widgets/tests/CWidgetIcon.spec.js
@@ -0,0 +1,38 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWidgetIcon'
+
+const ComponentName = 'CWidgetIcon'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    header: 'header',
+    text: 'text',
+    color: 'success',
+    iconPadding: false
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // it('correctly render component with default props', () => {
+  //   expect(defaultWrapper.findAll('div').at(2).text()).toMatch('header:string')
+  //   expect(defaultWrapper.findAll('div').at(3).text()).toMatch('text:string')
+  //   expect(defaultWrapper.find('i').attributes().class).toMatch('fa fa-cogs bg-primary')
+  //   expect(defaultWrapper.find('clink-stub').exists()).toBe(false)
+  // })
+  it('matches default props snapshot', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  // it('correctly render component with custom props', () => {
+  //   expect(customWrapper.findAll('div').at(2).text()).toMatch('header')
+  //   expect(customWrapper.findAll('div').at(3).text()).toMatch('text')
+  //   expect(customWrapper.find('i').attributes().class).toMatch('someClasses')
+  //   expect(customWrapper.find('clink-stub').exists()).toBe(true)
+  //   expect(customWrapper.find('clink-stub').attributes().href).toMatch('link.com')
+  // })
+  it('matches custom props snapshot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/widgets/tests/CWidgetProgress.spec.js b/src/components/widgets/tests/CWidgetProgress.spec.js
new file mode 100644
index 00000000..b5ddf245
--- /dev/null
+++ b/src/components/widgets/tests/CWidgetProgress.spec.js
@@ -0,0 +1,51 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWidgetProgress'
+import CProgress from '../../progress/CProgress'
+import Vue from 'vue'
+
+Vue.component('CProgress', CProgress)
+
+const ComponentName = 'CWidgetProgress'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    color: 'info',
+    inverse: true,
+    value: 30,
+    text:'test',
+    header: 'test',
+    footer: 'test'
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // it('correctly render component with default props', () => {
+  //   expect(defaultWrapper.findAll('div').at(0).attributes().class).toMatch('card')
+  //   expect(defaultWrapper.findAll('div').at(2).text()).toMatch('header:string')
+  //   expect(defaultWrapper.findAll('div').at(3).text()).toMatch('text:string')
+  //   expect(defaultWrapper.find('small').text()).toMatch('footer:string')
+  //   expect(defaultWrapper.find('cprogress-stub').exists()).toBe(true)
+  //   expect(defaultWrapper.find('cprogress-stub').attributes().color).toBe('success')
+  //   expect(defaultWrapper.find('cprogress-stub').attributes().class).toBe('progress-xs my-3 mb-0')
+  //   expect(defaultWrapper.find('cprogress-stub').attributes().value).toBe('25')
+  // })
+  it('matches default props snapshot', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  // it('correctly render component with custom props', () => {
+  //   expect(customWrapper.findAll('div').at(0).attributes().class).toMatch('card text-white bg-info')
+  //   expect(customWrapper.findAll('div').at(2).text()).toMatch('test')
+  //   expect(customWrapper.findAll('div').at(3).text()).toMatch('test')
+  //   expect(customWrapper.find('small').text()).toMatch('test')
+  //   expect(customWrapper.find('cprogress-stub').exists()).toBe(true)
+  //   expect(customWrapper.find('cprogress-stub').attributes().color).toBe('')
+  //   expect(customWrapper.find('cprogress-stub').attributes().class).toBe('progress-xs my-3 mb-0 progress-white')
+  //   expect(customWrapper.find('cprogress-stub').attributes().value).toBe('30')
+  // })
+  it('matches custom props snapshot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/widgets/tests/CWidgetProgressIcon.spec.js b/src/components/widgets/tests/CWidgetProgressIcon.spec.js
new file mode 100644
index 00000000..8ac3a747
--- /dev/null
+++ b/src/components/widgets/tests/CWidgetProgressIcon.spec.js
@@ -0,0 +1,49 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWidgetProgressIcon'
+import CProgress from '../../progress/CProgress'
+import Vue from 'vue'
+
+Vue.component('CProgress', CProgress)
+
+const ComponentName = 'CWidgetProgressIcon'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component, {
+  propsData: {
+    text: 'test',
+    header: 'test',
+    iconClasses: 'icon-custom',
+    color: 'info',
+    value: 35,
+    inverse: true
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // it('correctly render component with default props', () => {
+  //   expect(defaultWrapper.findAll('div').at(0).attributes().class).toMatch('card')
+  //   expect(defaultWrapper.findAll('div').at(3).text()).toMatch('header:string')
+  //   expect(defaultWrapper.find('small').text()).toMatch('text:string')
+  //   expect(defaultWrapper.find('cprogress-stub').exists()).toBe(true)
+  //   expect(defaultWrapper.find('cprogress-stub').attributes().color).toBe('success')
+  //   expect(defaultWrapper.find('cprogress-stub').attributes().class).toBe('progress-xs my-3 mb-0')
+  //   expect(defaultWrapper.find('cprogress-stub').attributes().value).toBe('25')
+  // })
+  it('matches default props snapshot', () => {
+    expect(defaultWrapper.element).toMatchSnapshot()
+  })
+  // it('correctly render component with custom props', () => {
+  //   expect(customWrapper.findAll('div').at(0).attributes().class).toMatch('card text-white bg-info')
+  //   expect(customWrapper.findAll('div').at(3).text()).toMatch('test')
+  //   expect(customWrapper.find('small').text()).toMatch('test')
+  //   expect(customWrapper.find('cprogress-stub').exists()).toBe(true)
+  //   expect(customWrapper.find('cprogress-stub').attributes().color).toBe('')
+  //   expect(customWrapper.find('cprogress-stub').attributes().class).toBe('progress-xs my-3 mb-0 progress-white')
+  //   expect(customWrapper.find('cprogress-stub').attributes().value).toBe('35')
+  // })
+  it('matches custom props snapshot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/widgets/tests/CWidgetSimple.spec.js b/src/components/widgets/tests/CWidgetSimple.spec.js
new file mode 100644
index 00000000..5bdcd0d6
--- /dev/null
+++ b/src/components/widgets/tests/CWidgetSimple.spec.js
@@ -0,0 +1,31 @@
+import { mount } from '@vue/test-utils'
+import Component from '../CWidgetSimple'
+
+const ComponentName = 'CWidgetSimple'
+const defaultWrapper = mount(Component)
+const customWrapper = mount(Component,{
+  propsData: {
+    header: 'header',
+    text: 'text',
+  }
+})
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(Component.name).toMatch(ComponentName)
+  })
+  // it('correctly render component with default props', () => {
+  //   expect(defaultWrapper.findAll('div').at(2).text()).toMatch('header:string')
+  //   expect(defaultWrapper.findAll('div').at(3).text()).toMatch('text:string')
+  // })
+  // it('matches default props snapshot', () => {
+  //   expect(defaultWrapper.element).toMatchSnapshot()
+  // })
+  // it('correctly render component with custom props', () => {
+  //   expect(customWrapper.findAll('div').at(2).text()).toMatch('header')
+  //   expect(customWrapper.findAll('div').at(3).text()).toMatch('text')
+  // })
+  it('matches custom props snapshot', () => {
+    expect(customWrapper.element).toMatchSnapshot()
+  })
+})
diff --git a/src/components/widgets/tests/__snapshots__/CWidgetBrand.spec.js.snap b/src/components/widgets/tests/__snapshots__/CWidgetBrand.spec.js.snap
new file mode 100644
index 00000000..56fbd399
--- /dev/null
+++ b/src/components/widgets/tests/__snapshots__/CWidgetBrand.spec.js.snap
@@ -0,0 +1,93 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWidgetBrand matches custom props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-header content-center text-white p-0 bg-twitter"
+  />
+   
+  <div
+    class="card-body row text-center"
+  >
+    <div
+      class="col"
+    >
+      <div
+        class="text-value-lg"
+      >
+        
+          rightHeader
+        
+      </div>
+       
+      <div
+        class="text-uppercase text-muted small"
+      >
+        
+          rightFooter
+        
+      </div>
+    </div>
+     
+    <div
+      class="c-vr"
+    />
+     
+    <div
+      class="col"
+    >
+      <div
+        class="text-value-lg"
+      >
+        
+          leftHeader
+        
+      </div>
+       
+      <div
+        class="text-uppercase text-muted small"
+      >
+        
+          leftFooter
+        
+      </div>
+    </div>
+  </div>
+</div>
+`;
+
+exports[`CWidgetBrand matches default props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-header content-center text-white p-0 bg-undefined"
+  />
+   
+  <div
+    class="card-body row text-center"
+  >
+    <div
+      class="col"
+    >
+      <!---->
+       
+      <!---->
+    </div>
+     
+    <div
+      class="c-vr"
+    />
+     
+    <div
+      class="col"
+    >
+      <!---->
+       
+      <!---->
+    </div>
+  </div>
+</div>
+`;
diff --git a/src/components/widgets/tests/__snapshots__/CWidgetDropdown.spec.js.snap b/src/components/widgets/tests/__snapshots__/CWidgetDropdown.spec.js.snap
new file mode 100644
index 00000000..3d07e374
--- /dev/null
+++ b/src/components/widgets/tests/__snapshots__/CWidgetDropdown.spec.js.snap
@@ -0,0 +1,43 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWidgetDropdown matches custom props snapshot 1`] = `
+<div
+  class="card bg-info text-white"
+>
+  <div
+    class="card-body pb-0 d-flex justify-content-between"
+  >
+    <div>
+      <div
+        class="text-value-lg"
+      >
+        header
+      </div>
+       
+      <div>
+        text
+      </div>
+    </div>
+     
+  </div>
+   
+</div>
+`;
+
+exports[`CWidgetDropdown matches default props snapshot 1`] = `
+<div
+  class="card bg-undefined text-white"
+>
+  <div
+    class="card-body pb-0 d-flex justify-content-between"
+  >
+    <div>
+      <!---->
+       
+      <!---->
+    </div>
+     
+  </div>
+   
+</div>
+`;
diff --git a/src/components/widgets/tests/__snapshots__/CWidgetIcon.spec.js.snap b/src/components/widgets/tests/__snapshots__/CWidgetIcon.spec.js.snap
new file mode 100644
index 00000000..37c528d0
--- /dev/null
+++ b/src/components/widgets/tests/__snapshots__/CWidgetIcon.spec.js.snap
@@ -0,0 +1,55 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWidgetIcon matches custom props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-body d-flex align-items-center p-0"
+  >
+    <div
+      class="mr-3 text-white bg-success p-4"
+    />
+     
+    <div>
+      <div
+        class="text-value text-success"
+      >
+        
+        header
+      
+      </div>
+       
+      <div
+        class="text-muted text-uppercase font-weight-bold small"
+      >
+        
+        text
+      
+      </div>
+    </div>
+  </div>
+   
+</div>
+`;
+
+exports[`CWidgetIcon matches default props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-body d-flex align-items-center p-3"
+  >
+    <div
+      class="mr-3 text-white bg-undefined p-3"
+    />
+     
+    <div>
+      <!---->
+       
+      <!---->
+    </div>
+  </div>
+   
+</div>
+`;
diff --git a/src/components/widgets/tests/__snapshots__/CWidgetProgress.spec.js.snap b/src/components/widgets/tests/__snapshots__/CWidgetProgress.spec.js.snap
new file mode 100644
index 00000000..f46deae6
--- /dev/null
+++ b/src/components/widgets/tests/__snapshots__/CWidgetProgress.spec.js.snap
@@ -0,0 +1,75 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWidgetProgress matches custom props snapshot 1`] = `
+<div
+  class="card text-white bg-info"
+>
+  <div
+    class="card-body"
+  >
+    <div
+      class="h4 m-0"
+    >
+      test
+    </div>
+     
+    <div>
+      test
+    </div>
+     
+    <div
+      class="progress-xs my-3 mb-0 progress progress-white"
+    >
+      <div
+        aria-valuemax="100"
+        aria-valuemin="0"
+        aria-valuenow="30"
+        class="progress-bar"
+        role="progressbar"
+        style="width: 30%;"
+      >
+        
+      </div>
+    </div>
+     
+    <small
+      class="text-muted"
+    >
+      
+      test
+    
+    </small>
+  </div>
+</div>
+`;
+
+exports[`CWidgetProgress matches default props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-body"
+  >
+    <!---->
+     
+    <!---->
+     
+    <div
+      class="progress-xs my-3 mb-0 progress"
+    >
+      <div
+        aria-valuemax="100"
+        aria-valuemin="0"
+        aria-valuenow="25"
+        class="progress-bar"
+        role="progressbar"
+        style="width: 25%;"
+      >
+        
+      </div>
+    </div>
+     
+    <!---->
+  </div>
+</div>
+`;
diff --git a/src/components/widgets/tests/__snapshots__/CWidgetProgressIcon.spec.js.snap b/src/components/widgets/tests/__snapshots__/CWidgetProgressIcon.spec.js.snap
new file mode 100644
index 00000000..32f5f59f
--- /dev/null
+++ b/src/components/widgets/tests/__snapshots__/CWidgetProgressIcon.spec.js.snap
@@ -0,0 +1,74 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWidgetProgressIcon matches custom props snapshot 1`] = `
+<div
+  class="card text-white bg-info"
+  iconclasses="icon-custom"
+>
+  <div
+    class="card-body"
+  >
+    <!---->
+     
+    <div
+      class="h4 mb-0"
+    >
+      test
+    </div>
+     
+    <small
+      class="text-muted text-uppercase font-weight-bold"
+    >
+      
+      test
+    
+    </small>
+     
+    <div
+      class="progress-xs my-3 mb-0 progress progress-white"
+    >
+      <div
+        aria-valuemax="100"
+        aria-valuemin="0"
+        aria-valuenow="35"
+        class="progress-bar"
+        role="progressbar"
+        style="width: 35%;"
+      >
+        
+      </div>
+    </div>
+  </div>
+</div>
+`;
+
+exports[`CWidgetProgressIcon matches default props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-body"
+  >
+    <!---->
+     
+    <!---->
+     
+    <!---->
+     
+    <div
+      class="progress-xs my-3 mb-0 progress"
+    >
+      <div
+        aria-valuemax="100"
+        aria-valuemin="0"
+        aria-valuenow="25"
+        class="progress-bar"
+        role="progressbar"
+        style="width: 25%;"
+      >
+        
+      </div>
+    </div>
+  </div>
+</div>
+`;
diff --git a/src/components/widgets/tests/__snapshots__/CWidgetSimple.spec.js.snap b/src/components/widgets/tests/__snapshots__/CWidgetSimple.spec.js.snap
new file mode 100644
index 00000000..78c3d2f4
--- /dev/null
+++ b/src/components/widgets/tests/__snapshots__/CWidgetSimple.spec.js.snap
@@ -0,0 +1,28 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CWidgetSimple matches custom props snapshot 1`] = `
+<div
+  class="card"
+>
+  <div
+    class="card-body text-center"
+  >
+    <div
+      class="text-muted small text-uppercase font-weight-bold"
+    >
+      
+      header
+    
+    </div>
+     
+    <div
+      class="h2 py-3"
+    >
+      
+      text
+    
+    </div>
+     
+  </div>
+</div>
+`;
diff --git a/src/directives/CClickaway.js b/src/directives/CClickaway.js
new file mode 100644
index 00000000..24938c1e
--- /dev/null
+++ b/src/directives/CClickaway.js
@@ -0,0 +1,26 @@
+const HANDLER = 'c_clickaway_handler'
+
+function setListeners (el, binding, vnode) {
+  const callback = binding.value
+  if (typeof callback !== 'function') {
+    return
+  }
+  el[HANDLER] = (e) => el.contains(e.target) || callback.call(vnode.context, e)
+  document.documentElement.addEventListener(binding.arg || 'click', el[HANDLER])
+}
+
+function unsetListeners (el, binding) {
+  document.documentElement.removeEventListener(binding.arg || 'click', el[HANDLER])
+  delete el[HANDLER]
+}
+
+export default {
+  bind: setListeners,
+  update: (el, binding, vnode) => {
+    if (binding.value !== binding.oldValue) {
+      unsetListeners(el, binding)
+      setListeners(el, binding, vnode)
+    }
+  },
+  unbind: unsetListeners
+}
\ No newline at end of file
diff --git a/src/directives/CEmitRootEvent.js b/src/directives/CEmitRootEvent.js
new file mode 100644
index 00000000..4e2e1e4f
--- /dev/null
+++ b/src/directives/CEmitRootEvent.js
@@ -0,0 +1,15 @@
+export default {
+  name: 'c-emit-root-event',
+  bind (el, binding, node) {
+    if (!binding.arg) {
+      return
+    } 
+    const customListeners = Object.keys(binding.modifiers)
+    const listeners = customListeners.length ? customListeners : ['click']
+    listeners.map(listener => {
+      el.addEventListener(listener, () => {
+        node.context.$root.$emit(binding.arg, binding.value)
+      })
+    })
+  }
+}
diff --git a/src/directives/CPopover.js b/src/directives/CPopover.js
new file mode 100644
index 00000000..08915157
--- /dev/null
+++ b/src/directives/CPopover.js
@@ -0,0 +1,51 @@
+import Tooltip from 'tooltip.js'
+import './old-popover.css'
+
+export default {
+  name: 'c-popover',
+  tooltip: null,
+  inserted (el, binding) {
+    const tooltip = new Tooltip(el, binding.def.getTooltipConfig(binding))
+    binding.def._tooltip = tooltip
+    if (binding.value.active) {
+      tooltip.show()
+    }
+  },
+  unbind (el, binding) {
+    let tooltip = binding.def._tooltip
+    if (tooltip) {
+      tooltip.dispose()
+      tooltip = null
+    }
+  },
+  getTooltipConfig (binding) {
+    const props = binding.value
+    const title = props.content || 'content'
+    // const modifiersTriggers = String(Object.keys(binding.modifiers)).replace(',',' ')
+    const closeOnClickOutside = props.closeOnClickOutside === false ? false : true
+    const html = props.html === false ? false : true
+    const popperOptions = props.popperOptions || { modifiers: { preventOverflow: { boundariesElement: 'offsetParent' }}}
+    return {
+      title,
+      trigger: 'click',
+      html,
+      placement: props.placement || 'right',
+      delay: props.delay || 0,
+      offset: props.offset || 0,
+      arrowSelector: '.arrow',
+      innerSelector: '.popover-old-body',
+      template: binding.def.getTemplate(props.header),
+      boundariesElement: document.getElementById(props.boundaries) || props.boundaries,
+      container: props.appendToBody ? document.body : false,
+      closeOnClickOutside,
+      popperOptions
+    }
+  },
+  getTemplate (header) {
+    return `<div class="popover-old bs-popover-old-auto fade show" role="tooltip">
+              <div class="arrow"></div>
+              <h3 class="popover-old-header">${header || 'header'}</h3>
+              <div class="popover-old-body"></div>
+            </div>`
+  }
+}
diff --git a/src/directives/CTooltip.js b/src/directives/CTooltip.js
new file mode 100644
index 00000000..fac29165
--- /dev/null
+++ b/src/directives/CTooltip.js
@@ -0,0 +1,58 @@
+import Tooltip from 'tooltip.js'
+import './old-tooltip.css'
+
+export default {
+  name: 'c-tooltip',
+  inserted (el, binding) {
+    binding.def._tooltip = new Tooltip(el, binding.def.getTooltipConfig(binding))
+    el._c_tooltip = binding.def._tooltip
+    if (binding.value.active) {
+      binding.def._tooltip.show()
+    }
+  },
+  unbind (el, binding) {
+    let tooltip = binding.def._tooltip
+    if (tooltip) {
+      tooltip.dispose()
+      tooltip = null
+      el._c_tooltip = null
+    }
+  },
+  getTooltipConfig (binding) {
+    const props = binding.value
+    const title = props.content || props
+    const html = !!props.html !== false
+    // const modifiersTriggers = String(Object.keys(binding.modifiers)).replace(',',' ')
+    const closeOnClickOutside = !!props.closeOnClickOutside !== false
+    const popperOptions = props.popperOptions || { modifiers: { preventOverflow: { boundariesElement: 'offsetParent' }}}
+    return {
+      title,
+      trigger: 'hover',
+      html,
+      placement: props.placement || 'top',
+      delay: props.delay || 0,
+      offset: props.offset || 0,
+      arrowSelector: '.arrow',
+      innerSelector: '.tooltip-old-inner',
+      template: binding.def.getTemplate(),
+      boundariesElement: document.getElementById(props.boundaries) || props.boundaries,
+      container: props.appendToBody ? document.body : false,
+      closeOnClickOutside,
+      popperOptions
+    }
+  },
+  getTemplate () {
+    return `<div class="tooltip-old bs-tooltip-old-auto fade show" role="tooltip">
+              <div class="arrow"></div>
+              <div class="tooltip-old-inner"></div>
+            </div>`
+  },
+  update(el, binding, vnode) {
+    if ((binding.value.content !== binding.oldValue.content)  && el === vnode.elm) {
+      vnode.context.$nextTick(() => {
+        const title = binding.value.content
+        el._c_tooltip.updateTitleContent(title)
+      })
+    }
+  }
+}
diff --git a/src/directives/index.d.ts b/src/directives/index.d.ts
new file mode 100644
index 00000000..39c8ac85
--- /dev/null
+++ b/src/directives/index.d.ts
@@ -0,0 +1,6 @@
+import { DirectiveOptions } from 'vue'
+
+export const CClickaway: DirectiveOptions
+export const CEmitRootEvent: DirectiveOptions
+export const CPopover: DirectiveOptions
+export const CTooltip: DirectiveOptions
diff --git a/src/directives/index.js b/src/directives/index.js
new file mode 100644
index 00000000..9323e9ea
--- /dev/null
+++ b/src/directives/index.js
@@ -0,0 +1,11 @@
+import CClickaway from './CClickaway'
+import CEmitRootEvent from './CEmitRootEvent'
+import CPopover from './CPopover'
+import CTooltip from './CTooltip'
+
+export {
+  CClickaway,
+  CEmitRootEvent,
+  CPopover,
+  CTooltip
+}
diff --git a/src/directives/old-popover.css b/src/directives/old-popover.css
new file mode 100644
index 00000000..cc5f3a9a
--- /dev/null
+++ b/src/directives/old-popover.css
@@ -0,0 +1,264 @@
+.popover-old {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: block;
+  max-width: 276px;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  white-space: normal;
+  line-break: auto;
+  font-size: 0.765625rem;
+  word-wrap: break-word;
+  background-clip: padding-box;
+  border: 1px solid;
+  border-radius: 0.3rem;
+  background-color: #fff;
+  border-color: rgba(0, 0, 21, 0.2);
+}
+
+.c-legacy-theme .popover-old {
+  background-color: #fff;
+  border-color: rgba(0, 0, 0, 0.2);
+}
+
+.c-dark-theme .popover-old {
+  background-color: #1e1e29;
+  border-color: #181924;
+}
+
+.popover-old .arrow {
+  position: absolute;
+  display: block;
+  width: 1rem;
+  height: 0.5rem;
+  margin: 0 0.3rem;
+}
+
+.popover-old .arrow::before, .popover-old .arrow::after {
+  position: absolute;
+  display: block;
+  content: "";
+  border-color: transparent;
+  border-style: solid;
+}
+
+.bs-popover-old-top, .bs-popover-old-auto[x-placement^="top"] {
+  margin-bottom: 0.5rem;
+}
+
+.bs-popover-old-top > .arrow, .bs-popover-old-auto[x-placement^="top"] > .arrow {
+  bottom: calc(-0.5rem - 1px);
+}
+
+.bs-popover-old-top > .arrow::before, .bs-popover-old-auto[x-placement^="top"] > .arrow::before {
+  bottom: 0;
+  border-width: 0.5rem 0.5rem 0;
+  border-top-color: rgba(0, 0, 21, 0.25);
+}
+
+.c-legacy-theme .bs-popover-old-top > .arrow::before, .c-legacy-theme .bs-popover-old-auto[x-placement^="top"] > .arrow::before {
+  border-top-color: rgba(0, 0, 0, 0.25);
+}
+
+.c-dark-theme .bs-popover-old-top > .arrow::before, .c-dark-theme .bs-popover-old-auto[x-placement^="top"] > .arrow::before {
+  border-top-color: #181924;
+}
+
+.bs-popover-old-top > .arrow::after, .bs-popover-old-auto[x-placement^="top"] > .arrow::after {
+  bottom: 1px;
+  border-width: 0.5rem 0.5rem 0;
+  border-top-color: #fff;
+}
+
+.c-legacy-theme .bs-popover-old-top > .arrow::after, .c-legacy-theme .bs-popover-old-auto[x-placement^="top"] > .arrow::after {
+  border-top-color: #fff;
+}
+
+.c-dark-theme .bs-popover-old-top > .arrow::after, .c-dark-theme .bs-popover-old-auto[x-placement^="top"] > .arrow::after {
+  border-top-color: #1e1e29;
+}
+
+.bs-popover-old-right, .bs-popover-old-auto[x-placement^="right"] {
+  margin-left: 0.5rem;
+}
+
+.bs-popover-old-right > .arrow, .bs-popover-old-auto[x-placement^="right"] > .arrow {
+  left: calc(-0.5rem - 1px);
+  width: 0.5rem;
+  height: 1rem;
+  margin: 0.3rem 0;
+}
+
+.bs-popover-old-right > .arrow::before, .bs-popover-old-auto[x-placement^="right"] > .arrow::before {
+  left: 0;
+  border-width: 0.5rem 0.5rem 0.5rem 0;
+  border-right-color: rgba(0, 0, 21, 0.25);
+}
+
+.c-legacy-theme .bs-popover-old-right > .arrow::before, .c-legacy-theme .bs-popover-old-auto[x-placement^="right"] > .arrow::before {
+  border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.c-dark-theme .bs-popover-old-right > .arrow::before, .c-dark-theme .bs-popover-old-auto[x-placement^="right"] > .arrow::before {
+  border-right-color: #181924;
+}
+
+.bs-popover-old-right > .arrow::after, .bs-popover-old-auto[x-placement^="right"] > .arrow::after {
+  left: 1px;
+  border-width: 0.5rem 0.5rem 0.5rem 0;
+  border-right-color: #fff;
+}
+
+.c-legacy-theme .bs-popover-old-right > .arrow::after, .c-legacy-theme .bs-popover-old-auto[x-placement^="right"] > .arrow::after {
+  border-right-color: #fff;
+}
+
+.c-dark-theme .bs-popover-old-right > .arrow::after, .c-dark-theme .bs-popover-old-auto[x-placement^="right"] > .arrow::after {
+  border-right-color: #1e1e29;
+}
+
+.bs-popover-old-bottom, .bs-popover-old-auto[x-placement^="bottom"] {
+  margin-top: 0.5rem;
+}
+
+.bs-popover-old-bottom > .arrow, .bs-popover-old-auto[x-placement^="bottom"] > .arrow {
+  top: calc(-0.5rem - 1px);
+}
+
+.bs-popover-old-bottom > .arrow::before, .bs-popover-old-auto[x-placement^="bottom"] > .arrow::before {
+  top: 0;
+  border-width: 0 0.5rem 0.5rem 0.5rem;
+  border-bottom-color: rgba(0, 0, 21, 0.25);
+}
+
+.c-legacy-theme .bs-popover-old-bottom > .arrow::before, .c-legacy-theme .bs-popover-old-auto[x-placement^="bottom"] > .arrow::before {
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+
+.c-dark-theme .bs-popover-old-bottom > .arrow::before, .c-dark-theme .bs-popover-old-auto[x-placement^="bottom"] > .arrow::before {
+  border-bottom-color: #181924;
+}
+
+.bs-popover-old-bottom > .arrow::after, .bs-popover-old-auto[x-placement^="bottom"] > .arrow::after {
+  top: 1px;
+  border-width: 0 0.5rem 0.5rem 0.5rem;
+  border-bottom-color: #fff;
+}
+
+.c-legacy-theme .bs-popover-old-bottom > .arrow::after, .c-legacy-theme .bs-popover-old-auto[x-placement^="bottom"] > .arrow::after {
+  border-bottom-color: #fff;
+}
+
+.c-dark-theme .bs-popover-old-bottom > .arrow::after, .c-dark-theme .bs-popover-old-auto[x-placement^="bottom"] > .arrow::after {
+  border-bottom-color: #1e1e29;
+}
+
+.bs-popover-old-bottom .popover-old-header::before, .bs-popover-old-auto[x-placement^="bottom"] .popover-old-header::before {
+  position: absolute;
+  top: 0;
+  left: 50%;
+  display: block;
+  width: 1rem;
+  margin-left: -0.5rem;
+  content: "";
+  border-bottom: 1px solid;
+  border-bottom-color: #f7f7f7;
+}
+
+.c-legacy-theme .bs-popover-old-bottom .popover-old-header::before, .c-legacy-theme .bs-popover-old-auto[x-placement^="bottom"] .popover-old-header::before {
+  border-bottom-color: #f7f7f7;
+}
+
+.c-dark-theme .bs-popover-old-bottom .popover-old-header::before, .c-dark-theme .bs-popover-old-auto[x-placement^="bottom"] .popover-old-header::before {
+  border-bottom-color: #181924;
+}
+
+.bs-popover-old-left, .bs-popover-old-auto[x-placement^="left"] {
+  margin-right: 0.5rem;
+}
+
+.bs-popover-old-left > .arrow, .bs-popover-old-auto[x-placement^="left"] > .arrow {
+  right: calc(-0.5rem - 1px);
+  width: 0.5rem;
+  height: 1rem;
+  margin: 0.3rem 0;
+}
+
+.bs-popover-old-left > .arrow::before, .bs-popover-old-auto[x-placement^="left"] > .arrow::before {
+  right: 0;
+  border-width: 0.5rem 0 0.5rem 0.5rem;
+  border-left-color: rgba(0, 0, 21, 0.25);
+}
+
+.c-legacy-theme .bs-popover-old-left > .arrow::before, .c-legacy-theme .bs-popover-old-auto[x-placement^="left"] > .arrow::before {
+  border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.c-dark-theme .bs-popover-old-left > .arrow::before, .c-dark-theme .bs-popover-old-auto[x-placement^="left"] > .arrow::before {
+  border-left-color: #181924;
+}
+
+.bs-popover-old-left > .arrow::after, .bs-popover-old-auto[x-placement^="left"] > .arrow::after {
+  right: 1px;
+  border-width: 0.5rem 0 0.5rem 0.5rem;
+  border-left-color: #fff;
+}
+
+.c-legacy-theme .bs-popover-old-left > .arrow::after, .c-legacy-theme .bs-popover-old-auto[x-placement^="left"] > .arrow::after {
+  border-left-color: #fff;
+}
+
+.c-dark-theme .bs-popover-old-left > .arrow::after, .c-dark-theme .bs-popover-old-auto[x-placement^="left"] > .arrow::after {
+  border-left-color: #1e1e29;
+}
+
+.popover-old-header {
+  padding: 0.5rem 0.75rem;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  border-bottom: 1px solid;
+  border-top-left-radius: calc(0.3rem - 1px);
+  border-top-right-radius: calc(0.3rem - 1px);
+  background-color: #f7f7f7;
+  border-bottom-color: #ebebeb;
+}
+
+.c-legacy-theme .popover-old-header {
+  background-color: #f7f7f7;
+  border-bottom-color: #ebebeb;
+}
+
+.c-dark-theme .popover-old-header {
+  color: #e1e1e1;
+  background-color: #181924;
+  border-bottom-color: #0e0e15;
+}
+
+.popover-old-header:empty {
+  display: none;
+}
+
+.popover-old-body {
+  padding: 0.5rem 0.75rem;
+  color: #4f5d73;
+}
+
+.c-legacy-theme .popover-old-body {
+  color: #23282c;
+}
+
+.c-dark-theme .popover-old-body {
+  color: #e1e1e1;
+}
\ No newline at end of file
diff --git a/src/directives/old-tooltip.css b/src/directives/old-tooltip.css
new file mode 100644
index 00000000..e2cbe9d2
--- /dev/null
+++ b/src/directives/old-tooltip.css
@@ -0,0 +1,112 @@
+.tooltip-old {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  margin: 0;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  white-space: normal;
+  line-break: auto;
+  font-size: 0.765625rem;
+  word-wrap: break-word;
+  opacity: 0;
+}
+
+.tooltip-old.show {
+  opacity: 0.9;
+}
+
+.tooltip-old .arrow {
+  position: absolute;
+  display: block;
+  width: 0.8rem;
+  height: 0.4rem;
+}
+
+.tooltip-old .arrow::before {
+  position: absolute;
+  content: "";
+  border-color: transparent;
+  border-style: solid;
+}
+
+.bs-tooltip-old-top, .bs-tooltip-old-auto[x-placement^="top"] {
+  padding: 0.4rem 0;
+}
+
+.bs-tooltip-old-top .arrow, .bs-tooltip-old-auto[x-placement^="top"] .arrow {
+  bottom: 0;
+}
+
+.bs-tooltip-old-top .arrow::before, .bs-tooltip-old-auto[x-placement^="top"] .arrow::before {
+  top: 0;
+  border-width: 0.4rem 0.4rem 0;
+  border-top-color: #000015;
+}
+
+.bs-tooltip-old-right, .bs-tooltip-old-auto[x-placement^="right"] {
+  padding: 0 0.4rem;
+}
+
+.bs-tooltip-old-right .arrow, .bs-tooltip-old-auto[x-placement^="right"] .arrow {
+  left: 0;
+  width: 0.4rem;
+  height: 0.8rem;
+}
+
+.bs-tooltip-old-right .arrow::before, .bs-tooltip-old-auto[x-placement^="right"] .arrow::before {
+  right: 0;
+  border-width: 0.4rem 0.4rem 0.4rem 0;
+  border-right-color: #000015;
+}
+
+.bs-tooltip-old-bottom, .bs-tooltip-old-auto[x-placement^="bottom"] {
+  padding: 0.4rem 0;
+}
+
+.bs-tooltip-old-bottom .arrow, .bs-tooltip-old-auto[x-placement^="bottom"] .arrow {
+  top: 0;
+}
+
+.bs-tooltip-old-bottom .arrow::before, .bs-tooltip-old-auto[x-placement^="bottom"] .arrow::before {
+  bottom: 0;
+  border-width: 0 0.4rem 0.4rem;
+  border-bottom-color: #000015;
+}
+
+.bs-tooltip-old-left, .bs-tooltip-old-auto[x-placement^="left"] {
+  padding: 0 0.4rem;
+}
+
+.bs-tooltip-old-left .arrow, .bs-tooltip-old-auto[x-placement^="left"] .arrow {
+  right: 0;
+  width: 0.4rem;
+  height: 0.8rem;
+}
+
+.bs-tooltip-old-left .arrow::before, .bs-tooltip-old-auto[x-placement^="left"] .arrow::before {
+  left: 0;
+  border-width: 0.4rem 0 0.4rem 0.4rem;
+  border-left-color: #000015;
+}
+
+.tooltip-old-inner {
+  max-width: 200px;
+  padding: 0.25rem 0.5rem;
+  color: #fff;
+  text-align: center;
+  background-color: #000015;
+  border-radius: 0.25rem;
+}
+
+/*# sourceMappingURL=old-tooltip-old.css.map */
\ No newline at end of file
diff --git a/src/directives/tests/CEmitRootEvent.spec.js b/src/directives/tests/CEmitRootEvent.spec.js
new file mode 100644
index 00000000..1eaf6c9b
--- /dev/null
+++ b/src/directives/tests/CEmitRootEvent.spec.js
@@ -0,0 +1,99 @@
+import { mount } from '@vue/test-utils'
+import CButton from '../../components/button/CButton'
+import CEmitRootEvent from '../CEmitRootEvent'
+import Vue from 'vue'
+
+
+const ComponentName = 'c-emit-root-event'
+
+const noEventDirective = {
+  name: 'c-emit-root-event',
+  value: 'event value'
+}
+
+const directive = {
+  name: 'c-emit-root-event',
+  value: 'event value',
+  arg: 'event-name'
+}
+
+const modifiersDirective = {
+  name: 'c-emit-root-event',
+  value: 'event value',
+  arg: 'event-name',
+  modifiers: {
+    mouseover: true
+  }
+}
+
+const generateWrapper = (config) => {
+  return mount(Vue.extend(
+    {
+      components: { CButton },
+      directives: { CEmitRootEvent },
+      data () {
+        return {
+          button: true
+        }
+      },
+      mounted () {
+        setTimeout(() => this.button = false, 10)
+      },
+      render (h) {
+        const button = h(
+          'CButton', 
+          {
+            props: {
+              color: 'success'
+            },
+            directives: [config]
+          }, 
+          ['button text']
+        )
+        const content = this.button ? button : h(false)
+        return h(
+          'div', 
+          [content]
+        )
+      }
+    }
+  ))
+}
+
+let wrapper = generateWrapper(directive)
+let wrapperModifiers = generateWrapper(modifiersDirective)
+let wrapperNoEventName = generateWrapper(noEventDirective)
+
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CEmitRootEvent.name).toBe(ComponentName)
+  })
+  it('is sending correct events on root', () => {
+    const eventEmitted = jest.fn(() => {})
+    wrapper.vm.$root.$on('event-name', eventEmitted)
+    expect(eventEmitted).not.toBeCalled()
+    wrapper.find('.btn').trigger('click')
+    expect(eventEmitted).toBeCalled()
+  })
+
+  it('is sending correct events on root by custom listeners', () => {
+    const eventEmitted = jest.fn(() => {})
+    wrapperModifiers.vm.$root.$on('event-name', eventEmitted)
+    expect(eventEmitted).not.toBeCalled()
+    wrapperModifiers.find('.btn').trigger('mouseover')
+    expect(eventEmitted).toBeCalled()
+  })
+
+  // it('properly unbinds directive when Tooltip instance is false', () => {
+  //   let binding = { def: { _tooltip: false } }
+  //   const unbind = CPopover.unbind
+  //   let error = null
+  //   try {
+  //     unbind(null, binding)
+  //   } catch (e) {
+  //     error = e
+  //   }
+  //   expect(error).toBe(null)
+  // })
+})
diff --git a/src/directives/tests/CPopover.spec.js b/src/directives/tests/CPopover.spec.js
new file mode 100644
index 00000000..eb5acc24
--- /dev/null
+++ b/src/directives/tests/CPopover.spec.js
@@ -0,0 +1,111 @@
+import { mount } from '@vue/test-utils'
+import CButton from '../../components/button/CButton'
+import CPopover from '../CPopover'
+import Vue from 'vue'
+
+global.document.createRange = () => ({
+  setStart: () => {},
+  setEnd: () => {},
+  commonAncestorContainer: {
+    nodeName: 'BODY',
+    ownerDocument: document,
+  },
+})
+
+const ComponentName = 'c-popover'
+
+const popover = {
+  name: 'c-popover',
+  value: { 
+    content: 'popover', 
+    header: 'header',
+    html: false,
+    closeOnClickOutside: false,
+    trigger: 'hover',
+    active: true
+  }
+}
+
+const modifiersPopover = {
+  name: 'c-popover',
+  value: { 
+    content: 'modifiersPopover',
+    active: true,
+    appendToBody: true,
+  },
+  modifiers: {
+    click: true,
+    hover: true
+  }
+}
+
+const defaultPopover = {
+  name: 'c-popover',
+  value: 'defaultPopover'
+}
+
+const generateWrapper = (config) => {
+  return mount(Vue.extend(
+    {
+      components: { CButton },
+      directives: { CPopover },
+      data () {
+        return {
+          button: true
+        }
+      },
+      mounted () {
+        setTimeout(() => this.button = false, 10)
+      },
+      render (h) {
+        const button = h(
+          'CButton', 
+          {
+            props: {
+              color: 'success'
+            },
+            directives: [config]
+          }, 
+          ['button text']
+        )
+        const content = this.button ? button : h(false)
+        return h(
+          'div', 
+          [content]
+        )
+      }
+    }
+  ))
+}
+
+let popoverWrapper = generateWrapper(popover)
+const modifiersPopoverWrapper = generateWrapper(modifiersPopover)
+const defaultPopoverWrapper = generateWrapper(defaultPopover)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CPopover.name).toBe(ComponentName)
+  })
+  it('is rendered when activated initially', () => {
+    expect(popoverWrapper.find('.popover-old').isVisible()).toBe(true)
+  })
+
+  it('destroys correctly', (done) => {
+    setTimeout(() => {
+      expect(popoverWrapper.find('.btn').exists()).not.toBe(true)
+      done()
+    }, 11)
+  })
+
+  it('properly unbinds directive when Tooltip instance is false', () => {
+    let binding = { def: { _tooltip: false } }
+    const unbind = CPopover.unbind
+    let error = null
+    try {
+      unbind(null, binding)
+    } catch (e) {
+      error = e
+    }
+    expect(error).toBe(null)
+  })
+})
diff --git a/src/directives/tests/CTooltip.spec.js b/src/directives/tests/CTooltip.spec.js
new file mode 100644
index 00000000..6fb5e8d0
--- /dev/null
+++ b/src/directives/tests/CTooltip.spec.js
@@ -0,0 +1,124 @@
+import { mount } from '@vue/test-utils'
+import CButton from '../../components/button/CButton'
+import CTooltip from '../CTooltip'
+import Vue from 'vue'
+
+global.document.createRange = () => ({
+  setStart: () => {},
+  setEnd: () => {},
+  commonAncestorContainer: {
+    nodeName: 'BODY',
+    ownerDocument: document,
+  },
+})
+
+const ComponentName = 'c-tooltip'
+
+const tooltip = {
+  name: 'c-tooltip',
+  value: { 
+    content: 'tooltip', 
+    closeOnClickOutside: false,
+    trigger: 'hover',
+    active: true
+  }
+}
+
+const modifiersTooltip = {
+  name: 'c-tooltip',
+  value: { 
+    content: 'modifiersTooltip',
+    active: true,
+    appendToBody: true,
+    html: false
+  }
+}
+
+const defaultTooltip = {
+  name: 'c-tooltip',
+  value: 'defaultTooltip'
+}
+
+const generateWrapper = (config) => {
+  return mount(Vue.extend(
+    {
+      components: { CButton },
+      directives: { CTooltip },
+      data () {
+        return {
+          button: true,
+          title: 'tooltip 1'
+        }
+      },
+      mounted () {
+        setTimeout(() => this.button = false, 10)
+      },
+      render (h) {
+        const button = h(
+          'CButton', 
+          {
+            props: {
+              color: 'success'
+            },
+            directives: [config]
+          }, 
+          ['button text']
+        )
+        const content = this.button ? button : h(false)
+        return h(
+          'div', 
+          [content]
+        )
+      }
+    }
+  ))
+}
+
+let tooltipWrapper = generateWrapper(tooltip)
+const modifiersTooltipWrapper = generateWrapper(modifiersTooltip)
+const defaultTooltipWrapper = generateWrapper(defaultTooltip)
+
+describe(ComponentName, () => {
+  it('has a name', () => {
+    expect(CTooltip.name).toBe(ComponentName)
+  })
+  it('is rendered when activated initially', () => {
+    expect(tooltipWrapper.find('.tooltip-old').isVisible()).toBe(true)
+  })
+
+  it('should update title content', done => {
+    // todo
+    const updatedContent = 'Updated tooltip';
+    const wrapper = tooltipWrapper.find('button')
+    const instance = wrapper.element._c_tooltip;
+    expect(
+      tooltipWrapper.find('.tooltip-old .tooltip-old-inner').element.textContent
+    ).toBe('tooltip');
+    instance.updateTitleContent(updatedContent);
+    instance.show();
+    expect(
+      tooltipWrapper.find('.tooltip-old .tooltip-old-inner').element.textContent
+    ).toBe(updatedContent);
+    instance.hide();
+    done();
+  });
+
+  it('destroys correctly', (done) => {
+    setTimeout(() => {
+      expect(tooltipWrapper.find('.btn').exists()).not.toBe(true)
+      done()
+    }, 11)
+  })
+
+  it('properly unbinds directive when Tooltip instance is false', () => {
+    let binding = { def: { _tooltip: false } }
+    const unbind = CTooltip.unbind
+    let error = null
+    try {
+      unbind(null, binding)
+    } catch (e) {
+      error = e
+    }
+    expect(error).toBe(null)
+  })
+})
diff --git a/src/index.d.ts b/src/index.d.ts
new file mode 100644
index 00000000..30fa4865
--- /dev/null
+++ b/src/index.d.ts
@@ -0,0 +1,12 @@
+
+export * from './components/index'
+
+export * from './directives/index'
+
+import { PluginFunction } from 'vue'
+export interface CoreuiVuePlugin {
+  install: PluginFunction<Function>
+}
+declare const CoreuiVue: CoreuiVuePlugin
+
+export default CoreuiVue
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 00000000..ba366729
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,39 @@
+import * as Components from './components'
+import * as Directives from './directives'
+
+const removeKeysFromObject = (object, keys) => {
+  return Object.entries(object).reduce((obj, [key, value]) => {
+    if (!keys.includes(key) && !keys.includes(value.name)) {
+      obj[key] = value
+    }
+    return obj
+  }, {})
+}
+
+
+const CoreuiVue = {
+  install (Vue, options) {
+    let pluginComponents = Components
+    let pluginDirectives = Directives
+
+    const toRemove = options && options.remove ? options.remove : null
+    if (toRemove && Array.isArray(toRemove)) {
+      pluginComponents = removeKeysFromObject(Components, toRemove)
+      pluginDirectives = removeKeysFromObject(Directives, toRemove)        
+    }
+
+    for (let plugin in pluginComponents) {
+      Vue.component(plugin, Components[plugin])
+    }
+    for (let directive in pluginDirectives) {
+      Vue.directive(directive, Directives[directive])
+    }
+  }
+}
+
+// Export library
+export default CoreuiVue
+
+//Export components
+export * from  './components'
+export * from  './directives'
diff --git a/src/index.spec.js b/src/index.spec.js
new file mode 100644
index 00000000..27897544
--- /dev/null
+++ b/src/index.spec.js
@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import { createLocalVue } from '@vue/test-utils'
+import CoreuiVue from './index.js'
+
+Vue.use(CoreuiVue)
+
+const localVue = new createLocalVue()
+localVue.use(CoreuiVue, {
+  remove: ['CLink', 'NonExistingComponent']
+})
+
+const objectHaveCLink = (VueObject) => {
+  return Object.keys(VueObject.options.components).includes('CLink')
+}
+
+describe('CoreUI vue plugin', () => {
+  it('CLink component exist in basic plugin', () => {
+    expect(objectHaveCLink(Vue)).toBe(true)
+  })
+  it('Plugin with CLink component remove works properly', () => {
+    expect(objectHaveCLink(localVue)).toBe(false)
+  })
+})
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index d8830b53..00000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "compilerOptions": {
-    "jsx": "preserve",
-    "outDir": "dist",
-    "module": "esnext",
-    "target": "esnext",
-    "strict": true,
-    "lib": ["dom", "es2015", "es2016", "es2017", "es2018", "es2019", "es2020", "es2021"],
-    "sourceMap": true,
-    "allowJs": false,
-    "declaration": true,
-    "moduleResolution": "node",
-    "forceConsistentCasingInFileNames": true,
-    "noImplicitReturns": true,
-    "noImplicitThis": true,
-    "noImplicitAny": true,
-    "strictNullChecks": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
-    "esModuleInterop": true,
-    "resolveJsonModule": true,
-    "paths": {
-      "@coreui/icons-vue": ["./packages/coreui-icons-vue/src"],
-      "@coreui/icons-vue/*": ["./packages/coreui-icons-vue/src/*"],
-      "@coreui/vue": ["./packages/coreui-vue/src"],
-      "@coreui/vue/*": ["./packages/coreui-vue/src/*"],
-      "@coreui/vue-chartjs": ["./packages/coreui-vue-chartjs/src"],
-      "@coreui/vue-chartjs/*": ["./packages/coreui-vue-chartjs/src/*"]
-    }
-  },
-  "exclude": ["**/node_modules", "**/dist"]
-}
diff --git a/vue.config.js b/vue.config.js
new file mode 100644
index 00000000..76f952cc
--- /dev/null
+++ b/vue.config.js
@@ -0,0 +1,14 @@
+module.exports = {
+  configureWebpack:{
+    performance: {
+      hints: false
+    }
+  },
+  css: {
+    extract: false
+  },
+  transpileDependencies: [
+    '@coreui/icons',
+    '@coreui/utils'
+  ]
+}
