UI: скрыть пароль при режиме 12 слов

This commit is contained in:
AidarKC
2026-06-20 21:33:44 +04:00
parent dd35e56029
commit ecc9efd434
3 changed files with 42 additions and 58 deletions
+14 -22
View File
@@ -53,7 +53,7 @@ function createWordsLayout({ words, onInput }) {
const preview = document.createElement('p');
preview.className = 'status-line';
section.append(grid, hint, preview);
section.append(grid, hint);
return { section, inputs, preview };
}
@@ -119,24 +119,13 @@ export function render({ navigate }) {
hint.className = 'meta-muted';
hint.textContent = 'Введите логин. На следующем шаге сохраните ключи на устройстве.';
const advanced = document.createElement('details');
advanced.className = 'card stack';
advanced.innerHTML = `
<summary>Расширенные</summary>
<p class="meta-muted">Схема деривации: логин нормализуется как trim().toLowerCase(). При непустом пароле используется Argon2id, затем из результата строится секрет.</p>
<p class="meta-muted">Из секрета строятся root key, blockchain key и device key. Обычно можно не вникать в это подробно и просто хранить всё на своём устройстве.</p>
<p class="meta-muted">Режим 12 слов ничего не меняет в протоколе: слова просто склеиваются в один обычный пароль длиной до 256 символов.</p>
<p class="meta-muted">Если пароль пустой — используется прежний детерминированный режим совместимости.</p>
<p class="meta-muted">Профиль Argon2id сейчас фиксированный: t=2, m=65536 KiB (64 MiB), p=1, dkLen=32.</p>
`;
const status = document.createElement('p');
status.className = 'status-line is-unavailable';
status.style.display = 'none';
const testLoginsHint = document.createElement('p');
testLoginsHint.className = 'meta-muted';
testLoginsHint.textContent = 'Основные тестовые логины: 1, 2, 3 (вход без пароля).';
let passwordField = null;
const passwordLengthText = document.createElement('p');
passwordLengthText.className = 'status-line';
function getCurrentPassword() {
return passwordMode === 'words' ? composePasswordFromWords(passwordWords) : String(passwordInput.value || '');
@@ -150,15 +139,17 @@ export function render({ navigate }) {
}
function updateWordsPreview() {
const password = composePasswordFromWords(passwordWords);
const nonEmptyCount = normalizePasswordWords(passwordWords).filter((word) => word.trim()).length;
wordsPreview.textContent = `Заполнено слов: ${nonEmptyCount} из 12 · итоговая длина пароля: ${password.length} символов.`;
const password = getCurrentPassword();
const text = `Итоговая длина пароля: ${password.length} символов.`;
wordsPreview.textContent = text;
passwordLengthText.textContent = text;
}
function updatePasswordModeVisibility() {
const wordsMode = passwordMode === 'words';
wordsSection.hidden = !wordsMode;
passwordInput.parentElement.hidden = wordsMode;
wordsSection.style.display = wordsMode ? 'grid' : 'none';
if (passwordField) passwordField.style.display = wordsMode ? 'none' : 'grid';
passwordInput.style.display = wordsMode ? 'none' : '';
updateWordsPreview();
}
@@ -167,8 +158,9 @@ export function render({ navigate }) {
<label class="stack"><span class="field-label">Пароль</span></label>
`;
form.children[0].append(loginInput);
form.children[1].append(passwordInput);
form.append(passwordModeToggle, wordsSection, hint, advanced, status, testLoginsHint);
passwordField = form.children[1];
passwordField.append(passwordInput);
form.append(passwordModeToggle, wordsSection, passwordLengthText, hint, status);
updatePasswordModeVisibility();
syncDraftState();