-
Tags
+
Tags
{#if !meetings.selected}
Select a meeting to tag it.
{:else}
@@ -152,7 +153,7 @@
{/if}
-
Summary
+
Summary
{#if !meetings.selected}
Select a meeting to generate a summary.
{:else if meetings.summarizingId === meetings.selected.id}
@@ -178,14 +179,17 @@
{#if llmStatus && llmStatus.provider === "off"}
No local LLM provider configured — enable one in Settings.
{:else}
-
Generate summary
+
+
+ Generate summary
+
{/if}
{/if}
{#if meetings.summaryError}
{meetings.summaryError}
{/if}
-
Action items
+
Action items
{#if !meetings.selected}
Select a meeting to see its action items.
{:else if editableItems.length === 0}
@@ -208,7 +212,7 @@
/>
- 🔔
+
{/each}
@@ -218,7 +222,7 @@
{/if}
-
Calendar event
+
Calendar event
{#if !meetings.selected}
Select a meeting to link it to a calendar event.
{:else}
@@ -252,7 +256,7 @@
{/if}
{/if}
-
Participants
+
Participants
{#if !eventDetail || eventDetail.participants.length === 0}
Populated from the linked calendar event.
{:else}
@@ -266,7 +270,7 @@
{/if}
-
Speakers
+
Speakers
{#if !meetings.selected}
Select a meeting to name its speakers.
{:else if meetings.selected.speakers.length === 0}
@@ -309,8 +313,38 @@
padding: 0.75rem;
}
h3 {
- font-size: 0.9rem;
- margin: 0.75rem 0 0.25rem;
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ font-size: 0.78rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+ color: var(--muted);
+ margin: 1.1rem 0 0.5rem;
+ padding-top: 1rem;
+ border-top: 1px solid var(--border);
+ }
+ h3:first-child {
+ margin-top: 0;
+ padding-top: 0;
+ border-top: none;
+ }
+ button.primary {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.4rem;
+ background: var(--accent);
+ color: var(--accent-fg);
+ border: 1px solid transparent;
+ border-radius: var(--radius-sm);
+ padding: 0.4rem 0.7rem;
+ font-size: 0.85rem;
+ font-weight: 600;
+ cursor: pointer;
+ }
+ button.primary:hover {
+ background: var(--accent-hover);
}
.muted {
color: var(--muted);
@@ -357,11 +391,17 @@
}
.due-date {
font-size: 0.75rem;
- padding: 0.15rem;
+ padding: 0.2rem;
max-width: 8.5rem;
+ border-radius: var(--radius-sm);
}
.remind {
- font-size: 0.85rem;
+ display: flex;
+ align-items: center;
+ color: var(--fg-subtle);
+ }
+ .remind:has(input:checked) {
+ color: var(--warning);
}
.error {
color: var(--danger);
diff --git a/src/lib/views/TranscriptNotes.svelte b/src/lib/views/TranscriptNotes.svelte
index da570bb..7ac2178 100644
--- a/src/lib/views/TranscriptNotes.svelte
+++ b/src/lib/views/TranscriptNotes.svelte
@@ -8,6 +8,20 @@
import { api, type SpeakerInfo } from "../api";
import { renderMarkdown } from "../markdown";
import { save, open } from "@tauri-apps/plugin-dialog";
+ import {
+ Bold,
+ Italic,
+ Heading1,
+ Heading2,
+ List,
+ ListChecks,
+ FileDown,
+ FileText,
+ FolderOutput,
+ RefreshCw,
+ MessageSquareText,
+ NotebookPen,
+ } from "@lucide/svelte";
function speakerName(label: string, speakers: SpeakerInfo[] = []): string {
return speakers.find((s) => s.label === label)?.display_name ?? label;
@@ -116,7 +130,7 @@
{@const m = meetings.selected}
-
Transcript
+
Transcript
{#if m.recorded && settings.models.some((mo) => mo.installed)}
@@ -126,6 +140,7 @@
{/each}
+
{reprocessing ? "Re-transcribing…" : "Go"}
@@ -139,31 +154,50 @@
{/if}
+
Notes
- wrapSelection("**")} title="Bold" aria-label="Bold"
- >B
- wrapSelection("_")} title="Italic" aria-label="Italic"
- >I
- insertLinePrefix("# ")} title="Heading 1">H1
- insertLinePrefix("## ")} title="Heading 2">H2
+ wrapSelection("**")} title="Bold" aria-label="Bold">
+
+
+ wrapSelection("_")} title="Italic" aria-label="Italic">
+
+
+ insertLinePrefix("# ")} title="Heading 1" aria-label="Heading 1">
+
+
+ insertLinePrefix("## ")} title="Heading 2" aria-label="Heading 2">
+
+
insertLinePrefix("- ")}
title="Bullet list"
- aria-label="Bullet list">•
+
+
insertLinePrefix("- [ ] ")}
title="Checkbox"
- aria-label="Checkbox list item">☑
+
+
- Export .md
- Export PDF
- Export Word
+
+
+ .md
+
+
+
+ PDF
+
+
+
+ Word
+
- Export bundle
+
+ Bundle
@@ -226,8 +260,14 @@
border-right: 1px solid var(--border);
}
.pane h4 {
- margin: 0 0 0.5rem;
- font-size: 0.85rem;
+ display: flex;
+ align-items: center;
+ gap: 0.35rem;
+ margin: 0 0 0.6rem;
+ font-size: 0.78rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
color: var(--muted);
}
.reprocess {
@@ -238,29 +278,52 @@
}
.reprocess select,
.reprocess button {
+ display: flex;
+ align-items: center;
+ gap: 0.3rem;
background: var(--bg);
color: var(--fg);
border: 1px solid var(--border);
- border-radius: 5px;
- padding: 0.25rem 0.4rem;
+ border-radius: var(--radius-sm);
+ padding: 0.3rem 0.5rem;
cursor: pointer;
}
+ :global(.spin) {
+ animation: spin 900ms linear infinite;
+ }
+ @keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+ }
+ @media (prefers-reduced-motion: reduce) {
+ :global(.spin) {
+ animation: none;
+ }
+ }
.toolbar {
display: flex;
align-items: center;
- gap: 0.3rem;
+ gap: 0.25rem;
margin-bottom: 0.5rem;
flex-wrap: wrap;
}
.toolbar button {
+ display: flex;
+ align-items: center;
+ gap: 0.3rem;
background: transparent;
border: 1px solid var(--border);
color: var(--fg);
- border-radius: 4px;
- padding: 0.2rem 0.5rem;
- font-size: 0.8rem;
+ border-radius: var(--radius-sm);
+ padding: 0.3rem 0.55rem;
+ font-size: 0.78rem;
cursor: pointer;
+ transition: background-color 120ms ease-out;
+ }
+ .toolbar button:hover {
+ background: var(--bg-hover);
}
.toolbar .spacer {
flex: 1;
@@ -277,12 +340,16 @@
width: 100%;
height: 100%;
box-sizing: border-box;
- padding: 0.5rem;
+ padding: 0.6rem;
border: 1px solid var(--border);
- border-radius: 6px;
+ border-radius: var(--radius-md);
background: var(--bg);
color: var(--fg);
font: inherit;
+ line-height: 1.5;
+ }
+ textarea:focus-visible {
+ border-color: var(--accent);
}
.preview {
overflow: auto;