From 0e437d2b88de394e18e774d6ae70b5c930c03aff Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Sat, 29 Nov 2025 20:19:08 -0500 Subject: [PATCH] Added Focused mode as default. Also finally adding the icons correctly. --- bicorder-app/public/favicon.svg | 14 + bicorder-app/public/icon-192.png | Bin 0 -> 11312 bytes bicorder-app/public/icon-512.png | Bin 0 -> 14015 bytes bicorder-app/src/App.svelte | 490 ++++++++++++++++-- .../src/components/AnalysisDisplay.svelte | 41 +- .../src/components/ExportControls.svelte | 7 +- .../src/components/GradientSlider.svelte | 41 +- 7 files changed, 529 insertions(+), 64 deletions(-) create mode 100644 bicorder-app/public/favicon.svg create mode 100644 bicorder-app/public/icon-192.png create mode 100644 bicorder-app/public/icon-512.png diff --git a/bicorder-app/public/favicon.svg b/bicorder-app/public/favicon.svg new file mode 100644 index 0000000..8b5fd82 --- /dev/null +++ b/bicorder-app/public/favicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + # + diff --git a/bicorder-app/public/icon-192.png b/bicorder-app/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..e451b6d6af7976a8051083ebffc61fb46189c9e5 GIT binary patch literal 11312 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 C?zS2L literal 0 HcmV?d00001 diff --git a/bicorder-app/src/App.svelte b/bicorder-app/src/App.svelte index c05934a..8daa13b 100644 --- a/bicorder-app/src/App.svelte +++ b/bicorder-app/src/App.svelte @@ -14,6 +14,86 @@ data.metadata.timestamp = new Date().toISOString(); } + // View mode and navigation state + type ViewMode = 'focused' | 'list'; + let viewMode: ViewMode = 'focused'; // Focused is default + let currentScreen = 0; + let refreshKey = 0; // Used to force component refresh in focused mode + + // Screen types + type Screen = + | { type: 'metadata' } + | { type: 'gradient'; setIndex: number; gradientIndex: number; gradient: Gradient; setName: string } + | { type: 'analysis'; index: number; gradient: AnalysisGradient } + | { type: 'export' }; + + // Calculate all screens based on current shortform setting + function calculateScreens(): Screen[] { + const screens: Screen[] = []; + + // Metadata screen + screens.push({ type: 'metadata' }); + + // Diagnostic gradient screens + data.diagnostic.forEach((diagnosticSet, setIndex) => { + diagnosticSet.gradients.forEach((gradient, gradientIndex) => { + if (!data.metadata.shortform || gradient.shortform) { + screens.push({ + type: 'gradient', + setIndex, + gradientIndex, + gradient, + setName: diagnosticSet.set_name + }); + } + }); + }); + + // Analysis screens (not in shortform) + if (!data.metadata.shortform) { + data.analysis.forEach((gradient, index) => { + screens.push({ type: 'analysis', index, gradient }); + }); + } + + // Export screen + screens.push({ type: 'export' }); + + return screens; + } + + $: screens = calculateScreens(); + $: currentScreenData = screens[currentScreen]; + $: totalScreens = screens.length; + + function goToNextScreen() { + if (currentScreen < totalScreens - 1) { + currentScreen++; + } + } + + function goToPrevScreen() { + if (currentScreen > 0) { + currentScreen--; + } + } + + function toggleViewMode() { + viewMode = viewMode === 'focused' ? 'list' : 'focused'; + } + + // Generate ASCII progress bar + function generateProgressBar(current: number, total: number): string { + const filled = '#'; + const empty = '-'; + const barLength = Math.min(total, 20); // Cap at 20 characters for display + const filledCount = Math.round((current / total) * barLength); + const emptyCount = barLength - filledCount; + return filled.repeat(filledCount) + empty.repeat(emptyCount); + } + + $: progressBar = generateProgressBar(currentScreen + 1, totalScreens); + // Load saved state from localStorage onMount(() => { const saved = localStorage.getItem('bicorder-state'); @@ -45,6 +125,27 @@ console.error('Failed to load saved state:', e); } } + + // Keyboard navigation for focused mode + function handleKeyDown(e: KeyboardEvent) { + if (viewMode !== 'focused') return; + + // Only navigate if not typing in an input + if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) { + return; + } + + if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { + e.preventDefault(); + goToNextScreen(); + } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { + e.preventDefault(); + goToPrevScreen(); + } + } + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); }); // Save state whenever it changes @@ -117,57 +218,181 @@
Protocol
BICORDER
+
- + {#if viewMode === 'list'} + + - {#each data.diagnostic as diagnosticSet, setIndex} -
-
{diagnosticSet.set_name.toUpperCase()}
-
{diagnosticSet.set_description}
+ {#each data.diagnostic as diagnosticSet, setIndex} +
+
{diagnosticSet.set_name.toUpperCase()}
+
{diagnosticSet.set_description}
- {#each diagnosticSet.gradients as gradient, gradientIndex} - {#if !data.metadata.shortform || gradient.shortform} - { - data.diagnostic[setIndex].gradients[gradientIndex].value = e.detail ?? null; + {#each diagnosticSet.gradients as gradient, gradientIndex} + {#if !data.metadata.shortform || gradient.shortform} + { + data.diagnostic[setIndex].gradients[gradientIndex].value = e.detail ?? null; + data = data; + }} + on:notes={(e) => { + data.diagnostic[setIndex].gradients[gradientIndex].notes = e.detail; + data = data; + }} + /> + {/if} + {/each} +
+ {/each} + +
+
ANALYSIS
+ + {#each data.analysis as analysisItem, index} + { + if (!analysisItem.automated) { + data.analysis[index].value = e.detail ?? null; data = data; - }} - on:notes={(e) => { - data.diagnostic[setIndex].gradients[gradientIndex].notes = e.detail; - data = data; - }} - /> - {/if} + } + }} + on:notes={(e) => { + data.analysis[index].notes = e.detail; + data = data; + }} + /> {/each}
- {/each} -
-
ANALYSIS
+ - {#each data.analysis as analysisItem, index} - { - if (!analysisItem.automated) { - data.analysis[index].value = e.detail ?? null; - data = data; - } - }} - on:notes={(e) => { - data.analysis[index].notes = e.detail; - data = data; - }} - /> - {/each} -
+ {:else} + +
+ {#if currentScreenData.type === 'metadata'} +
+ +
- + {:else if currentScreenData.type === 'gradient'} + {@const screen = currentScreenData} +
+
{screen.setName.toUpperCase()}
+ +
+
+
{screen.gradient.term_left}
+
{screen.gradient.term_left_description}
+
+ + {#key refreshKey} + { + data.diagnostic[screen.setIndex].gradients[screen.gradientIndex].value = e.detail ?? null; + data = data; + refreshKey++; // Force component refresh + }} + on:notes={(e) => { + data.diagnostic[screen.setIndex].gradients[screen.gradientIndex].notes = e.detail; + data = data; + refreshKey++; // Force component refresh + }} + /> + {/key} + +
+
{screen.gradient.term_right}
+
{screen.gradient.term_right_description}
+
+
+
+ + {:else if currentScreenData.type === 'analysis'} + {@const screen = currentScreenData} +
+
ANALYSIS
+ +
+
+
{screen.gradient.term_left}
+
{screen.gradient.term_left_description}
+
+ + {#key refreshKey} + { + if (!screen.gradient.automated) { + data.analysis[screen.index].value = e.detail ?? null; + data = data; + refreshKey++; // Force component refresh + } + }} + on:notes={(e) => { + data.analysis[screen.index].notes = e.detail; + data = data; + refreshKey++; // Force component refresh + }} + /> + {/key} + +
+
{screen.gradient.term_right}
+
{screen.gradient.term_right_description}
+
+
+
+ + {:else if currentScreenData.type === 'export'} +
+ +
+ {/if} +
+ + +
+ + +
+
{progressBar}
+
{currentScreen + 1} / {totalScreens}
+
+
+ {/if} diff --git a/bicorder-app/src/components/AnalysisDisplay.svelte b/bicorder-app/src/components/AnalysisDisplay.svelte index 716ba78..d40e1f2 100644 --- a/bicorder-app/src/components/AnalysisDisplay.svelte +++ b/bicorder-app/src/components/AnalysisDisplay.svelte @@ -4,6 +4,7 @@ import Tooltip from './Tooltip.svelte'; export let gradient: AnalysisGradient; + export let focusedMode: boolean = false; const dispatch = createEventDispatcher<{ change: number | null; @@ -98,12 +99,14 @@
-
-
- - {gradient.term_left} - -
+
+ {#if !focusedMode} +
+ + {gradient.term_left} + +
+ {/if}
-
- - {gradient.term_right} - -
+ {#if !focusedMode} +
+ + {gradient.term_right} + +
+ {/if}
@@ -200,6 +205,15 @@ margin-bottom: 0.5rem; } + .gradient-row.focused { + display: flex; + justify-content: center; + } + + .gradient-row.focused .bar-container { + width: 100%; + } + .term { text-align: center; font-size: 0.9rem; @@ -257,6 +271,11 @@ font-size: 0.9rem; } + .analysis-gradient .value-display { + margin-top: 0.5rem; + margin-bottom: 0.25rem; + } + .auto-label { opacity: 0.6; font-size: 0.8rem; diff --git a/bicorder-app/src/components/ExportControls.svelte b/bicorder-app/src/components/ExportControls.svelte index 427173c..b501a16 100644 --- a/bicorder-app/src/components/ExportControls.svelte +++ b/bicorder-app/src/components/ExportControls.svelte @@ -3,6 +3,7 @@ import type { BicorderState } from '../types'; export let data: BicorderState; + export let focusedMode: boolean = false; const dispatch = createEventDispatcher<{ reset: void; @@ -121,7 +122,7 @@ } -
+
-
- - {gradient.term_right} - -
+ {#if !focusedMode} +
+ + {gradient.term_right} + +
+ {/if}
@@ -179,6 +184,15 @@ margin-bottom: 0.5rem; } + .gradient-row.focused { + display: flex; + justify-content: center; + } + + .gradient-row.focused .bar-container { + width: 100%; + } + .term { text-align: center; font-size: 0.9rem; @@ -231,6 +245,11 @@ font-size: 0.9rem; } + .gradient-container .value-display { + margin-top: 0.5rem; + margin-bottom: 0.25rem; + } + .controls { margin-top: 0.5rem; display: flex;