feat(app): register film and song renderers via plugin system

Create film-renderer.ts and song-renderer.ts as RendererDefinition
plugins using defineAsyncComponent for lazy loading. ContentPanel.vue
now looks up film/song components via getRendererForContentType()
instead of direct imports, enabling future community renderer plugins.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-03 20:39:28 +00:00
co-authored by Claude Opus 4.6
parent ad4612a5c2
commit 557f9e6220
4 changed files with 49 additions and 13 deletions
+8 -1
View File
@@ -1,4 +1,4 @@
import { registerPlugin } from '@aiui/core'
import { registerPlugin, registerRenderer } from '@aiui/core'
export async function initializePlugins(): Promise<void> {
// Register built-in AI provider
@@ -20,7 +20,14 @@ export async function initializePlugins(): Promise<void> {
},
})
// Register built-in content renderers
const { filmRenderer } = await import('./renderers/film-renderer')
const { songRenderer } = await import('./renderers/song-renderer')
registerRenderer(filmRenderer)
registerRenderer(songRenderer)
if (import.meta.env.DEV) {
console.log('[AIUI] Plugins initialized:', claudeProvider.id)
console.log('[AIUI] Renderers registered: film, song')
}
}
@@ -0,0 +1,12 @@
import { defineAsyncComponent } from 'vue'
import type { RendererDefinition } from '@aiui/core'
export const filmRenderer: RendererDefinition = {
id: 'film',
name: 'Film Renderer',
contentType: 'film',
surfaces: ['chat-preview', 'panel-preview', 'panel-play'],
chatPreview: defineAsyncComponent(() => import('@/components/content/FilmGrid.vue')),
panelPreview: defineAsyncComponent(() => import('@/components/content/FilmGrid.vue')),
panelPlay: defineAsyncComponent(() => import('@/components/content/FilmDetail.vue')),
}
@@ -0,0 +1,12 @@
import { defineAsyncComponent } from 'vue'
import type { RendererDefinition } from '@aiui/core'
export const songRenderer: RendererDefinition = {
id: 'song',
name: 'Song Renderer',
contentType: 'song',
surfaces: ['chat-preview', 'panel-preview', 'panel-play'],
chatPreview: defineAsyncComponent(() => import('@/components/content/SongGrid.vue')),
panelPreview: defineAsyncComponent(() => import('@/components/content/SongGrid.vue')),
panelPlay: defineAsyncComponent(() => import('@/components/content/SongDetail.vue')),
}