diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e08ee3..03802a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,9 @@ every change carries a descriptive commit message.
reserved — a record with a mixed indicator (e.g. `E9`) showed DCS and hid VP.
- The read-only EF.SMSP view decoded the TP-DA length as octets, although it is the digit
count (TS 23.040 §9.1.2.5); a slot padded with `00` gained phantom digits.
+- The **Read decoded** pill no longer looks disabled when it is enabled: an inactive-but-
+ enabled pill is now an outlined button (blue on white/slate), and the grey fill and
+ dimming are left to the actually disabled state.
## [3.34.0] — 2026-10-23
diff --git a/frontend/index.html b/frontend/index.html
index b295d73..aaf9adf 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -1129,8 +1129,8 @@
-
-
+
+
@@ -16405,10 +16405,15 @@ function pysimFsSetMode(mode, skipRead) {
const active = el.dataset.mode === mode;
el.classList.toggle('bg-blue-600', active);
el.classList.toggle('text-white', active);
- el.classList.toggle('bg-gray-200', !active);
- el.classList.toggle('dark:bg-slate-700', !active);
- el.classList.toggle('text-gray-700', !active);
- el.classList.toggle('dark:text-slate-300', !active);
+ // An enabled inactive pill is an outlined button, not a grey one:
+ // grey reads as "disabled" while the pill is still clickable. The
+ // grey/dimmed look is left to the disabled state alone.
+ el.classList.toggle('bg-white', !active);
+ el.classList.toggle('dark:bg-slate-800', !active);
+ el.classList.toggle('text-blue-600', !active);
+ el.classList.toggle('dark:text-blue-300', !active);
+ el.classList.toggle('hover:bg-gray-100', !active);
+ el.classList.toggle('dark:hover:bg-slate-600', !active);
});
if (!skipRead && pysimFsSelected) pysimFsRead();
}
diff --git a/frontend/sw.js b/frontend/sw.js
index 5080986..78cfc31 100644
--- a/frontend/sw.js
+++ b/frontend/sw.js
@@ -1,4 +1,4 @@
-const CACHE = 'simple-v468';
+const CACHE = 'simple-v469';
const URLS = [
'index.html',
'help.html',
diff --git a/frontend/tests/fs_edit.test.js b/frontend/tests/fs_edit.test.js
index 5f9c349..c6068df 100644
--- a/frontend/tests/fs_edit.test.js
+++ b/frontend/tests/fs_edit.test.js
@@ -117,12 +117,19 @@ test('Read raw / Read decoded pills switch the view and read the file', () => {
assert.strictEqual(h.reads(), 0, 'skipRead updates the pills only');
assert.ok(h.pill('raw').classList.contains('bg-blue-600'));
assert.ok(!h.pill('dec').classList.contains('bg-blue-600'));
+ // an enabled inactive pill is outlined, not grey: the grey fill reads as
+ // "disabled" although the pill is clickable (reported live)
+ assert.ok(h.pill('dec').classList.contains('bg-white'));
+ assert.ok(h.pill('dec').classList.contains('text-blue-600'));
+ assert.ok(!h.pill('dec').classList.contains('bg-gray-200'));
pysimFsSetMode('dec');
assert.strictEqual(pysimFsDecodedMode, true);
assert.strictEqual(h.reads(), 1, 'a pill click reads the selected file');
assert.ok(h.pill('dec').classList.contains('bg-blue-600'));
assert.ok(!h.pill('raw').classList.contains('bg-blue-600'));
+ assert.ok(h.pill('raw').classList.contains('bg-white'));
+ assert.ok(!h.pill('raw').classList.contains('bg-gray-200'));
});
test('pill clicks are ignored while editing', () => {
@@ -221,4 +228,7 @@ test('the file manager row exposes the read pills and Edit raw', () => {
assert.ok(html.includes('id="pysim-fs-read-raw-btn"') && html.includes('data-needs="card"'));
const dec = /