Skip to content

Commit 2c64aba

Browse files
Advance wizard UX, accessibility tiers, and contrast resilience
1 parent 69c6863 commit 2c64aba

10 files changed

Lines changed: 737 additions & 68 deletions

File tree

14.1 MB
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d5b0d25ddfc3fe6d6352ca1387d785c0bb2114e099c5a3320a465fe21a9b8bc2 folderview.plus-2026.03.21.09.txz

folderview.plus.plg

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@
66
<!ENTITY launch "Settings/FolderViewPlus">
77
<!ENTITY plugdir "/usr/local/emhttp/plugins/&name;">
88
<!ENTITY pluginURL "https://raw.githubusercontent.com/&github;/dev/folderview.plus.plg">
9-
<!ENTITY version "2026.03.21.08">
10-
<!ENTITY md5 "2b06eaf64095913eb3e1727c7c831357">
9+
<!ENTITY version "2026.03.21.09">
10+
<!ENTITY md5 "6e420ddd983612b56a79faf408199b6b">
1111
]>
1212

1313
<PLUGIN name="&name;" author="&author;" version="&version;" launch="&launch;" pluginURL="&pluginURL;" icon="folder-icon.png" support="https://forums.unraid.net/topic/197631-plugin-folderview-plus/" min="7.0.0">
1414
<CHANGES>
1515

16+
###2026.03.21.09
17+
- Feature: Added wizard contrast system with explicit tiers (`normal/high/max`) plus auto contrast evaluation that selects safer tiers when needed.
18+
- Feature: Added wizard quick accessibility controls (Focus mode toggle + Contrast selector) and keyboard shortcuts (`Alt+F`, `Alt+C`).
19+
- UX: Improved active/selected affordance beyond color (shape, weight, highlight rails), added inline "how to fix" guidance, and mobile chip-row detail toggles.
20+
- UX: Introduced semantic wizard status color mapping (`info/success/warning/danger/neutral`) with stronger hierarchy for step/card/readability states.
21+
- Quality: Expanded wizard regression guards in runtime/theme smoke tests and updated theme guards for tier/selector contracts.
22+
23+
1624
###2026.03.21.08
1725
- Feature: Reworked setup-wizard card theming to use explicit `data-fv-card-tone` module mapping instead of positional `nth-child` styling.
1826
- UX: Tokenized wizard panel/card backgrounds, accents, and shell surfaces to reduce hardcoded style coupling while preserving contrast-safe fallbacks.

scripts/theme_matrix_smoke.mjs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,19 @@ const runScenarioChecks = async (page, { label, browserName, mobile, zoom }) =>
294294
}
295295

296296
const errors = [];
297+
const contrastTier = String(dialog.getAttribute('data-fv-wizard-contrast-tier') || '').trim();
298+
if (!['normal', 'high', 'max'].includes(contrastTier)) {
299+
errors.push(`Wizard contrast tier attribute is invalid (${contrastTier || 'missing'}).`);
300+
}
301+
const focusModeButton = dialog.querySelector('#fv-setup-focus-mode');
302+
if (!focusModeButton) {
303+
errors.push('Wizard focus mode toggle is missing.');
304+
}
305+
const contrastSelect = dialog.querySelector('#fv-setup-contrast-mode');
306+
if (!contrastSelect) {
307+
errors.push('Wizard contrast mode selector is missing.');
308+
}
309+
297310
const fallbackBg = parseColor(window.getComputedStyle(dialog).backgroundColor) || { r: 10, g: 14, b: 20, a: 1 };
298311
const resolveBackground = (element) => {
299312
let current = element;
@@ -336,6 +349,7 @@ const runScenarioChecks = async (page, { label, browserName, mobile, zoom }) =>
336349
verifyContrast('.fv-setup-profile-help', 4.0, 'Profile helper text');
337350
verifyContrast('.fv-setup-step-list li', 4.0, 'Step list labels');
338351
verifyContrast('.fv-setup-chip', 3.5, 'Summary chips');
352+
verifyContrast('.fv-setup-inline-guidance', 4.0, 'Inline guidance text');
339353

340354
const disabledControls = Array.from(dialog.querySelectorAll('button:disabled, input:disabled, select:disabled'))
341355
.filter((element) => isVisible(element))
@@ -391,6 +405,13 @@ const runScenarioChecks = async (page, { label, browserName, mobile, zoom }) =>
391405
}
392406
}
393407

408+
if (context.mobile === true) {
409+
const chipToggle = dialog.querySelector('.fv-setup-chip-toggle');
410+
if (!chipToggle) {
411+
errors.push('Wizard mobile chip collapse toggle was not rendered.');
412+
}
413+
}
414+
394415
return { errors };
395416
}, { mobile, zoom });
396417

