diff --git a/src/components/sidebar/tabs/AssetsSidebarGridView.vue b/src/components/sidebar/tabs/AssetsSidebarGridView.vue
index ac0bfcf39..f57f0b1f8 100644
--- a/src/components/sidebar/tabs/AssetsSidebarGridView.vue
+++ b/src/components/sidebar/tabs/AssetsSidebarGridView.vue
@@ -6,7 +6,11 @@
class="grid max-h-[50%] scrollbar-custom overflow-y-auto"
:style="gridStyle"
>
-
+
@@ -55,7 +59,7 @@ import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
import VirtualGrid from '@/components/common/VirtualGrid.vue'
-import ActiveJobCard from '@/components/sidebar/tabs/assets/ActiveJobCard.vue'
+import ActiveMediaAssetCard from '@/platform/assets/components/ActiveMediaAssetCard.vue'
import { useJobList } from '@/composables/queue/useJobList'
import MediaAssetCard from '@/platform/assets/components/MediaAssetCard.vue'
import type { AssetItem } from '@/platform/assets/schemas/assetSchema'
diff --git a/src/platform/assets/components/ActiveMediaAssetCard.stories.ts b/src/platform/assets/components/ActiveMediaAssetCard.stories.ts
new file mode 100644
index 000000000..1e32e96b2
--- /dev/null
+++ b/src/platform/assets/components/ActiveMediaAssetCard.stories.ts
@@ -0,0 +1,143 @@
+import type { Meta, StoryObj } from '@storybook/vue3-vite'
+
+import type { JobListItem } from '@/composables/queue/useJobList'
+
+import ActiveMediaAssetCard from './ActiveMediaAssetCard.vue'
+
+const meta: Meta = {
+ title: 'Platform/Assets/ActiveMediaAssetCard',
+ component: ActiveMediaAssetCard
+}
+
+export default meta
+type Story = StoryObj
+
+const SAMPLE_PREVIEW =
+ 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg'
+
+function createJob(overrides: Partial = {}): JobListItem {
+ return {
+ id: 'job-1',
+ title: 'Running...',
+ meta: 'Step 5/10',
+ state: 'running',
+ progressTotalPercent: 50,
+ progressCurrentPercent: 75,
+ ...overrides
+ }
+}
+
+export const Running: Story = {
+ decorators: [
+ () => ({
+ template: '
'
+ })
+ ],
+ args: {
+ job: createJob({
+ state: 'running',
+ progressTotalPercent: 65,
+ iconImageUrl: SAMPLE_PREVIEW
+ })
+ }
+}
+
+export const RunningWithoutPreview: Story = {
+ decorators: [
+ () => ({
+ template: '
'
+ })
+ ],
+ args: {
+ job: createJob({
+ state: 'running',
+ progressTotalPercent: 30
+ })
+ }
+}
+
+export const Pending: Story = {
+ decorators: [
+ () => ({
+ template: '
'
+ })
+ ],
+ args: {
+ job: createJob({
+ state: 'pending',
+ title: 'In queue...',
+ progressTotalPercent: undefined
+ })
+ }
+}
+
+export const Initialization: Story = {
+ decorators: [
+ () => ({
+ template: '
'
+ })
+ ],
+ args: {
+ job: createJob({
+ state: 'initialization',
+ title: 'Initializing...',
+ progressTotalPercent: undefined
+ })
+ }
+}
+
+export const Failed: Story = {
+ decorators: [
+ () => ({
+ template: '
'
+ })
+ ],
+ args: {
+ job: createJob({
+ state: 'failed',
+ title: 'Failed'
+ })
+ }
+}
+
+export const GridLayout: Story = {
+ render: () => ({
+ components: { ActiveMediaAssetCard },
+ setup() {
+ const jobs: JobListItem[] = [
+ createJob({
+ id: 'job-1',
+ state: 'running',
+ progressTotalPercent: 75,
+ iconImageUrl: SAMPLE_PREVIEW
+ }),
+ createJob({
+ id: 'job-2',
+ state: 'running',
+ progressTotalPercent: 45
+ }),
+ createJob({
+ id: 'job-3',
+ state: 'pending',
+ title: 'In queue...',
+ progressTotalPercent: undefined
+ }),
+ createJob({
+ id: 'job-4',
+ state: 'failed',
+ title: 'Failed'
+ })
+ ]
+ return { jobs }
+ },
+ template: `
+
+ `
+ })
+}
diff --git a/src/components/sidebar/tabs/assets/ActiveJobCard.test.ts b/src/platform/assets/components/ActiveMediaAssetCard.test.ts
similarity index 98%
rename from src/components/sidebar/tabs/assets/ActiveJobCard.test.ts
rename to src/platform/assets/components/ActiveMediaAssetCard.test.ts
index 59846bb5e..c653ae0be 100644
--- a/src/components/sidebar/tabs/assets/ActiveJobCard.test.ts
+++ b/src/platform/assets/components/ActiveMediaAssetCard.test.ts
@@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils'
import { describe, expect, it, vi } from 'vitest'
import { createI18n } from 'vue-i18n'
-import ActiveJobCard from './ActiveJobCard.vue'
+import ActiveJobCard from './ActiveMediaAssetCard.vue'
import type { JobListItem } from '@/composables/queue/useJobList'
diff --git a/src/components/sidebar/tabs/assets/ActiveJobCard.vue b/src/platform/assets/components/ActiveMediaAssetCard.vue
similarity index 100%
rename from src/components/sidebar/tabs/assets/ActiveJobCard.vue
rename to src/platform/assets/components/ActiveMediaAssetCard.vue