diff --git a/src/renderer/extensions/linearMode/OutputHistory.vue b/src/renderer/extensions/linearMode/OutputHistory.vue
new file mode 100644
index 0000000000..8b417f064b
--- /dev/null
+++ b/src/renderer/extensions/linearMode/OutputHistory.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/extensions/linearMode/mediaTypes.ts b/src/renderer/extensions/linearMode/mediaTypes.ts
new file mode 100644
index 0000000000..1f77b34f59
--- /dev/null
+++ b/src/renderer/extensions/linearMode/mediaTypes.ts
@@ -0,0 +1,33 @@
+import { t } from '@/i18n'
+
+import type { ResultItemImpl } from '@/stores/queueStore'
+
+export type StatItem = { content?: string; iconClass?: string }
+export const mediaTypes: Record = {
+ '3d': {
+ content: t('sideToolbar.mediaAssets.filter3D'),
+ iconClass: 'icon-[lucide--box]'
+ },
+ audio: {
+ content: t('sideToolbar.mediaAssets.filterAudio'),
+ iconClass: 'icon-[lucide--audio-lines]'
+ },
+ images: {
+ content: t('sideToolbar.mediaAssets.filterImage'),
+ iconClass: 'icon-[lucide--image]'
+ },
+ text: {
+ content: t('sideToolbar.mediaAssets.filterText'),
+ iconClass: 'icon-[lucide--text]'
+ },
+ video: {
+ content: t('sideToolbar.mediaAssets.filterVideo'),
+ iconClass: 'icon-[lucide--video]'
+ }
+}
+
+export function getMediaType(output?: ResultItemImpl) {
+ if (!output) return ''
+ if (output.isVideo) return 'video'
+ return output.mediaType
+}
diff --git a/src/views/LinearView.vue b/src/views/LinearView.vue
index 3db3604d6e..6fa4cd7077 100644
--- a/src/views/LinearView.vue
+++ b/src/views/LinearView.vue
@@ -1,31 +1,20 @@