diff --git a/frontend/index.html b/frontend/index.html index d52229f..903602e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1637,9 +1637,10 @@ -
+
+
PIN/ADM -
+
@@ -1661,9 +1662,9 @@
-

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.

+

All codes are optional

-
+
TAR @@ -1680,6 +1681,7 @@

Each TAR carries its MSL (Minimum SPI1) — the card checks it before the security processing (TS 102 226 8.2.1.3.2.4); the packet SPI1 is derived from it.

+
SCP80 (GSM 03.48, ETSI TS 102 225)
@@ -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"/);