From aebfe59a017358f3c1bd163c90c951038e4c2139 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Sun, 22 Mar 2026 11:39:30 +0100 Subject: [PATCH] Separate configuration step --- tests/e2e/integration.spec.js | 59 ++++++++++++----- web/src/css/style.css | 63 +++++++++---------- web/src/index.html | 17 +++-- web/src/js/app.js | 41 +++++++++--- .../nickelmenu/features/custom-menu/index.js | 4 +- .../features/hide-recommendations/index.js | 2 +- web/src/nickelmenu/features/koreader/index.js | 2 +- .../features/simplify-tabs/index.js | 4 +- 8 files changed, 125 insertions(+), 67 deletions(-) diff --git a/tests/e2e/integration.spec.js b/tests/e2e/integration.spec.js index e6f29c1..9fa692a 100644 --- a/tests/e2e/integration.spec.js +++ b/tests/e2e/integration.spec.js @@ -37,7 +37,10 @@ test.describe('NickelMenu', () => { // Select "Install NickelMenu and configure" await page.click('input[name="nm-option"][value="preset"]'); - await expect(page.locator('#nm-config-options')).not.toBeHidden(); + await page.click('#btn-nm-next'); + + // Feature selection step + await expect(page.locator('#step-nm-features')).not.toBeHidden(); // Verify default checkbox states await expect(page.locator('input[name="nm-cfg-readerly-fonts"]')).toBeChecked(); @@ -51,8 +54,7 @@ test.describe('NickelMenu', () => { await page.check('input[name="nm-cfg-hide-recommendations"]'); await page.check('input[name="nm-cfg-hide-notices"]'); - await expect(page.locator('#btn-nm-next')).toBeEnabled(); - await page.click('#btn-nm-next'); + await page.click('#btn-nm-features-next'); // Review step await expect(page.locator('#step-nm-review')).not.toBeHidden(); @@ -112,7 +114,10 @@ test.describe('NickelMenu', () => { // NickelMenu configure step — select "Install NickelMenu with preset" await expect(page.locator('#step-nickelmenu')).not.toBeHidden(); await page.click('input[name="nm-option"][value="preset"]'); - await expect(page.locator('#nm-config-options')).not.toBeHidden(); + await page.click('#btn-nm-next'); + + // Feature selection step + await expect(page.locator('#step-nm-features')).not.toBeHidden(); // KOReader checkbox should be visible and unchecked by default await expect(page.locator('input[name="nm-cfg-koreader"]')).not.toBeChecked(); @@ -120,7 +125,7 @@ test.describe('NickelMenu', () => { // Enable KOReader await page.check('input[name="nm-cfg-koreader"]'); - await page.click('#btn-nm-next'); + await page.click('#btn-nm-features-next'); // Review step — should list KOReader await expect(page.locator('#step-nm-review')).not.toBeHidden(); @@ -160,11 +165,15 @@ test.describe('NickelMenu', () => { // Select "Install NickelMenu with preset" await page.click('input[name="nm-option"][value="preset"]'); + await page.click('#btn-nm-next'); + + // Feature selection step + await expect(page.locator('#step-nm-features')).not.toBeHidden(); // Enable KOReader await page.check('input[name="nm-cfg-koreader"]'); - await page.click('#btn-nm-next'); + await page.click('#btn-nm-features-next'); // Review step await expect(page.locator('#nm-review-list')).toContainText('KOReader'); @@ -190,10 +199,8 @@ test.describe('NickelMenu', () => { await page.click('#btn-mode-next'); await expect(page.locator('#step-nickelmenu')).not.toBeHidden(); - // Select "Install NickelMenu only" + // Select "Install NickelMenu only" — goes directly to review (no features step) await page.click('input[name="nm-option"][value="nickelmenu-only"]'); - await expect(page.locator('#nm-config-options')).toBeHidden(); - await page.click('#btn-nm-next'); // Review step @@ -254,20 +261,23 @@ test.describe('NickelMenu', () => { // Select "Install NickelMenu and configure" await page.click('input[name="nm-option"][value="preset"]'); - await expect(page.locator('#nm-config-options')).not.toBeHidden(); + await page.click('#btn-nm-next'); + + // Feature selection step + await expect(page.locator('#step-nm-features')).not.toBeHidden(); // Enable all options for testing await page.check('input[name="nm-cfg-simplify-tabs"]'); await page.check('input[name="nm-cfg-hide-recommendations"]'); await page.check('input[name="nm-cfg-hide-notices"]'); - await page.click('#btn-nm-next'); + await page.click('#btn-nm-features-next'); // Review step await expect(page.locator('#step-nm-review')).not.toBeHidden(); await expect(page.locator('#nm-review-list')).toContainText('NickelMenu'); await expect(page.locator('#nm-review-list')).toContainText('Readerly fonts'); - await expect(page.locator('#nm-review-list')).toContainText('Hide certain navigation tabs'); + await expect(page.locator('#nm-review-list')).toContainText('Simplify navigation tabs'); await expect(page.locator('#nm-review-list')).toContainText('Hide home screen recommendations'); await expect(page.locator('#nm-review-list')).toContainText('Hide home screen notices'); @@ -315,10 +325,8 @@ test.describe('NickelMenu', () => { // NickelMenu configure step await expect(page.locator('#step-nickelmenu')).not.toBeHidden(); - // Select "Install NickelMenu only" + // Select "Install NickelMenu only" — goes directly to review (no features step) await page.click('input[name="nm-option"][value="nickelmenu-only"]'); - await expect(page.locator('#nm-config-options')).toBeHidden(); - await page.click('#btn-nm-next'); // Review step @@ -917,7 +925,7 @@ test.describe('Custom patches', () => { await page.click('#btn-nm-back'); await expect(page.locator('#step-mode')).not.toBeHidden(); - // Mode → NM config → Continue → NM review + // Mode → NM config → Continue (nickelmenu-only) → NM review await page.click('input[name="mode"][value="nickelmenu"]'); await page.click('#btn-mode-next'); await expect(page.locator('#step-nickelmenu')).not.toBeHidden(); @@ -925,10 +933,27 @@ test.describe('Custom patches', () => { await page.click('#btn-nm-next'); await expect(page.locator('#step-nm-review')).not.toBeHidden(); - // NM review → Back → NM config + // NM review → Back → NM config (skips features for nickelmenu-only) await page.click('#btn-nm-review-back'); await expect(page.locator('#step-nickelmenu')).not.toBeHidden(); + // NM config → select preset → Continue → Features step + await page.click('input[value="preset"]'); + await page.click('#btn-nm-next'); + await expect(page.locator('#step-nm-features')).not.toBeHidden(); + + // Features → Continue → NM review + await page.click('#btn-nm-features-next'); + await expect(page.locator('#step-nm-review')).not.toBeHidden(); + + // NM review → Back → Features (for preset) + await page.click('#btn-nm-review-back'); + await expect(page.locator('#step-nm-features')).not.toBeHidden(); + + // Features → Back → NM config + await page.click('#btn-nm-features-back'); + await expect(page.locator('#step-nickelmenu')).not.toBeHidden(); + // NM config → Back → Mode await page.click('#btn-nm-back'); await expect(page.locator('#step-mode')).not.toBeHidden(); diff --git a/web/src/css/style.css b/web/src/css/style.css index c28c357..ff1ef85 100644 --- a/web/src/css/style.css +++ b/web/src/css/style.css @@ -184,6 +184,13 @@ h2 { gap: 0.75rem; } +.mode-card-icon { + width: 28px; + height: 28px; + flex-shrink: 0; + color: var(--text-secondary); +} + .mode-card { display: flex; align-items: flex-start; @@ -278,14 +285,14 @@ h2 { .nm-options { display: flex; flex-direction: column; - gap: 0.6rem; + gap: 0.75rem; } .nm-option { display: flex; align-items: flex-start; gap: 0.75rem; - padding: 0.85rem 1rem; + padding: 1rem 1.25rem; background: var(--card-bg); border: 2px solid var(--border-light); border-radius: 10px; @@ -330,7 +337,9 @@ h2 { } #nm-uninstall-options { - padding: 0 0.25rem; + display: flex; + flex-direction: column; + margin-top: 0.5rem; margin-left: 1.5rem; } @@ -338,18 +347,17 @@ h2 { accent-color: var(--error-text) !important; } -/* NickelMenu config checkboxes */ +/* NickelMenu feature checkboxes */ .nm-config-options { - padding: 0 0.25rem; - margin-left: 1.5rem; + display: flex; + flex-direction: column; } .nm-config-item { display: flex; align-items: flex-start; - gap: 0.6rem; - padding: 0.5rem 0; - font-size: 0.88rem; + gap: 0.75rem; + padding: 0.6rem 0; color: var(--text); cursor: pointer; } @@ -360,7 +368,7 @@ h2 { .nm-config-item input[type="checkbox"] { flex-shrink: 0; - margin-top: 0.15rem; + margin-top: 0.2rem; accent-color: var(--primary); } @@ -370,32 +378,23 @@ h2 { .nm-config-text { user-select: none; - margin-top: -2px; +} + +.nm-config-title { + display: block; + font-weight: 600; + font-size: 0.93rem; + color: var(--text); } .nm-config-desc { display: block; - font-size: 0.75rem; + font-size: 0.83rem; color: var(--text-secondary); - line-height: 1.4; + line-height: 1.5; margin-top: 0.1rem; } -.nm-config-link { - display: block; - margin-top: 0.75rem; - padding-top: 0.75rem; - padding-bottom: 0.75rem; - border-top: 1px solid var(--border-light); - font-size: 0.8rem; - color: var(--primary); - text-decoration: none; -} - -.nm-config-link:hover { - text-decoration: underline; -} - .nm-option input[type="radio"] { margin-top: 0.2rem; flex-shrink: 0; @@ -403,14 +402,14 @@ h2 { } .nm-option-title { - font-weight: 500; - font-size: 0.88rem; + font-weight: 600; + font-size: 0.93rem; color: var(--text); - margin-bottom: 0.15rem; + margin-bottom: 0.25rem; } .nm-option-desc { - font-size: 0.78rem; + font-size: 0.83rem; color: var(--text-secondary); line-height: 1.5; } diff --git a/web/src/index.html b/web/src/index.html index 2cabbcf..4ea2d49 100644 --- a/web/src/index.html +++ b/web/src/index.html @@ -60,7 +60,7 @@

How would you like to set up your Kobo?

+ +
+ +