From 129dfa66cafb9eae28f31e7bcae3ee65fbed6db9 Mon Sep 17 00:00:00 2001 From: tdgao Date: Mon, 15 Jun 2026 22:27:40 -0700 Subject: [PATCH] feat: implement 2fa code input component --- .../base/TwoFactorAuthCodeInput.vue | 186 ++++++++++++++++++ packages/ui/src/components/base/index.ts | 1 + .../base/TwoFactorAuthCodeInput.stories.ts | 51 +++++ 3 files changed, 238 insertions(+) create mode 100644 packages/ui/src/components/base/TwoFactorAuthCodeInput.vue create mode 100644 packages/ui/src/stories/base/TwoFactorAuthCodeInput.stories.ts 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: ` + + `, + }), +}