19096552b4
- RegisterView: email + password (strength-meter 0..4) + 2 click-wrap'а (оферта + ПДн). 3-й «маркетинг» из handoff НЕ реализован (расхождение #2 реестра v1.13 - handoff противоречит ТЗ §1.5/§4.1). - TwoFactorView: 6 input-cell с auto-focus вперёд при вводе цифры, Backspace назад при empty, paste 6 цифр заполняет все. - ForgotPasswordView: email + alert «5 попыток / 15 минут» по ТЗ §1.7. - RecoveryCodesView: 8 кодов в 2-column grid + Скачать .txt (Blob/URL.createObjectURL) + Копировать (navigator.clipboard) + warning о невозможности повторного просмотра. Router: 4 новых маршрута (/register, /2fa, /forgot, /recovery), все meta.layout='auth', lazy-imports. Vitest +14 тестов (всего 24/24 за 3.29s): - RegisterView 4 (вкл. assertion на отсутствие маркетингового click-wrap) - TwoFactorView 3, ForgotPasswordView 3, RecoveryCodesView 4 Stories +4 (Histoire 6/6 за 29.17s). Регресс: lint+type-check+format OK; vitest 24/24; vite build 5 lazy-chunks для views + Vuetify в отдельные chunks (app chunk 198KB→78KB); Pest 48/48 за 4.85s. CLAUDE.md v1.19→v1.20, реестр Открытых_вопросов v1.28→v1.29. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
25 lines
634 B
Vue
25 lines
634 B
Vue
<script setup lang="ts">
|
|
import TwoFactorView from './TwoFactorView.vue';
|
|
</script>
|
|
|
|
<template>
|
|
<Story title="Auth / TwoFactorView" :layout="{ type: 'single', iframe: true }">
|
|
<Variant title="default">
|
|
<v-app>
|
|
<v-main class="story-form-pane">
|
|
<v-container class="d-flex justify-center align-center fill-height">
|
|
<TwoFactorView />
|
|
</v-container>
|
|
</v-main>
|
|
</v-app>
|
|
</Variant>
|
|
</Story>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.story-form-pane {
|
|
background: #f6f3ec;
|
|
min-height: 100vh;
|
|
}
|
|
</style>
|