diff --git a/packages/ui/src/components/base/TwoFactorAuthCodeInput.vue b/packages/ui/src/components/base/TwoFactorAuthCodeInput.vue
new file mode 100644
index 0000000000..838ffcbb78
--- /dev/null
+++ b/packages/ui/src/components/base/TwoFactorAuthCodeInput.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
diff --git a/packages/ui/src/components/base/index.ts b/packages/ui/src/components/base/index.ts
index 5afcec8f57..8357bf5aa0 100644
--- a/packages/ui/src/components/base/index.ts
+++ b/packages/ui/src/components/base/index.ts
@@ -97,4 +97,5 @@ export type {
export { default as TimeFramePicker } from './TimeFramePicker.vue'
export { default as Timeline } from './Timeline.vue'
export { default as Toggle } from './Toggle.vue'
+export { default as TwoFactorAuthCodeInput } from './TwoFactorAuthCodeInput.vue'
export { default as UnsavedChangesPopup } from './UnsavedChangesPopup.vue'
diff --git a/packages/ui/src/stories/base/TwoFactorAuthCodeInput.stories.ts b/packages/ui/src/stories/base/TwoFactorAuthCodeInput.stories.ts
new file mode 100644
index 0000000000..14a4ac8bea
--- /dev/null
+++ b/packages/ui/src/stories/base/TwoFactorAuthCodeInput.stories.ts
@@ -0,0 +1,51 @@
+import type { Meta, StoryObj } from '@storybook/vue3-vite'
+import { ref } from 'vue'
+
+import TwoFactorAuthCodeInput from '../../components/base/TwoFactorAuthCodeInput.vue'
+
+const meta = {
+ title: 'Base/TwoFactorAuthCodeInput',
+ component: TwoFactorAuthCodeInput,
+} satisfies Meta
+
+export default meta
+type Story = StoryObj
+
+export const Default: Story = {
+ render: () => ({
+ components: { TwoFactorAuthCodeInput },
+ setup() {
+ const code = ref('')
+ return { code }
+ },
+ template: `
+
+ `,
+ }),
+}
+
+export const Filled: Story = {
+ render: () => ({
+ components: { TwoFactorAuthCodeInput },
+ setup() {
+ const code = ref('123456')
+ return { code }
+ },
+ template: `
+
+ `,
+ }),
+}
+
+export const Disabled: Story = {
+ render: () => ({
+ components: { TwoFactorAuthCodeInput },
+ setup() {
+ const code = ref('123456')
+ return { code }
+ },
+ template: `
+
+ `,
+ }),
+}