From ac0aeff676ad838104262b1da497d7aa1da2082b Mon Sep 17 00:00:00 2001 From: jake Date: Tue, 17 Mar 2026 02:28:46 +0000 Subject: [PATCH] =?UTF-8?q?refactor(kon):=20dictation=20page=20layout=20?= =?UTF-8?q?=E2=80=94=20compact=20control=20strip,=20toolbar,=20more=20tran?= =?UTF-8?q?script=20space?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replaced tall header (pt-6 pb-4 with 28px timer + label stack) with 56px control strip - Control strip: 40px record button + waveform placeholder + 20px timer + status badge + task toggle - Waveform placeholder shows animated bars during recording, hint text at idle - Actions moved to dedicated toolbar row (justify-end) below control strip - Status footer (word count, format mode, profile) moved inside transcript Card - Insert-at-cursor indicator relocated to status footer - Page container remains flex-col h-full; transcript area fills all remaining space Co-Authored-By: Claude Opus 4.6 (1M context) --- src/lib/pages/DictationPage.svelte | 263 ++++++++++++++++------------- 1 file changed, 145 insertions(+), 118 deletions(-) diff --git a/src/lib/pages/DictationPage.svelte b/src/lib/pages/DictationPage.svelte index 6ca7c1a..446931e 100644 --- a/src/lib/pages/DictationPage.svelte +++ b/src/lib/pages/DictationPage.svelte @@ -504,11 +504,11 @@ {#if needsDownload} {:else} - -
+ +
- -
- - {page.timerText} - - - {#if page.recording} - - - REC - {#if insertPos >= 0} - inserting at cursor - {/if} - - {:else if modelLoading} - Loading Whisper model... - {:else if saved} - - Saved to history{#if extractedCount > 0} · {extractedCount} task{extractedCount === 1 ? '' : 's'} extracted{/if} - - {:else} - Press record or Ctrl+Shift+R - {/if} - + +
+ {#if page.recording} + + {#each [0.4, 0.8, 0.5, 1, 0.6, 0.9, 0.4, 0.7, 0.5, 0.8, 0.3, 0.6] as h, i} + + {/each} + + {:else} + + {#if modelLoading} + Loading model... + {:else if saved} + + Saved{#if extractedCount > 0} · {extractedCount} task{extractedCount === 1 ? '' : 's'} extracted{/if} + + {:else} + Press record or Ctrl+Shift+R + {/if} + + {/if}
-
+ + + {page.timerText} + - -
- - {#if templates.length > 0} -
- - {#if showTemplateMenu} -
- {#each templates as template} - - {/each} -
- {/if} -
+ + + {#if page.recording} + + + REC + + {:else if modelLoading} + Loading + {:else} + Ready {/if} - - - - - -
+ + + + + + + +
+ + +
+ + {#if templates.length > 0} +
- {#if showExportMenu} -
- {#each [["txt", "Plain Text"], ["md", "Markdown"], ["csv", "CSV"], ["html", "HTML"], ["srt", "SRT Subtitles"], ["vtt", "WebVTT"]] as [fmt, label]} + class="btn-md rounded-lg text-text-secondary hover:bg-hover hover:text-text flex-shrink-0 whitespace-nowrap" + onclick={() => { showTemplateMenu = !showTemplateMenu; showExportMenu = false; }} + >Template + {#if showTemplateMenu} +
+ {#each templates as template} + class="w-full text-left btn-md text-text-secondary hover:bg-hover hover:text-text + {activeTemplate === template.name ? 'text-accent' : ''}" + onclick={() => applyTemplate(template)} + >{template.name} {/each}
{/if}
- - + {/if} + + + + + +
+ class="btn-md rounded-lg text-text-secondary hover:bg-hover hover:text-text whitespace-nowrap" + onclick={() => { showExportMenu = !showExportMenu; showTemplateMenu = false; }} + >Export + {#if showExportMenu} +
+ {#each [["txt", "Plain Text"], ["md", "Markdown"], ["csv", "CSV"], ["html", "HTML"], ["srt", "SRT Subtitles"], ["vtt", "WebVTT"]] as [fmt, label]} + + {/each} +
+ {/if}
{#if activeTemplate} -
+
Template: {activeTemplate} Click a section, then record to fill it @@ -650,7 +670,7 @@ {#if error} -
+
{error}
@@ -658,12 +678,12 @@ {/if} -
+
- -
- -
- - {#if wordCount > 0} - {wordCount} {wordCount === 1 ? 'word' : 'words'} - {/if} - -
- {#if aiStatus} - {aiStatus} - {/if} - - {settings.formatMode} · {page.activeProfile === "None" ? "No profile" : page.activeProfile} - + +
+ + {#if wordCount > 0} + {wordCount} {wordCount === 1 ? 'word' : 'words'} + {:else} + 0 words + {/if} + {#if insertPos >= 0 && page.recording} + · inserting at cursor + {/if} + +
+ {#if aiStatus} + {aiStatus} + · + {/if} + + {settings.formatMode} · {page.activeProfile === "None" ? "No profile" : page.activeProfile} + +
+
+
{/if}