@@ -20915,7 +20917,7 @@ const LANG_RU = {
'TAR': 'TAR',
'Description': 'Описание',
'Card presets are stored on the server. A preset carries the card codes (PIN/PUK/ADM), a TAR table (every TAR with its MSL) and several keysets, each with its own number and counter.': 'Пресеты карт хранятся на сервере. Пресет содержит коды карты (PIN/PUK/ADM), таблицу TAR (у каждого TAR свой MSL) и несколько keysets — у каждого свой номер и счётчик.',
- 'All codes are optional: PIN/PUK are 4-8 decimal digits (stored for later use by the card operations — not consumed yet); ADM is the administrator key.': 'Все коды необязательны: PIN/PUK — 4–8 десятичных цифр (сохраняются для будущего использования операциями карты — пока не используются); ADM — администраторский ключ.',
+ 'All codes are optional': 'Все коды необязательны',
'The first three rows are the fixed role TARs; add further TARs as needed.': 'Первые три строки — фиксированные роли TAR; дополнительные TAR добавляются по необходимости.',
'PIN/PUK codes must be 4-8 decimal digits': 'Коды PIN/PUK должны состоять из 4–8 десятичных цифр',
'Keysets (number: KIc/KID — counter)': 'Keysets (номер: KIc/KID — счётчик)',
diff --git a/frontend/style.css b/frontend/style.css
index 9d0c46f..f2fce41 100644
--- a/frontend/style.css
+++ b/frontend/style.css
@@ -2221,10 +2221,6 @@ video {
.sm\:grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
-
- .sm\:grid-cols-3 {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
}
@media (min-width: 1024px) {
@@ -2240,12 +2236,16 @@ video {
grid-column: span 3 / span 3;
}
+ .lg\:w-56 {
+ width: 14rem;
+ }
+
.lg\:grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
- .lg\:grid-cols-5 {
- grid-template-columns: repeat(5, minmax(0, 1fr));
+ .lg\:flex-row {
+ flex-direction: row;
}
}/* ===== Theme contrast adjustments ===== */
diff --git a/frontend/sw.js b/frontend/sw.js
index f610dc6..3dbc281 100644
--- a/frontend/sw.js
+++ b/frontend/sw.js
@@ -1,4 +1,4 @@
-const CACHE = 'simple-v362';
+const CACHE = 'simple-v363';
const URLS = [
'index.html',
'help.html',
diff --git a/frontend/tests/html.test.js b/frontend/tests/html.test.js
index 9119f94..1135446 100644
--- a/frontend/tests/html.test.js
+++ b/frontend/tests/html.test.js
@@ -174,6 +174,22 @@ test('the ADM input allows the full 4-16 hex digit key', () => {
'the ADM input must allow 4-16 hex digits (server _verify_adm)');
});
+test('the PIN/ADM and TAR fieldsets share one responsive row', () => {
+ const start = html.indexOf('
');
+ assert.ok(start >= 0, 'the PIN/ADM + TAR row is missing');
+ const row = html.slice(start, html.indexOf('id="cards-keysets"'));
+ // both fieldsets live in the row: side by side from lg, stacked below
+ assert.match(row, /data-l10n="PIN\/ADM"/);
+ assert.match(row, /data-l10n="TAR"/);
+ assert.match(row, /class="[^"]*rounded p-3 lg:w-56 shrink-0"/);
+ assert.match(row, /class="[^"]*rounded p-3 flex-1 min-w-0"/);
+ // the codes are a vertical list, label above each input
+ assert.match(row, /class="space-y-2"[\s\S]*?for="cards-pin1"[\s\S]*?id="cards-pin1"/);
+ // the hint is the short form
+ assert.match(row, /data-l10n="All codes are optional"/);
+ assert.ok(!row.includes('not consumed yet'), 'the long codes hint is gone');
+});
+
test('the Cards tab splits the preset list and the editor into views', () => {
assert.match(html, /id="cards-list-view"/);
assert.match(html, /id="cards-editor-view" class="hidden"/);