diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001434-9c6ea57daf-7c9d2641e8.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001434-9c6ea57daf-7c9d2641e8.zip
deleted file mode 100644
index daa4e7488..000000000
Binary files a/.yarn/cache/caniuse-lite-npm-1.0.30001434-9c6ea57daf-7c9d2641e8.zip and /dev/null differ
diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001445-535a3ade2b-f98ca67829.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001445-535a3ade2b-f98ca67829.zip
deleted file mode 100644
index 52a99f342..000000000
Binary files a/.yarn/cache/caniuse-lite-npm-1.0.30001445-535a3ade2b-f98ca67829.zip and /dev/null differ
diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001489-94fce279d5-94585a351f.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001489-94fce279d5-94585a351f.zip
new file mode 100644
index 000000000..f19a66fe9
Binary files /dev/null and b/.yarn/cache/caniuse-lite-npm-1.0.30001489-94fce279d5-94585a351f.zip differ
diff --git a/src/components/CvDropdown/CvDropdown.stories.mdx b/src/components/CvDropdown/CvDropdown.stories.mdx
new file mode 100644
index 000000000..17d86c3ee
--- /dev/null
+++ b/src/components/CvDropdown/CvDropdown.stories.mdx
@@ -0,0 +1,342 @@
+import { Canvas, Meta, Story } from '@storybook/addon-docs';
+import { sbCompPrefix } from '../../global/storybook-utils';
+import CvDropdown from './CvDropdown.vue';
+import CvDropdownItem from './CvDropdownItem.vue'
+import { action } from '@storybook/addon-actions';
+import { ref } from "vue";
+const myValue = ref('baby-yoda');
+
+
+
+export const Template = args => ({
+ // Components used in your story `template` are defined in the `components` object
+ components: {
+ CvDropdown,CvDropdownItem
+ },
+ // The story's `args` need to be mapped into the template through the `setup()` method
+ setup() {
+ return {
+ ...args,
+ props: args.props,
+ light: args.light,
+ placeholder: args.placeholder,
+ value: args.value,
+ label: args.label,
+ up: args.up,
+ inline: args.inline,
+ helperText: args.helperText,
+ hideSelected: args.hideSelected,
+ warnText: args.warnText,
+ invalidMessage: args.invalidMessage,
+ disabled: args.disabled,
+ size: args.size,
+ items: args.items,
+ onChange: action('change'),
+ myValue: myValue,
+ slotInvalidText: args.slotInvalidText,
+ slotWarningText: args.slotWarningText,
+ slotHelperText: args.slotHelperText
+ };
+ },
+ template: args.template,
+});
+const defaultTemplate = `
+
+
+ Din Djarin
+ Bo-Katan Kryze
+ Din Grogu
+ The Armorer
+ Greef Karga
+
+
+`;
+const slotsTemplate = `
+
+
+ Do not go to the dark side
+ Can this ally be trusted?
+ Choose ally strong with the force
+ Din Djarin
+ Bo-Katan Kryze
+ Din Grogu
+ The Armorer
+ Greef Karga
+
+
+`;
+const itemsTemplate = `
+
+
+
+
+`;
+const vmodelTemplate = `
+
+
+ Din Djarin
+ Bo-Katan Kryze
+ Din Grogu
+ The Armorer
+ Greef Karga
+
+
V-Model value: {{ myValue }}
+
+
+`;
+
+
+
+# CvDropdown
+Notes:
+- You can place a Dropdown inline with other content by using the inline variant
+Migration notes:
+
+- The `v-model` is different in Vue 3 than Vue 2. You can still specify the `v-model=something` to control the visibility but
+ if you specify it like this you will see a deprecation message in the log. Please use `v-model:value=something` instead.
+- Add the `size` option to match Carbon React
+- Add the `warnText` option to match Carbon React
+
+
+
+ # Use slots with helper, invalid, and warning text
+
+
+
+
+# Use an array of strings as the dropdown options
+- Notes: this version does not seem very useful. Please comment in the slack channel if you are using this.
+Curious to know how it might be currently used.
+
+
+
+# Use with v-model
+
+
diff --git a/src/components/CvDropdown/CvDropdown.vue b/src/components/CvDropdown/CvDropdown.vue
new file mode 100644
index 000000000..566da2ab8
--- /dev/null
+++ b/src/components/CvDropdown/CvDropdown.vue
@@ -0,0 +1,413 @@
+
+
+
+