-
{{ t('export.optionsTitle') }}
+
+ {{ t("export.optionsTitle") }}
+
- {{ t('export.withSpeakers') }}
-
+ {{
+ t("export.withSpeakers")
+ }}
+
- {{ t('export.withTimestamps') }}
- {{ t('export.textOnly') }}
+ {{
+ t("export.withTimestamps")
+ }}
+ {{
+ t("export.textOnly")
+ }}
-
+
- {{ t('export.mergeSegments') }}
- {{ t('export.textOnly') }}
+ {{
+ t("export.mergeSegments")
+ }}
+ {{
+ t("export.textOnly")
+ }}
-
+
-
+
- {{ t('export.withSummary') }}
- {{ t('export.textOnly') }}
+ {{
+ t("export.withSummary")
+ }}
+ {{
+ t("export.textOnly")
+ }}
-
+
@@ -78,19 +125,53 @@ function handleJsonExport(): void {
-
{{ t('export.formats.title') }}
+
+ {{ t("export.formats.title") }}
+
-
+
-
+
-
+
+
+
+
diff --git a/app/components/HContainer.vue b/app/components/HContainer.vue
new file mode 100644
index 0000000..7fb5990
--- /dev/null
+++ b/app/components/HContainer.vue
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/components/LoadingView.vue b/app/components/LoadingView.vue
new file mode 100644
index 0000000..b131927
--- /dev/null
+++ b/app/components/LoadingView.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+ {{ props.loadingText }}
+
+
+
+
diff --git a/app/components/MediaEditor.vue b/app/components/MediaEditor.vue
deleted file mode 100644
index 37f48d2..0000000
--- a/app/components/MediaEditor.vue
+++ /dev/null
@@ -1,223 +0,0 @@
-
-
-
-
-
diff --git a/app/components/MediaPlaybackBar.vue b/app/components/MediaPlaybackBar.vue
new file mode 100644
index 0000000..1435b8c
--- /dev/null
+++ b/app/components/MediaPlaybackBar.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
diff --git a/app/components/MediaPreviewView.vue b/app/components/MediaPreviewView.vue
new file mode 100644
index 0000000..31f2db4
--- /dev/null
+++ b/app/components/MediaPreviewView.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ input.media.name }}
+
+
+ {{ formatFileSize(input.media.size) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ input.media.name }}
+
+
+ {{ formatFileSize(input.media.size) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("upload.settings") }}
+
+
+ {{ t("upload.configureTranscription") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("upload.numSpeakersHelp") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("upload.audioLanguageHelp") }}
+
+
+
+
+
+
+
+
+
+
+ {{ t("upload.settingsInfo") }}
+
+
+
+
+
+
+
+ {{ t("navigation.new") }}
+
+
+
+
+
+
+
+
diff --git a/app/components/MediaProcessingView.vue b/app/components/MediaProcessingView.vue
new file mode 100644
index 0000000..e1a2e67
--- /dev/null
+++ b/app/components/MediaProcessingView.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
diff --git a/app/components/MediaProgressView.vue b/app/components/MediaProgressView.vue
new file mode 100644
index 0000000..b51e5ed
--- /dev/null
+++ b/app/components/MediaProgressView.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.mediaName }}
+
+
+ {{
+ isVideoFile(props.media)
+ ? "Video"
+ : "Audio"
+ }}
+ •
+ {{
+ props.media.type
+ .split("/")[1]
+ ?.toUpperCase()
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ progress.message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/MediaSelectionView.vue b/app/components/MediaSelectionView.vue
new file mode 100644
index 0000000..a08112b
--- /dev/null
+++ b/app/components/MediaSelectionView.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("pages.index.uploadMedia") }}
+
+
+ {{ t("pages.index.uploadDescription") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Supported formats
+
+
+ MP3, MP4, M4A, FLAC, WAV, WEBM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("pages.index.recordAudio") }}
+
+
+ {{ t("pages.index.recordDescription") }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/NavigationMenu.vue b/app/components/NavigationMenu.vue
index 17e3796..1ea34a1 100644
--- a/app/components/NavigationMenu.vue
+++ b/app/components/NavigationMenu.vue
@@ -1,138 +1,23 @@
-
-
-
-
-
-
-
- handleUndo()" :disabled="!canUndo" variant="link">
- {{ t('navigation.undo') }}
-
-
- {{ t('navigation.redo') }}
-
-
-
-
-
- {{ t('navigation.new') }}
-
-
- {{ t('navigation.transcriptions') }}
-
-
-
+
+
+
+
-
+
+
+
+
+ -->
diff --git a/app/components/Onboarding.vue b/app/components/Onboarding.vue
new file mode 100644
index 0000000..a73998d
--- /dev/null
+++ b/app/components/Onboarding.vue
@@ -0,0 +1,258 @@
+
+
+
diff --git a/app/components/RenameSpeakerView.vue b/app/components/RenameSpeakerView.vue
index f826871..6aac8cb 100644
--- a/app/components/RenameSpeakerView.vue
+++ b/app/components/RenameSpeakerView.vue
@@ -1,21 +1,24 @@
-
- {{ t("common.speakers") }}
-
+
+
+ {{ t("common.speakers") }}
+
+
-
+
diff --git a/app/components/SpeakerStatisticsView.vue b/app/components/SpeakerStatisticsView.vue
new file mode 100644
index 0000000..9695c58
--- /dev/null
+++ b/app/components/SpeakerStatisticsView.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+ {{ t("statistics.title", "Speaker Statistics") }}
+
+
+ {{ t("statistics.description", "Speaking time distribution by speaker") }}
+
+
+
+
+
+
+
+
+ {{ t("statistics.audioDuration", "Audio Duration") }}
+
+
+
+ ...
+
+
+ {{ formatDuration(mediaDuration) }}
+
+
+
+
+
+
+ {{ t("statistics.speakingTime", "Speaking Time") }}
+
+
+ {{ formatDuration(totalSpeakingTime) }}
+
+
+
+
+
+ {{ t("statistics.speakingPercentage", "Speech Ratio") }}
+
+
+
+ ...
+
+
+ {{ speakingPercentage.toFixed(1) }}%
+
+
+
+
+
+
+
+ {{ t("statistics.bySpeaker", "By Speaker") }}
+
+
+
+
+
+
+
+
+ {{ stat.speaker }}
+
+
+
+
+
+ {{ formatDuration(stat.duration) }}
+
+
+ {{ stat.percentage.toFixed(1) }}%
+
+
+
+
+
+
+
+
+
+
+
+
{{ t("statistics.noData", "No speaker data available") }}
+
+
+
+
diff --git a/app/components/TimelineEditor.vue b/app/components/TimelineEditor.vue
new file mode 100644
index 0000000..f28722a
--- /dev/null
+++ b/app/components/TimelineEditor.vue
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+ Loading timeline...
+
+
+
diff --git a/app/components/TranscriptionEditView.vue b/app/components/TranscriptionEditView.vue
new file mode 100644
index 0000000..206c45a
--- /dev/null
+++ b/app/components/TranscriptionEditView.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ autoScrollEnabled
+ ? $t("transcription.autoScrollOn")
+ : $t("transcription.autoScrollOff")
+ }}
+
+
+
+
+
+
+
+
diff --git a/app/components/TranscriptionInfoView.vue b/app/components/TranscriptionInfoView.vue
new file mode 100644
index 0000000..3775982
--- /dev/null
+++ b/app/components/TranscriptionInfoView.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.transcription.name || t('transcription.info')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('media.noMedia') }}
+
+
+
+
+
+
+
diff --git a/app/components/TranscriptionSummaryView.vue b/app/components/TranscriptionSummaryView.vue
new file mode 100644
index 0000000..8431eb8
--- /dev/null
+++ b/app/components/TranscriptionSummaryView.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("summary.title") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t("summary.generating") || "Generating summary..." }}
+
+
+
+
+
+
+
+
+
+ {{ t("summary.empty") || "No summary generated yet" }}
+
+
+
+
diff --git a/app/components/TranscriptionViewer.vue b/app/components/TranscriptionViewer.vue
index e2a5a44..d882b73 100644
--- a/app/components/TranscriptionViewer.vue
+++ b/app/components/TranscriptionViewer.vue
@@ -1,24 +1,30 @@
-
+
-
-
{{ t('viewer.displayOptions') }}
-
+
+
+ {{ t("viewer.displayOptions") }}
+
+
-
- {{ t('viewer.showSpeakers') }}
+ {{ t("viewer.showSpeakers") }}
-
+
-
- {{ t('viewer.showTimestamps') }}
+ {{ t("viewer.showTimestamps") }}
-
+
-
- {{ t('viewer.mergeSegments') }}
+ {{ t("viewer.mergeSegments") }}
diff --git a/app/components/UploadMediaView.client.vue b/app/components/UploadMediaView.client.vue
deleted file mode 100644
index 3622ac2..0000000
--- a/app/components/UploadMediaView.client.vue
+++ /dev/null
@@ -1,336 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ t('upload.filePreview') || 'File Preview' }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ selectedFile.name }}
-
-
- {{ formatFileSize(selectedFile.size) }}
-
- {{ t('upload.videoFile') || 'Video' }}
-
-
- {{ t('upload.audioFile') || 'Audio' }}
-
-
-
- {{ t('upload.audioWillBeExtracted') || 'Audio will be extracted for transcription' }}
-
-
-
-
-
-
-
-
-
-
- {{ t('upload.useThisFile') || 'Use this file' }}
-
-
-
- {{ t('upload.selectDifferentFile') || 'Select different file' }}
-
-
-
-
-
-
-
-
-
-
-
- {{ t("upload.numSpeakersHelp") }}
-
-
-
-
-
-
- {{ t("upload.audioLanguageHelp") }}
-
-
-
-
-
-
-
-
{{ progressMessage }}
-
-
-
-
-
-
-
-
-
diff --git a/app/components/media/CurrentSegementEditor.vue b/app/components/media/CurrentSegementEditor.vue
index 3b65f5b..1f0c2c0 100644
--- a/app/components/media/CurrentSegementEditor.vue
+++ b/app/components/media/CurrentSegementEditor.vue
@@ -1,16 +1,22 @@
-
-
-
-
-
-
-
- ) =>
- onSegmentClicked(e, rectConfig.id!)
- "
- @mouseenter="onSegmentMouseEnter($event, rectConfig.text!)"
- @mouseleave="onSegmentMouseLeave()"
- @dragmove="onDragMove"
- @dragend="onDragEnd"
- @transform="onTransform"
- @transformend="onTransformEnd"
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ ) =>
+ onSegmentClicked(e, rectConfig.id!)
+ " @mouseenter="onSegmentMouseEnter($event, rectConfig.text!)" @mouseleave="onSegmentMouseLeave()"
+ @dragmove="onDragMove" @dragend="onDragEnd" @transform="onTransform"
+ @transformend="onTransformEnd" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/media/VideoView.vue b/app/components/media/VideoView.vue
index f307fba..1c54d3e 100644
--- a/app/components/media/VideoView.vue
+++ b/app/components/media/VideoView.vue
@@ -1,22 +1,23 @@
-