scripts/theme_runtime_guard.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ VM_CSS="${PLUGIN_DIR}/styles/vm.css"
99
DASHBOARD_CSS="${PLUGIN_DIR}/styles/dashboard.css"
1010
SETTINGS_CSS="${PLUGIN_DIR}/styles/folderviewplus.css"
1111
SETTINGS_JS="${PLUGIN_DIR}/scripts/folderviewplus.js"
12+
WIZARD_JS="${PLUGIN_DIR}/scripts/folderviewplus.wizard.js"
1213
SETTINGS_PAGE="${PLUGIN_DIR}/FolderViewPlus.page"
1314
DOCKER_JS="${PLUGIN_DIR}/scripts/docker.js"
1415
VM_JS="${PLUGIN_DIR}/scripts/vm.js"
@@ -48,6 +49,7 @@ require_file "${VM_CSS}"
4849
require_file "${DASHBOARD_CSS}"
4950
require_file "${SETTINGS_CSS}"
5051
require_file "${SETTINGS_JS}"
52+
require_file "${WIZARD_JS}"
5153
require_file "${SETTINGS_PAGE}"
5254
require_file "${DOCKER_JS}"
5355
require_file "${VM_JS}"
@@ -75,12 +77,18 @@ require_contains "${SETTINGS_CSS}" '\.fv-setup-card\[data-fv-card-tone="env"\]'
7577
require_contains "${SETTINGS_CSS}" '\.fv-setup-card\[data-fv-card-tone="mode"\]' 'wizard card tone selector (mode)'
7678
require_contains "${SETTINGS_CSS}" '\.fv-setup-card\[data-fv-card-tone="bundle"\]' 'wizard card tone selector (bundle)'
7779
require_contains "${SETTINGS_CSS}" '\.fv-setup-card\[data-fv-card-tone="preset"\]' 'wizard card tone selector (preset)'
80+
require_contains "${SETTINGS_CSS}" '#fv-setup-assistant-dialog\[data-fv-wizard-contrast-tier="high"\]' 'wizard high contrast tier selector'
81+
require_contains "${SETTINGS_CSS}" '#fv-setup-assistant-dialog\[data-fv-wizard-contrast-tier="max"\]' 'wizard max contrast tier selector'
7882
require_absent "${SETTINGS_CSS}" '\.fv-setup-step-grid > \.fv-setup-card:nth-child' 'wizard should not use positional tone mapping'
7983
require_absent "${SETTINGS_CSS}" '--fv-wizard-text-primary:[[:space:]]*var\(--text' 'wizard text token must not follow host text token directly'
8084
require_absent "${SETTINGS_CSS}" '--fv-wizard-text-primary:[[:space:]]*var\(--fvplus-settings-text-primary\)' 'wizard text token must not follow settings token directly'
8185
require_contains "${SETTINGS_JS}" 'const buildResolvedThemeSnapshot = \(modeInput = null\) =>' 'theme resolver snapshot helper'
8286
require_contains "${SETTINGS_JS}" 'const applyResolvedThemeTokens = \(reason = '\''runtime'\''\) =>' 'theme resolver apply helper'
8387
require_contains "${SETTINGS_JS}" 'const runThemeSelfHeal = async \(\) =>' 'theme self-heal action'
88+
require_contains "${WIZARD_JS}" 'const normalizeSetupAssistantContrastPreference = \(value\) =>' 'wizard contrast preference normalizer'
89+
require_contains "${WIZARD_JS}" 'const applySetupAssistantContrastTier = \(\) =>' 'wizard contrast apply helper'
90+
require_contains "${WIZARD_JS}" 'id="fv-setup-focus-mode"' 'wizard focus mode control'
91+
require_contains "${WIZARD_JS}" 'id="fv-setup-contrast-mode"' 'wizard contrast mode control'
8492
require_contains "${SETTINGS_PAGE}" 'runThemeSelfHeal\(\)' 'theme self-heal button wiring'
8593

8694
require_absent "${DOCKER_JS}" '\.css\(\s*["'"'"']color["'"'"']\s*,\s*statusColors' 'docker inline status color painting'

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/scripts/folderviewplus.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,11 @@ const setupAssistantState = {
667667
environmentPreset: 'home_lab',
668668
applyEnvironmentDefaults: true,
669669
dryRunOnly: false,
670+
focusModeEnabled: true,
671+
contrastPreference: 'auto',
672+
contrastTierApplied: 'normal',
673+
lastContrastReport: null,
674+
collapsedChipRows: {},
670675
context: null,
671676
importPlans: {
672677
docker: null,

0 commit comments

Comments
 (0)