@memberjunction/ng-artifacts 5.39.0 → 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/lib/artifacts.module.d.ts +26 -13
  2. package/dist/lib/artifacts.module.d.ts.map +1 -1
  3. package/dist/lib/artifacts.module.js +65 -2
  4. package/dist/lib/artifacts.module.js.map +1 -1
  5. package/dist/lib/components/artifact-message-card.component.d.ts +17 -1
  6. package/dist/lib/components/artifact-message-card.component.d.ts.map +1 -1
  7. package/dist/lib/components/artifact-message-card.component.js +118 -27
  8. package/dist/lib/components/artifact-message-card.component.js.map +1 -1
  9. package/dist/lib/components/base-artifact-viewer.component.d.ts +11 -0
  10. package/dist/lib/components/base-artifact-viewer.component.d.ts.map +1 -1
  11. package/dist/lib/components/base-artifact-viewer.component.js +11 -0
  12. package/dist/lib/components/base-artifact-viewer.component.js.map +1 -1
  13. package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts +32 -0
  14. package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts.map +1 -0
  15. package/dist/lib/components/plugins/audio-artifact-viewer.component.js +146 -0
  16. package/dist/lib/components/plugins/audio-artifact-viewer.component.js.map +1 -0
  17. package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts +11 -1
  18. package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts.map +1 -1
  19. package/dist/lib/components/plugins/image-artifact-viewer.component.js +17 -1
  20. package/dist/lib/components/plugins/image-artifact-viewer.component.js.map +1 -1
  21. package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts +34 -0
  22. package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts.map +1 -0
  23. package/dist/lib/components/plugins/video-artifact-viewer.component.js +148 -0
  24. package/dist/lib/components/plugins/video-artifact-viewer.component.js.map +1 -0
  25. package/dist/lib/components/previews/audio-artifact-preview.component.d.ts +20 -0
  26. package/dist/lib/components/previews/audio-artifact-preview.component.d.ts.map +1 -0
  27. package/dist/lib/components/previews/audio-artifact-preview.component.js +83 -0
  28. package/dist/lib/components/previews/audio-artifact-preview.component.js.map +1 -0
  29. package/dist/lib/components/previews/base-artifact-preview.component.d.ts +33 -0
  30. package/dist/lib/components/previews/base-artifact-preview.component.d.ts.map +1 -0
  31. package/dist/lib/components/previews/base-artifact-preview.component.js +52 -0
  32. package/dist/lib/components/previews/base-artifact-preview.component.js.map +1 -0
  33. package/dist/lib/components/previews/image-artifact-preview.component.d.ts +28 -0
  34. package/dist/lib/components/previews/image-artifact-preview.component.d.ts.map +1 -0
  35. package/dist/lib/components/previews/image-artifact-preview.component.js +91 -0
  36. package/dist/lib/components/previews/image-artifact-preview.component.js.map +1 -0
  37. package/dist/lib/components/previews/video-artifact-preview.component.d.ts +21 -0
  38. package/dist/lib/components/previews/video-artifact-preview.component.d.ts.map +1 -0
  39. package/dist/lib/components/previews/video-artifact-preview.component.js +84 -0
  40. package/dist/lib/components/previews/video-artifact-preview.component.js.map +1 -0
  41. package/dist/lib/interfaces/artifact-viewer-plugin.interface.d.ts +53 -10
  42. package/dist/lib/interfaces/artifact-viewer-plugin.interface.d.ts.map +1 -1
  43. package/dist/lib/interfaces/artifact-viewer-plugin.interface.js.map +1 -1
  44. package/dist/lib/services/artifact-preview-resolver.service.d.ts +39 -0
  45. package/dist/lib/services/artifact-preview-resolver.service.d.ts.map +1 -0
  46. package/dist/lib/services/artifact-preview-resolver.service.js +78 -0
  47. package/dist/lib/services/artifact-preview-resolver.service.js.map +1 -0
  48. package/dist/public-api.d.ts +7 -0
  49. package/dist/public-api.d.ts.map +1 -1
  50. package/dist/public-api.js +8 -0
  51. package/dist/public-api.js.map +1 -1
  52. package/package.json +18 -18
@@ -18,18 +18,23 @@ import * as i15 from "./components/plugins/pdf-artifact-viewer.component";
18
18
  import * as i16 from "./components/plugins/xlsx-artifact-viewer.component";
19
19
  import * as i17 from "./components/plugins/docx-artifact-viewer.component";
20
20
  import * as i18 from "./components/plugins/image-artifact-viewer.component";
21
- import * as i19 from "@angular/common";
22
- import * as i20 from "@angular/forms";
23
- import * as i21 from "@memberjunction/ng-markdown";
24
- import * as i22 from "@memberjunction/ng-code-editor";
25
- import * as i23 from "@memberjunction/ng-react";
26
- import * as i24 from "@memberjunction/ng-notifications";
27
- import * as i25 from "@memberjunction/ng-query-viewer";
28
- import * as i26 from "@memberjunction/ng-shared-generic";
29
- import * as i27 from "@memberjunction/ng-trees";
30
- import * as i28 from "@memberjunction/ng-base-forms";
31
- import * as i29 from "./components/plugins/component-feedback-panel/component-feedback-panel.component";
32
- import * as i30 from "ag-grid-angular";
21
+ import * as i19 from "./components/plugins/video-artifact-viewer.component";
22
+ import * as i20 from "./components/plugins/audio-artifact-viewer.component";
23
+ import * as i21 from "./components/previews/image-artifact-preview.component";
24
+ import * as i22 from "./components/previews/video-artifact-preview.component";
25
+ import * as i23 from "./components/previews/audio-artifact-preview.component";
26
+ import * as i24 from "@angular/common";
27
+ import * as i25 from "@angular/forms";
28
+ import * as i26 from "@memberjunction/ng-markdown";
29
+ import * as i27 from "@memberjunction/ng-code-editor";
30
+ import * as i28 from "@memberjunction/ng-react";
31
+ import * as i29 from "@memberjunction/ng-notifications";
32
+ import * as i30 from "@memberjunction/ng-query-viewer";
33
+ import * as i31 from "@memberjunction/ng-shared-generic";
34
+ import * as i32 from "@memberjunction/ng-trees";
35
+ import * as i33 from "@memberjunction/ng-base-forms";
36
+ import * as i34 from "./components/plugins/component-feedback-panel/component-feedback-panel.component";
37
+ import * as i35 from "ag-grid-angular";
33
38
  /**
34
39
  * Module for artifact viewer plugin system.
35
40
  * Provides components for viewing different types of artifacts (JSON, Code, Markdown, HTML, SVG, Components).
@@ -40,8 +45,16 @@ import * as i30 from "ag-grid-angular";
40
45
  export declare class ArtifactsModule {
41
46
  private adapter;
42
47
  constructor(adapter: AngularAdapterService);
48
+ /**
49
+ * Logs a warning for any registered artifact-viewer plugin that has NO render target at all —
50
+ * i.e. neither an implicit full viewer (the registered SubClass itself, which is the
51
+ * `componentType`) nor an explicit `previewComponentType`. Today every registration is an
52
+ * Angular component class, so the SubClass is always present and this never fires; the guard
53
+ * exists to catch regressions if the render-target invariant is ever loosened.
54
+ */
55
+ private static warnOnPluginsWithoutRenderTarget;
43
56
  static ɵfac: i0.ɵɵFactoryDeclaration<ArtifactsModule, never>;
44
- static ɵmod: i0.ɵɵNgModuleDeclaration<ArtifactsModule, [typeof i1.ArtifactTypePluginViewerComponent, typeof i2.ArtifactViewerPanelComponent, typeof i3.ArtifactVersionHistoryComponent, typeof i4.ArtifactMessageCardComponent, typeof i5.JsonArtifactViewerComponent, typeof i6.CodeArtifactViewerComponent, typeof i7.MarkdownArtifactViewerComponent, typeof i8.HtmlArtifactViewerComponent, typeof i9.SvgArtifactViewerComponent, typeof i10.ComponentArtifactViewerComponent, typeof i11.DataArtifactViewerComponent, typeof i12.SaveQueryPanelComponent, typeof i13.DataRequirementsViewerComponent, typeof i14.FileArtifactToolbarComponent, typeof i15.PdfArtifactViewerComponent, typeof i16.XlsxArtifactViewerComponent, typeof i17.DocxArtifactViewerComponent, typeof i18.ImageArtifactViewerComponent], [typeof i19.CommonModule, typeof i20.FormsModule, typeof i21.MarkdownModule, typeof i22.CodeEditorModule, typeof i23.MJReactModule, typeof i24.MJNotificationsModule, typeof i25.QueryViewerModule, typeof i26.SharedGenericModule, typeof i27.NgTreesModule, typeof i28.BaseFormsModule, typeof i29.ComponentFeedbackPanelComponent, typeof i30.AgGridModule], [typeof i1.ArtifactTypePluginViewerComponent, typeof i2.ArtifactViewerPanelComponent, typeof i3.ArtifactVersionHistoryComponent, typeof i4.ArtifactMessageCardComponent, typeof i5.JsonArtifactViewerComponent, typeof i6.CodeArtifactViewerComponent, typeof i7.MarkdownArtifactViewerComponent, typeof i8.HtmlArtifactViewerComponent, typeof i9.SvgArtifactViewerComponent, typeof i10.ComponentArtifactViewerComponent, typeof i11.DataArtifactViewerComponent, typeof i14.FileArtifactToolbarComponent, typeof i15.PdfArtifactViewerComponent, typeof i16.XlsxArtifactViewerComponent, typeof i17.DocxArtifactViewerComponent, typeof i18.ImageArtifactViewerComponent]>;
57
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ArtifactsModule, [typeof i1.ArtifactTypePluginViewerComponent, typeof i2.ArtifactViewerPanelComponent, typeof i3.ArtifactVersionHistoryComponent, typeof i4.ArtifactMessageCardComponent, typeof i5.JsonArtifactViewerComponent, typeof i6.CodeArtifactViewerComponent, typeof i7.MarkdownArtifactViewerComponent, typeof i8.HtmlArtifactViewerComponent, typeof i9.SvgArtifactViewerComponent, typeof i10.ComponentArtifactViewerComponent, typeof i11.DataArtifactViewerComponent, typeof i12.SaveQueryPanelComponent, typeof i13.DataRequirementsViewerComponent, typeof i14.FileArtifactToolbarComponent, typeof i15.PdfArtifactViewerComponent, typeof i16.XlsxArtifactViewerComponent, typeof i17.DocxArtifactViewerComponent, typeof i18.ImageArtifactViewerComponent, typeof i19.VideoArtifactViewerComponent, typeof i20.AudioArtifactViewerComponent, typeof i21.ImageArtifactPreviewComponent, typeof i22.VideoArtifactPreviewComponent, typeof i23.AudioArtifactPreviewComponent], [typeof i24.CommonModule, typeof i25.FormsModule, typeof i26.MarkdownModule, typeof i27.CodeEditorModule, typeof i28.MJReactModule, typeof i29.MJNotificationsModule, typeof i30.QueryViewerModule, typeof i31.SharedGenericModule, typeof i32.NgTreesModule, typeof i33.BaseFormsModule, typeof i34.ComponentFeedbackPanelComponent, typeof i35.AgGridModule], [typeof i1.ArtifactTypePluginViewerComponent, typeof i2.ArtifactViewerPanelComponent, typeof i3.ArtifactVersionHistoryComponent, typeof i4.ArtifactMessageCardComponent, typeof i5.JsonArtifactViewerComponent, typeof i6.CodeArtifactViewerComponent, typeof i7.MarkdownArtifactViewerComponent, typeof i8.HtmlArtifactViewerComponent, typeof i9.SvgArtifactViewerComponent, typeof i10.ComponentArtifactViewerComponent, typeof i11.DataArtifactViewerComponent, typeof i14.FileArtifactToolbarComponent, typeof i15.PdfArtifactViewerComponent, typeof i16.XlsxArtifactViewerComponent, typeof i17.DocxArtifactViewerComponent, typeof i18.ImageArtifactViewerComponent, typeof i19.VideoArtifactViewerComponent, typeof i20.AudioArtifactViewerComponent, typeof i21.ImageArtifactPreviewComponent, typeof i22.VideoArtifactPreviewComponent, typeof i23.AudioArtifactPreviewComponent]>;
45
58
  static ɵinj: i0.ɵɵInjectorDeclaration<ArtifactsModule>;
46
59
  }
47
60
  //# sourceMappingURL=artifacts.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.module.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.module.ts"],"names":[],"mappings":"AAQA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkChF;;;;;;GAMG;AACH,qBAyEa,eAAe;IACd,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;yCADvC,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAuB3B"}
1
+ {"version":3,"file":"artifacts.module.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.module.ts"],"names":[],"mappings":"AAQA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ChF;;;;;;GAMG;AACH,qBAuFa,eAAe;IACd,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAmClD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;yCA3CpC,eAAe;0CAAf,eAAe;0CAAf,eAAe;CA4D3B"}
@@ -30,6 +30,14 @@ import { PdfArtifactViewerComponent } from './components/plugins/pdf-artifact-vi
30
30
  import { XlsxArtifactViewerComponent } from './components/plugins/xlsx-artifact-viewer.component';
31
31
  import { DocxArtifactViewerComponent } from './components/plugins/docx-artifact-viewer.component';
32
32
  import { ImageArtifactViewerComponent } from './components/plugins/image-artifact-viewer.component';
33
+ import { VideoArtifactViewerComponent } from './components/plugins/video-artifact-viewer.component';
34
+ import { AudioArtifactViewerComponent } from './components/plugins/audio-artifact-viewer.component';
35
+ // Inline preview components (lightweight, rendered inside conversation message cards)
36
+ import { ImageArtifactPreviewComponent } from './components/previews/image-artifact-preview.component';
37
+ import { VideoArtifactPreviewComponent } from './components/previews/video-artifact-preview.component';
38
+ import { AudioArtifactPreviewComponent } from './components/previews/audio-artifact-preview.component';
39
+ import { MJGlobal } from '@memberjunction/global';
40
+ import { BaseArtifactViewerPluginComponent } from './components/base-artifact-viewer.component';
33
41
  // Import artifact type plugin viewer component
34
42
  import { ArtifactTypePluginViewerComponent } from './components/artifact-type-plugin-viewer.component';
35
43
  import { ArtifactVersionHistoryComponent } from './components/artifact-version-history.component';
@@ -62,12 +70,43 @@ export class ArtifactsModule {
62
70
  XlsxArtifactViewerComponent,
63
71
  DocxArtifactViewerComponent,
64
72
  ImageArtifactViewerComponent,
73
+ VideoArtifactViewerComponent,
74
+ AudioArtifactViewerComponent,
75
+ // Preview components are referenced via plugins' previewComponentType — list them here too
76
+ // so the bundler can't tree-shake the dynamically-rendered preview classes.
77
+ ImageArtifactPreviewComponent,
78
+ VideoArtifactPreviewComponent,
79
+ AudioArtifactPreviewComponent,
65
80
  ];
81
+ // Registration-time guard: every registered artifact-viewer plugin must expose at least one of
82
+ // componentType / previewComponentType. `componentType` is required by the interface (so this is
83
+ // trivially satisfied today); the guard protects against future loosening of that invariant.
84
+ ArtifactsModule.warnOnPluginsWithoutRenderTarget();
66
85
  // PERF: Eagerly start downloading React, ReactDOM, and Babel from CDN in the background.
67
86
  // By the time a user opens an interactive component artifact, the scripts will already
68
87
  // be cached. The adapter.preload() is non-blocking and deduplicates with initialize().
69
88
  this.adapter.preload();
70
89
  }
90
+ /**
91
+ * Logs a warning for any registered artifact-viewer plugin that has NO render target at all —
92
+ * i.e. neither an implicit full viewer (the registered SubClass itself, which is the
93
+ * `componentType`) nor an explicit `previewComponentType`. Today every registration is an
94
+ * Angular component class, so the SubClass is always present and this never fires; the guard
95
+ * exists to catch regressions if the render-target invariant is ever loosened.
96
+ */
97
+ static warnOnPluginsWithoutRenderTarget() {
98
+ const registrations = MJGlobal.Instance.ClassFactory.GetAllRegistrations(BaseArtifactViewerPluginComponent);
99
+ for (const reg of registrations) {
100
+ const subClass = reg.SubClass;
101
+ const hasFullViewer = !!subClass; // the registered class IS the componentType
102
+ // Read the STATIC preview contract off the constructor — never instantiate (these are Angular
103
+ // components with DI constructors; a bare `new` outside an injection context throws).
104
+ const hasPreview = !!subClass?.PreviewComponentType;
105
+ if (!hasFullViewer && !hasPreview) {
106
+ console.warn(`ArtifactsModule: viewer plugin "${reg.Key}" has neither a componentType nor a previewComponentType — it can render nothing.`);
107
+ }
108
+ }
109
+ }
71
110
  static ɵfac = function ArtifactsModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactsModule)(i0.ɵɵinject(i1.AngularAdapterService)); };
72
111
  static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: ArtifactsModule });
73
112
  static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
@@ -110,6 +149,12 @@ export class ArtifactsModule {
110
149
  XlsxArtifactViewerComponent,
111
150
  DocxArtifactViewerComponent,
112
151
  ImageArtifactViewerComponent,
152
+ VideoArtifactViewerComponent,
153
+ AudioArtifactViewerComponent,
154
+ // Inline preview components
155
+ ImageArtifactPreviewComponent,
156
+ VideoArtifactPreviewComponent,
157
+ AudioArtifactPreviewComponent,
113
158
  ],
114
159
  imports: [
115
160
  CommonModule,
@@ -146,6 +191,12 @@ export class ArtifactsModule {
146
191
  XlsxArtifactViewerComponent,
147
192
  DocxArtifactViewerComponent,
148
193
  ImageArtifactViewerComponent,
194
+ VideoArtifactViewerComponent,
195
+ AudioArtifactViewerComponent,
196
+ // Inline preview components
197
+ ImageArtifactPreviewComponent,
198
+ VideoArtifactPreviewComponent,
199
+ AudioArtifactPreviewComponent,
149
200
  ],
150
201
  providers: [
151
202
  // Plugins are registered via @RegisterClass decorator on component classes, no providers needed
@@ -175,7 +226,13 @@ export class ArtifactsModule {
175
226
  PdfArtifactViewerComponent,
176
227
  XlsxArtifactViewerComponent,
177
228
  DocxArtifactViewerComponent,
178
- ImageArtifactViewerComponent], imports: [CommonModule,
229
+ ImageArtifactViewerComponent,
230
+ VideoArtifactViewerComponent,
231
+ AudioArtifactViewerComponent,
232
+ // Inline preview components
233
+ ImageArtifactPreviewComponent,
234
+ VideoArtifactPreviewComponent,
235
+ AudioArtifactPreviewComponent], imports: [CommonModule,
179
236
  FormsModule,
180
237
  MarkdownModule,
181
238
  CodeEditorModule,
@@ -206,5 +263,11 @@ export class ArtifactsModule {
206
263
  PdfArtifactViewerComponent,
207
264
  XlsxArtifactViewerComponent,
208
265
  DocxArtifactViewerComponent,
209
- ImageArtifactViewerComponent] }); })();
266
+ ImageArtifactViewerComponent,
267
+ VideoArtifactViewerComponent,
268
+ AudioArtifactViewerComponent,
269
+ // Inline preview components
270
+ ImageArtifactPreviewComponent,
271
+ VideoArtifactPreviewComponent,
272
+ AudioArtifactPreviewComponent] }); })();
210
273
  //# sourceMappingURL=artifacts.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.module.js","sourceRoot":"","sources":["../../src/lib/artifacts.module.ts"],"names":[],"mappings":"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","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { AgGridModule } from 'ag-grid-angular';\n\n// Import MJ modules\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { MJReactModule, AngularAdapterService } from '@memberjunction/ng-react';\nimport { MJNotificationsModule } from '@memberjunction/ng-notifications';\nimport { QueryViewerModule } from '@memberjunction/ng-query-viewer';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { NgTreesModule } from '@memberjunction/ng-trees';\n// BaseFormsModule supplies `<mj-interactive-form>` for the form-aware\n// component-artifact viewer branch (componentRole === 'form').\nimport { BaseFormsModule } from '@memberjunction/ng-base-forms';\n\n// Import plugin components (note: base component is abstract and NOT declared)\nimport { JsonArtifactViewerComponent } from './components/plugins/json-artifact-viewer.component';\nimport { CodeArtifactViewerComponent } from './components/plugins/code-artifact-viewer.component';\nimport { MarkdownArtifactViewerComponent } from './components/plugins/markdown-artifact-viewer.component';\nimport { HtmlArtifactViewerComponent } from './components/plugins/html-artifact-viewer.component';\nimport { SvgArtifactViewerComponent } from './components/plugins/svg-artifact-viewer.component';\nimport { ComponentArtifactViewerComponent } from './components/plugins/component-artifact-viewer.component';\nimport { DataArtifactViewerComponent } from './components/plugins/data-artifact-viewer.component';\nimport { SaveQueryPanelComponent } from './components/plugins/save-query-dialog.component';\nimport { DataRequirementsViewerComponent } from './components/plugins/data-requirements-viewer/data-requirements-viewer.component';\nimport { ComponentFeedbackPanelComponent } from './components/plugins/component-feedback-panel/component-feedback-panel.component';\n\n// File viewer plugins\nimport { FileArtifactToolbarComponent } from './components/file-artifact-toolbar.component';\nimport { PdfArtifactViewerComponent } from './components/plugins/pdf-artifact-viewer.component';\nimport { XlsxArtifactViewerComponent } from './components/plugins/xlsx-artifact-viewer.component';\nimport { DocxArtifactViewerComponent } from './components/plugins/docx-artifact-viewer.component';\nimport { ImageArtifactViewerComponent } from './components/plugins/image-artifact-viewer.component';\n\n// Import artifact type plugin viewer component\nimport { ArtifactTypePluginViewerComponent } from './components/artifact-type-plugin-viewer.component';\nimport { ArtifactVersionHistoryComponent } from './components/artifact-version-history.component';\nimport { ArtifactViewerPanelComponent } from './components/artifact-viewer-panel.component';\nimport { ArtifactMessageCardComponent } from './components/artifact-message-card.component';\n\n/**\n * Module for artifact viewer plugin system.\n * Provides components for viewing different types of artifacts (JSON, Code, Markdown, HTML, SVG, Components).\n *\n * Plugins are automatically registered via @RegisterClass decorator and can be instantiated\n * using MJGlobal.Instance.ClassFactory.CreateInstance('PluginClassName').\n */\n@NgModule({\n declarations: [\n // Artifact type plugin viewer (loads appropriate plugin based on DriverClass)\n ArtifactTypePluginViewerComponent,\n\n // Artifact viewer UI components\n ArtifactViewerPanelComponent,\n ArtifactVersionHistoryComponent,\n ArtifactMessageCardComponent,\n\n // Plugin components\n JsonArtifactViewerComponent,\n CodeArtifactViewerComponent,\n MarkdownArtifactViewerComponent,\n HtmlArtifactViewerComponent,\n SvgArtifactViewerComponent,\n ComponentArtifactViewerComponent,\n DataArtifactViewerComponent,\n SaveQueryPanelComponent,\n\n // Custom tab components (used by plugins via dynamic component tabs)\n DataRequirementsViewerComponent,\n\n // File viewer toolbar and plugins\n FileArtifactToolbarComponent,\n PdfArtifactViewerComponent,\n XlsxArtifactViewerComponent,\n DocxArtifactViewerComponent,\n ImageArtifactViewerComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n MarkdownModule,\n CodeEditorModule,\n MJReactModule,\n MJNotificationsModule,\n QueryViewerModule,\n SharedGenericModule,\n NgTreesModule,\n BaseFormsModule,\n ComponentFeedbackPanelComponent,\n AgGridModule,\n ],\n exports: [\n // Export artifact type plugin viewer\n ArtifactTypePluginViewerComponent,\n\n // Export artifact viewer UI components\n ArtifactViewerPanelComponent,\n ArtifactVersionHistoryComponent,\n ArtifactMessageCardComponent,\n\n // Export plugin components\n JsonArtifactViewerComponent,\n CodeArtifactViewerComponent,\n MarkdownArtifactViewerComponent,\n HtmlArtifactViewerComponent,\n SvgArtifactViewerComponent,\n ComponentArtifactViewerComponent,\n DataArtifactViewerComponent,\n\n // File viewer toolbar and plugins\n FileArtifactToolbarComponent,\n PdfArtifactViewerComponent,\n XlsxArtifactViewerComponent,\n DocxArtifactViewerComponent,\n ImageArtifactViewerComponent,\n ],\n providers: [\n // Plugins are registered via @RegisterClass decorator on component classes, no providers needed\n ]\n})\nexport class ArtifactsModule {\n constructor(private adapter: AngularAdapterService) {\n // Ensure plugin components are registered on module load by referencing their classes\n // The @RegisterClass decorator on each component handles the actual registration with MJGlobal\n [\n JsonArtifactViewerComponent,\n CodeArtifactViewerComponent,\n MarkdownArtifactViewerComponent,\n HtmlArtifactViewerComponent,\n SvgArtifactViewerComponent,\n ComponentArtifactViewerComponent,\n DataArtifactViewerComponent,\n PdfArtifactViewerComponent,\n XlsxArtifactViewerComponent,\n DocxArtifactViewerComponent,\n ImageArtifactViewerComponent,\n ];\n\n // PERF: Eagerly start downloading React, ReactDOM, and Babel from CDN in the background.\n // By the time a user opens an interactive component artifact, the scripts will already\n // be cached. The adapter.preload() is non-blocking and deduplicates with initialize().\n this.adapter.preload();\n }\n}\n"]}
1
+ {"version":3,"file":"artifacts.module.js","sourceRoot":"","sources":["../../src/lib/artifacts.module.ts"],"names":[],"mappings":"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","sourcesContent":["import { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { AgGridModule } from 'ag-grid-angular';\n\n// Import MJ modules\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { MJReactModule, AngularAdapterService } from '@memberjunction/ng-react';\nimport { MJNotificationsModule } from '@memberjunction/ng-notifications';\nimport { QueryViewerModule } from '@memberjunction/ng-query-viewer';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { NgTreesModule } from '@memberjunction/ng-trees';\n// BaseFormsModule supplies `<mj-interactive-form>` for the form-aware\n// component-artifact viewer branch (componentRole === 'form').\nimport { BaseFormsModule } from '@memberjunction/ng-base-forms';\n\n// Import plugin components (note: base component is abstract and NOT declared)\nimport { JsonArtifactViewerComponent } from './components/plugins/json-artifact-viewer.component';\nimport { CodeArtifactViewerComponent } from './components/plugins/code-artifact-viewer.component';\nimport { MarkdownArtifactViewerComponent } from './components/plugins/markdown-artifact-viewer.component';\nimport { HtmlArtifactViewerComponent } from './components/plugins/html-artifact-viewer.component';\nimport { SvgArtifactViewerComponent } from './components/plugins/svg-artifact-viewer.component';\nimport { ComponentArtifactViewerComponent } from './components/plugins/component-artifact-viewer.component';\nimport { DataArtifactViewerComponent } from './components/plugins/data-artifact-viewer.component';\nimport { SaveQueryPanelComponent } from './components/plugins/save-query-dialog.component';\nimport { DataRequirementsViewerComponent } from './components/plugins/data-requirements-viewer/data-requirements-viewer.component';\nimport { ComponentFeedbackPanelComponent } from './components/plugins/component-feedback-panel/component-feedback-panel.component';\n\n// File viewer plugins\nimport { FileArtifactToolbarComponent } from './components/file-artifact-toolbar.component';\nimport { PdfArtifactViewerComponent } from './components/plugins/pdf-artifact-viewer.component';\nimport { XlsxArtifactViewerComponent } from './components/plugins/xlsx-artifact-viewer.component';\nimport { DocxArtifactViewerComponent } from './components/plugins/docx-artifact-viewer.component';\nimport { ImageArtifactViewerComponent } from './components/plugins/image-artifact-viewer.component';\nimport { VideoArtifactViewerComponent } from './components/plugins/video-artifact-viewer.component';\nimport { AudioArtifactViewerComponent } from './components/plugins/audio-artifact-viewer.component';\n\n// Inline preview components (lightweight, rendered inside conversation message cards)\nimport { ImageArtifactPreviewComponent } from './components/previews/image-artifact-preview.component';\nimport { VideoArtifactPreviewComponent } from './components/previews/video-artifact-preview.component';\nimport { AudioArtifactPreviewComponent } from './components/previews/audio-artifact-preview.component';\nimport { MJGlobal } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from './components/base-artifact-viewer.component';\nimport { IArtifactViewerPluginPreviewStatics } from './interfaces/artifact-viewer-plugin.interface';\n\n// Import artifact type plugin viewer component\nimport { ArtifactTypePluginViewerComponent } from './components/artifact-type-plugin-viewer.component';\nimport { ArtifactVersionHistoryComponent } from './components/artifact-version-history.component';\nimport { ArtifactViewerPanelComponent } from './components/artifact-viewer-panel.component';\nimport { ArtifactMessageCardComponent } from './components/artifact-message-card.component';\n\n/**\n * Module for artifact viewer plugin system.\n * Provides components for viewing different types of artifacts (JSON, Code, Markdown, HTML, SVG, Components).\n *\n * Plugins are automatically registered via @RegisterClass decorator and can be instantiated\n * using MJGlobal.Instance.ClassFactory.CreateInstance('PluginClassName').\n */\n@NgModule({\n declarations: [\n // Artifact type plugin viewer (loads appropriate plugin based on DriverClass)\n ArtifactTypePluginViewerComponent,\n\n // Artifact viewer UI components\n ArtifactViewerPanelComponent,\n ArtifactVersionHistoryComponent,\n ArtifactMessageCardComponent,\n\n // Plugin components\n JsonArtifactViewerComponent,\n CodeArtifactViewerComponent,\n MarkdownArtifactViewerComponent,\n HtmlArtifactViewerComponent,\n SvgArtifactViewerComponent,\n ComponentArtifactViewerComponent,\n DataArtifactViewerComponent,\n SaveQueryPanelComponent,\n\n // Custom tab components (used by plugins via dynamic component tabs)\n DataRequirementsViewerComponent,\n\n // File viewer toolbar and plugins\n FileArtifactToolbarComponent,\n PdfArtifactViewerComponent,\n XlsxArtifactViewerComponent,\n DocxArtifactViewerComponent,\n ImageArtifactViewerComponent,\n VideoArtifactViewerComponent,\n AudioArtifactViewerComponent,\n\n // Inline preview components\n ImageArtifactPreviewComponent,\n VideoArtifactPreviewComponent,\n AudioArtifactPreviewComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n MarkdownModule,\n CodeEditorModule,\n MJReactModule,\n MJNotificationsModule,\n QueryViewerModule,\n SharedGenericModule,\n NgTreesModule,\n BaseFormsModule,\n ComponentFeedbackPanelComponent,\n AgGridModule,\n ],\n exports: [\n // Export artifact type plugin viewer\n ArtifactTypePluginViewerComponent,\n\n // Export artifact viewer UI components\n ArtifactViewerPanelComponent,\n ArtifactVersionHistoryComponent,\n ArtifactMessageCardComponent,\n\n // Export plugin components\n JsonArtifactViewerComponent,\n CodeArtifactViewerComponent,\n MarkdownArtifactViewerComponent,\n HtmlArtifactViewerComponent,\n SvgArtifactViewerComponent,\n ComponentArtifactViewerComponent,\n DataArtifactViewerComponent,\n\n // File viewer toolbar and plugins\n FileArtifactToolbarComponent,\n PdfArtifactViewerComponent,\n XlsxArtifactViewerComponent,\n DocxArtifactViewerComponent,\n ImageArtifactViewerComponent,\n VideoArtifactViewerComponent,\n AudioArtifactViewerComponent,\n\n // Inline preview components\n ImageArtifactPreviewComponent,\n VideoArtifactPreviewComponent,\n AudioArtifactPreviewComponent,\n ],\n providers: [\n // Plugins are registered via @RegisterClass decorator on component classes, no providers needed\n ]\n})\nexport class ArtifactsModule {\n constructor(private adapter: AngularAdapterService) {\n // Ensure plugin components are registered on module load by referencing their classes\n // The @RegisterClass decorator on each component handles the actual registration with MJGlobal\n [\n JsonArtifactViewerComponent,\n CodeArtifactViewerComponent,\n MarkdownArtifactViewerComponent,\n HtmlArtifactViewerComponent,\n SvgArtifactViewerComponent,\n ComponentArtifactViewerComponent,\n DataArtifactViewerComponent,\n PdfArtifactViewerComponent,\n XlsxArtifactViewerComponent,\n DocxArtifactViewerComponent,\n ImageArtifactViewerComponent,\n VideoArtifactViewerComponent,\n AudioArtifactViewerComponent,\n // Preview components are referenced via plugins' previewComponentType — list them here too\n // so the bundler can't tree-shake the dynamically-rendered preview classes.\n ImageArtifactPreviewComponent,\n VideoArtifactPreviewComponent,\n AudioArtifactPreviewComponent,\n ];\n\n // Registration-time guard: every registered artifact-viewer plugin must expose at least one of\n // componentType / previewComponentType. `componentType` is required by the interface (so this is\n // trivially satisfied today); the guard protects against future loosening of that invariant.\n ArtifactsModule.warnOnPluginsWithoutRenderTarget();\n\n // PERF: Eagerly start downloading React, ReactDOM, and Babel from CDN in the background.\n // By the time a user opens an interactive component artifact, the scripts will already\n // be cached. The adapter.preload() is non-blocking and deduplicates with initialize().\n this.adapter.preload();\n }\n\n /**\n * Logs a warning for any registered artifact-viewer plugin that has NO render target at all —\n * i.e. neither an implicit full viewer (the registered SubClass itself, which is the\n * `componentType`) nor an explicit `previewComponentType`. Today every registration is an\n * Angular component class, so the SubClass is always present and this never fires; the guard\n * exists to catch regressions if the render-target invariant is ever loosened.\n */\n private static warnOnPluginsWithoutRenderTarget(): void {\n const registrations = MJGlobal.Instance.ClassFactory.GetAllRegistrations(BaseArtifactViewerPluginComponent);\n for (const reg of registrations) {\n const subClass = reg.SubClass as\n | (Type<BaseArtifactViewerPluginComponent> & IArtifactViewerPluginPreviewStatics)\n | undefined;\n const hasFullViewer = !!subClass; // the registered class IS the componentType\n // Read the STATIC preview contract off the constructor — never instantiate (these are Angular\n // components with DI constructors; a bare `new` outside an injection context throws).\n const hasPreview = !!subClass?.PreviewComponentType;\n if (!hasFullViewer && !hasPreview) {\n console.warn(\n `ArtifactsModule: viewer plugin \"${reg.Key}\" has neither a componentType nor a previewComponentType — it can render nothing.`,\n );\n }\n }\n }\n}\n"]}
@@ -1,8 +1,9 @@
1
- import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
1
+ import { EventEmitter, OnInit, OnDestroy, Type } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';
4
4
  import { UserInfo } from '@memberjunction/core';
5
5
  import { ArtifactIconService } from '../services/artifact-icon.service';
6
+ import { IArtifactPreviewComponent } from '../interfaces/artifact-viewer-plugin.interface';
6
7
  import * as i0 from "@angular/core";
7
8
  /**
8
9
  * Artifact message card component - displays a simple info bar for artifacts in conversation messages.
@@ -24,9 +25,24 @@ export declare class ArtifactMessageCardComponent extends BaseAngularComponent i
24
25
  _currentVersion: MJArtifactVersionEntity | null;
25
26
  loading: boolean;
26
27
  error: boolean;
28
+ /**
29
+ * Resolved inline-preview component for this artifact's type/contentType, or null when no plugin
30
+ * exposes a matching preview (the card then falls back to its existing info-bar box). Resolved
31
+ * SYNCHRONOUSLY up front (before the box renders) to avoid a flash / ExpressionChanged error.
32
+ */
33
+ previewComponentType: Type<IArtifactPreviewComponent> | null;
34
+ /** Inputs forwarded to the dynamically rendered preview component via *ngComponentOutlet. */
35
+ previewInputs: Record<string, unknown>;
27
36
  private destroy$;
37
+ private readonly previewResolver;
28
38
  constructor(artifactIconService: ArtifactIconService);
29
39
  ngOnInit(): Promise<void>;
40
+ /**
41
+ * Pick the inline-preview component for this artifact, INDEPENDENTLY of the full viewer.
42
+ * Type name comes from `artifact.Type`; content type from `artifactVersion.MimeType`.
43
+ * No match → previewComponentType stays null → existing info-bar box renders unchanged.
44
+ */
45
+ private resolvePreview;
30
46
  get artifactEntity(): MJArtifactEntity | null;
31
47
  get currentVersion(): MJArtifactVersionEntity | null;
32
48
  ngOnDestroy(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-message-card.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-message-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;AAExE;;;GAGG;AACH,qBA0Ka,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAerF,OAAO,CAAC,mBAAmB;IAd9B,UAAU,EAAG,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IACzC,eAAe;gBAA6B,MAAM;kBAAY,gBAAgB;kBAAY,uBAAuB;OAAK;IAEzH,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC1C,eAAe,EAAE,uBAAuB,GAAG,IAAI,CAAQ;IACvD,OAAO,UAAQ;IACf,KAAK,UAAS;IAErB,OAAO,CAAC,QAAQ,CAAuB;gBAEnB,mBAAmB,EAAE,mBAAmB;IAGtD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,IAAW,cAAc,IAAI,gBAAgB,GAAG,IAAI,CAEnD;IAED,IAAW,cAAc,IAAI,uBAAuB,GAAG,IAAI,CAE1D;IAED,WAAW,IAAI,IAAI;YAKL,YAAY;YAoCZ,kBAAkB;IAyBhC;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAK/B;IAED;;OAEG;IACH,IAAW,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAK7C;IAED,IAAW,cAAc,IAAI,OAAO,CAKnC;IAED;;;OAGG;IACI,eAAe,IAAI,MAAM;IAKzB,iBAAiB,IAAI,MAAM;IAa3B,YAAY,IAAI,IAAI;yCA1JhB,4BAA4B;2CAA5B,4BAA4B;CA+JxC"}
1
+ {"version":3,"file":"artifact-message-card.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-message-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAU,MAAM,eAAe,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;;AAE3F;;;GAGG;AACH,qBA0Oa,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IA0BrF,OAAO,CAAC,mBAAmB;IAzB9B,UAAU,EAAG,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IACzC,eAAe;gBAA6B,MAAM;kBAAY,gBAAgB;kBAAY,uBAAuB;OAAK;IAEzH,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC1C,eAAe,EAAE,uBAAuB,GAAG,IAAI,CAAQ;IACvD,OAAO,UAAQ;IACf,KAAK,UAAS;IAErB;;;;OAIG;IACI,oBAAoB,EAAE,IAAI,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAQ;IAE3E,6FAA6F;IACtF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAEnD,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;gBAEtD,mBAAmB,EAAE,mBAAmB;IAGtD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAe/B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAetB,IAAW,cAAc,IAAI,gBAAgB,GAAG,IAAI,CAEnD;IAED,IAAW,cAAc,IAAI,uBAAuB,GAAG,IAAI,CAE1D;IAED,WAAW,IAAI,IAAI;YAKL,YAAY;YAoCZ,kBAAkB;IAyBhC;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAK/B;IAED;;OAEG;IACH,IAAW,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAK7C;IAED,IAAW,cAAc,IAAI,OAAO,CAKnC;IAED;;;OAGG;IACI,eAAe,IAAI,MAAM;IAKzB,iBAAiB,IAAI,MAAM;IAa3B,YAAY,IAAI,IAAI;yCA3LhB,4BAA4B;2CAA5B,4BAA4B;CAgMxC"}
@@ -1,33 +1,72 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { RunView } from '@memberjunction/core';
4
4
  import { Subject } from 'rxjs';
5
+ import { ArtifactPreviewResolverService } from '../services/artifact-preview-resolver.service';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../services/artifact-icon.service";
7
8
  import * as i2 from "@angular/common";
8
9
  function ArtifactMessageCardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
9
10
  i0.ɵɵelementStart(0, "div", 1);
10
- i0.ɵɵelement(1, "div", 4)(2, "div", 5);
11
+ i0.ɵɵelement(1, "div", 3)(2, "div", 4);
11
12
  i0.ɵɵelementEnd();
12
13
  } }
13
14
  function ArtifactMessageCardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
14
15
  i0.ɵɵelementStart(0, "div", 2);
15
- i0.ɵɵelement(1, "i", 6);
16
+ i0.ɵɵelement(1, "i", 5);
16
17
  i0.ɵɵelementStart(2, "span");
17
18
  i0.ɵɵtext(3, "Failed to load artifact");
18
19
  i0.ɵɵelementEnd()();
19
20
  } }
20
- function ArtifactMessageCardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
21
+ function ArtifactMessageCardComponent_Conditional_3_Conditional_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
22
+ i0.ɵɵelementContainer(0);
23
+ } }
24
+ function ArtifactMessageCardComponent_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
21
25
  const _r1 = i0.ɵɵgetCurrentView();
22
- i0.ɵɵelementStart(0, "div", 7);
23
- i0.ɵɵlistener("click", function ArtifactMessageCardComponent_Conditional_3_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openFullView()); });
24
- i0.ɵɵelementStart(1, "div", 8);
25
- i0.ɵɵelement(2, "i", 9);
26
+ i0.ɵɵelementStart(0, "div", 8);
27
+ i0.ɵɵlistener("click", function ArtifactMessageCardComponent_Conditional_3_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFullView()); });
28
+ i0.ɵɵtemplate(1, ArtifactMessageCardComponent_Conditional_3_Conditional_0_ng_container_1_Template, 1, 0, "ng-container", 9);
29
+ i0.ɵɵelementStart(2, "div", 10);
30
+ i0.ɵɵelement(3, "i", 11);
31
+ i0.ɵɵelementStart(4, "span", 12);
32
+ i0.ɵɵtext(5);
33
+ i0.ɵɵelementEnd();
34
+ i0.ɵɵelementStart(6, "span", 13);
35
+ i0.ɵɵtext(7);
36
+ i0.ɵɵelementEnd();
37
+ i0.ɵɵelementStart(8, "span", 14);
38
+ i0.ɵɵtext(9);
39
+ i0.ɵɵelementEnd();
40
+ i0.ɵɵelementStart(10, "span", 15);
41
+ i0.ɵɵelement(11, "i", 16);
42
+ i0.ɵɵelementEnd()()();
43
+ } if (rf & 2) {
44
+ const ctx_r1 = i0.ɵɵnextContext(2);
45
+ i0.ɵɵproperty("title", ctx_r1.displayName);
46
+ i0.ɵɵadvance();
47
+ i0.ɵɵproperty("ngComponentOutlet", ctx_r1.previewComponentType)("ngComponentOutletInputs", ctx_r1.previewInputs);
48
+ i0.ɵɵadvance(2);
49
+ i0.ɵɵproperty("ngClass", ctx_r1.getArtifactIcon());
50
+ i0.ɵɵadvance(2);
51
+ i0.ɵɵtextInterpolate(ctx_r1.displayName);
52
+ i0.ɵɵadvance();
53
+ i0.ɵɵstyleProp("background", ctx_r1.getTypeBadgeColor());
54
+ i0.ɵɵadvance();
55
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.artifact.Type, " ");
56
+ i0.ɵɵadvance(2);
57
+ i0.ɵɵtextInterpolate1("v", ctx_r1.currentVersion.VersionNumber || 1);
58
+ } }
59
+ function ArtifactMessageCardComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
60
+ const _r3 = i0.ɵɵgetCurrentView();
61
+ i0.ɵɵelementStart(0, "div", 17);
62
+ i0.ɵɵlistener("click", function ArtifactMessageCardComponent_Conditional_3_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFullView()); });
63
+ i0.ɵɵelementStart(1, "div", 18);
64
+ i0.ɵɵelement(2, "i", 11);
26
65
  i0.ɵɵelementEnd();
27
- i0.ɵɵelementStart(3, "div", 10)(4, "span", 11);
66
+ i0.ɵɵelementStart(3, "div", 19)(4, "span", 12);
28
67
  i0.ɵɵtext(5);
29
68
  i0.ɵɵelementEnd();
30
- i0.ɵɵelementStart(6, "div", 12)(7, "span", 13);
69
+ i0.ɵɵelementStart(6, "div", 20)(7, "span", 13);
31
70
  i0.ɵɵtext(8);
32
71
  i0.ɵɵelementEnd();
33
72
  i0.ɵɵelementStart(9, "span", 14);
@@ -37,7 +76,7 @@ function ArtifactMessageCardComponent_Conditional_3_Template(rf, ctx) { if (rf &
37
76
  i0.ɵɵelement(12, "i", 16);
38
77
  i0.ɵɵelementEnd()();
39
78
  } if (rf & 2) {
40
- const ctx_r1 = i0.ɵɵnextContext();
79
+ const ctx_r1 = i0.ɵɵnextContext(2);
41
80
  i0.ɵɵadvance(2);
42
81
  i0.ɵɵproperty("ngClass", ctx_r1.getArtifactIcon());
43
82
  i0.ɵɵadvance(3);
@@ -49,6 +88,12 @@ function ArtifactMessageCardComponent_Conditional_3_Template(rf, ctx) { if (rf &
49
88
  i0.ɵɵadvance(2);
50
89
  i0.ɵɵtextInterpolate1("v", (ctx_r1.currentVersion == null ? null : ctx_r1.currentVersion.VersionNumber) || 1);
51
90
  } }
91
+ function ArtifactMessageCardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
92
+ i0.ɵɵconditionalCreate(0, ArtifactMessageCardComponent_Conditional_3_Conditional_0_Template, 12, 9, "div", 6)(1, ArtifactMessageCardComponent_Conditional_3_Conditional_1_Template, 13, 6, "div", 7);
93
+ } if (rf & 2) {
94
+ const ctx_r1 = i0.ɵɵnextContext();
95
+ i0.ɵɵconditional(ctx_r1.previewComponentType && ctx_r1.currentVersion ? 0 : 1);
96
+ } }
52
97
  /**
53
98
  * Artifact message card component - displays a simple info bar for artifacts in conversation messages.
54
99
  * Shows artifact icon, name, type badge, and version. Click to open full artifact viewer.
@@ -65,7 +110,16 @@ export class ArtifactMessageCardComponent extends BaseAngularComponent {
65
110
  _currentVersion = null;
66
111
  loading = true;
67
112
  error = false;
113
+ /**
114
+ * Resolved inline-preview component for this artifact's type/contentType, or null when no plugin
115
+ * exposes a matching preview (the card then falls back to its existing info-bar box). Resolved
116
+ * SYNCHRONOUSLY up front (before the box renders) to avoid a flash / ExpressionChanged error.
117
+ */
118
+ previewComponentType = null;
119
+ /** Inputs forwarded to the dynamically rendered preview component via *ngComponentOutlet. */
120
+ previewInputs = {};
68
121
  destroy$ = new Subject();
122
+ previewResolver = inject(ArtifactPreviewResolverService);
69
123
  constructor(artifactIconService) {
70
124
  super();
71
125
  this.artifactIconService = artifactIconService;
@@ -81,6 +135,24 @@ export class ArtifactMessageCardComponent extends BaseAngularComponent {
81
135
  // Otherwise load from database
82
136
  await this.loadArtifact();
83
137
  }
138
+ // Resolve the inline preview once artifact + version are known. Synchronous so the correct
139
+ // branch (preview vs. box) is decided before the template renders this state.
140
+ this.resolvePreview();
141
+ }
142
+ /**
143
+ * Pick the inline-preview component for this artifact, INDEPENDENTLY of the full viewer.
144
+ * Type name comes from `artifact.Type`; content type from `artifactVersion.MimeType`.
145
+ * No match → previewComponentType stays null → existing info-bar box renders unchanged.
146
+ */
147
+ resolvePreview() {
148
+ if (!this._artifact || !this._currentVersion) {
149
+ this.previewComponentType = null;
150
+ return;
151
+ }
152
+ this.previewComponentType = this.previewResolver.resolvePreviewComponent(this._artifact.Type, this._currentVersion.MimeType);
153
+ if (this.previewComponentType) {
154
+ this.previewInputs = { artifactVersion: this._currentVersion };
155
+ }
84
156
  }
85
157
  // Getters to access the internal properties
86
158
  get artifactEntity() {
@@ -204,15 +276,15 @@ export class ArtifactMessageCardComponent extends BaseAngularComponent {
204
276
  }
205
277
  }
206
278
  static ɵfac = function ArtifactMessageCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactMessageCardComponent)(i0.ɵɵdirectiveInject(i1.ArtifactIconService)); };
207
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactMessageCardComponent, selectors: [["mj-artifact-message-card"]], inputs: { artifactId: "artifactId", versionNumber: "versionNumber", currentUser: "currentUser", artifact: "artifact", artifactVersion: "artifactVersion" }, outputs: { actionPerformed: "actionPerformed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 5, consts: [[1, "artifact-message-card"], [1, "artifact-skeleton"], [1, "artifact-error"], [1, "artifact-info-bar"], [1, "skeleton-icon"], [1, "skeleton-text"], [1, "fa-solid", "fa-exclamation-circle"], [1, "artifact-info-bar", 3, "click"], [1, "artifact-icon"], [1, "fa-solid", 3, "ngClass"], [1, "artifact-info"], [1, "artifact-name"], [1, "artifact-meta"], [1, "artifact-type-badge"], [1, "artifact-version"], [1, "open-icon"], [1, "fa-solid", "fa-arrow-up-right-from-square"]], template: function ArtifactMessageCardComponent_Template(rf, ctx) { if (rf & 1) {
279
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactMessageCardComponent, selectors: [["mj-artifact-message-card"]], inputs: { artifactId: "artifactId", versionNumber: "versionNumber", currentUser: "currentUser", artifact: "artifact", artifactVersion: "artifactVersion" }, outputs: { actionPerformed: "actionPerformed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 5, consts: [[1, "artifact-message-card"], [1, "artifact-skeleton"], [1, "artifact-error"], [1, "skeleton-icon"], [1, "skeleton-text"], [1, "fa-solid", "fa-exclamation-circle"], [1, "artifact-preview-wrapper", 3, "title"], [1, "artifact-info-bar"], [1, "artifact-preview-wrapper", 3, "click", "title"], [4, "ngComponentOutlet", "ngComponentOutletInputs"], [1, "artifact-preview-caption"], [1, "fa-solid", 3, "ngClass"], [1, "artifact-name"], [1, "artifact-type-badge"], [1, "artifact-version"], [1, "open-icon"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "artifact-info-bar", 3, "click"], [1, "artifact-icon"], [1, "artifact-info"], [1, "artifact-meta"]], template: function ArtifactMessageCardComponent_Template(rf, ctx) { if (rf & 1) {
208
280
  i0.ɵɵelementStart(0, "div", 0);
209
- i0.ɵɵconditionalCreate(1, ArtifactMessageCardComponent_Conditional_1_Template, 3, 0, "div", 1)(2, ArtifactMessageCardComponent_Conditional_2_Template, 4, 0, "div", 2)(3, ArtifactMessageCardComponent_Conditional_3_Template, 13, 6, "div", 3);
281
+ i0.ɵɵconditionalCreate(1, ArtifactMessageCardComponent_Conditional_1_Template, 3, 0, "div", 1)(2, ArtifactMessageCardComponent_Conditional_2_Template, 4, 0, "div", 2)(3, ArtifactMessageCardComponent_Conditional_3_Template, 2, 1);
210
282
  i0.ɵɵelementEnd();
211
283
  } if (rf & 2) {
212
284
  i0.ɵɵclassProp("loading", ctx.loading)("error", ctx.error);
213
285
  i0.ɵɵadvance();
214
286
  i0.ɵɵconditional(ctx.loading ? 1 : ctx.error ? 2 : ctx.artifact ? 3 : -1);
215
- } }, dependencies: [i2.NgClass], styles: [".artifact-message-card[_ngcontent-%COMP%] {\n margin: 12px 0;\n }\n\n .artifact-skeleton[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .skeleton-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 6px;\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-text[_ngcontent-%COMP%] {\n flex: 1;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 4px;\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .artifact-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .artifact-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .artifact-info-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-info-bar[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 16px;\n }\n\n .artifact-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .artifact-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .artifact-type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.5px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .artifact-version[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .open-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: color 200ms ease;\n }\n\n .artifact-info-bar[_ngcontent-%COMP%]:hover .open-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }"] });
287
+ } }, dependencies: [i2.NgClass, i2.NgComponentOutlet], styles: [".artifact-message-card[_ngcontent-%COMP%] {\n margin: 12px 0;\n }\n\n .artifact-skeleton[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .skeleton-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 6px;\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-text[_ngcontent-%COMP%] {\n flex: 1;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 4px;\n animation: _ngcontent-%COMP%_pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .artifact-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .artifact-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .artifact-info-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-info-bar[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 16px;\n }\n\n .artifact-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .artifact-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .artifact-type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.5px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .artifact-version[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .open-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: color 200ms ease;\n }\n\n .artifact-info-bar[_ngcontent-%COMP%]:hover .open-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .artifact-preview-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-preview-wrapper[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-preview-caption[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .artifact-preview-caption[_ngcontent-%COMP%] .artifact-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-preview-caption[_ngcontent-%COMP%] .open-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n transition: color 200ms ease;\n }\n\n .artifact-preview-wrapper[_ngcontent-%COMP%]:hover .artifact-preview-caption[_ngcontent-%COMP%] .open-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }"] });
216
288
  }
217
289
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ArtifactMessageCardComponent, [{
218
290
  type: Component,
@@ -229,26 +301,45 @@ export class ArtifactMessageCardComponent extends BaseAngularComponent {
229
301
  <span>Failed to load artifact</span>
230
302
  </div>
231
303
  } @else if (artifact) {
232
- <div class="artifact-info-bar" (click)="openFullView()">
233
- <div class="artifact-icon">
234
- <i class="fa-solid" [ngClass]="getArtifactIcon()"></i>
235
- </div>
236
- <div class="artifact-info">
237
- <span class="artifact-name">{{ displayName }}</span>
238
- <div class="artifact-meta">
304
+ @if (previewComponentType && currentVersion) {
305
+ <!-- Inline preview: a clickable wrapper still opens the full right-side viewer.
306
+ Media controls inside the preview (video/audio) stop their own click propagation. -->
307
+ <div class="artifact-preview-wrapper" (click)="openFullView()" [title]="displayName">
308
+ <ng-container
309
+ *ngComponentOutlet="previewComponentType; inputs: previewInputs"
310
+ ></ng-container>
311
+ <div class="artifact-preview-caption">
312
+ <i class="fa-solid" [ngClass]="getArtifactIcon()"></i>
313
+ <span class="artifact-name">{{ displayName }}</span>
239
314
  <span class="artifact-type-badge" [style.background]="getTypeBadgeColor()">
240
315
  {{ artifact.Type }}
241
316
  </span>
242
- <span class="artifact-version">v{{ currentVersion?.VersionNumber || 1 }}</span>
317
+ <span class="artifact-version">v{{ currentVersion.VersionNumber || 1 }}</span>
318
+ <span class="open-icon"><i class="fa-solid fa-arrow-up-right-from-square"></i></span>
243
319
  </div>
244
320
  </div>
245
- <div class="open-icon">
246
- <i class="fa-solid fa-arrow-up-right-from-square"></i>
321
+ } @else {
322
+ <div class="artifact-info-bar" (click)="openFullView()">
323
+ <div class="artifact-icon">
324
+ <i class="fa-solid" [ngClass]="getArtifactIcon()"></i>
325
+ </div>
326
+ <div class="artifact-info">
327
+ <span class="artifact-name">{{ displayName }}</span>
328
+ <div class="artifact-meta">
329
+ <span class="artifact-type-badge" [style.background]="getTypeBadgeColor()">
330
+ {{ artifact.Type }}
331
+ </span>
332
+ <span class="artifact-version">v{{ currentVersion?.VersionNumber || 1 }}</span>
333
+ </div>
334
+ </div>
335
+ <div class="open-icon">
336
+ <i class="fa-solid fa-arrow-up-right-from-square"></i>
337
+ </div>
247
338
  </div>
248
- </div>
339
+ }
249
340
  }
250
341
  </div>
251
- `, styles: ["\n .artifact-message-card {\n margin: 12px 0;\n }\n\n .artifact-skeleton {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .skeleton-icon {\n width: 32px;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 6px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-text {\n flex: 1;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 4px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .artifact-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .artifact-error i {\n font-size: 16px;\n }\n\n .artifact-info-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-info-bar:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 16px;\n }\n\n .artifact-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .artifact-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 8px;\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.5px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .artifact-version {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .open-icon {\n flex-shrink: 0;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: color 200ms ease;\n }\n\n .artifact-info-bar:hover .open-icon {\n color: var(--mj-brand-primary);\n }\n "] }]
342
+ `, styles: ["\n .artifact-message-card {\n margin: 12px 0;\n }\n\n .artifact-skeleton {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .skeleton-icon {\n width: 32px;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 6px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-text {\n flex: 1;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 4px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .artifact-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .artifact-error i {\n font-size: 16px;\n }\n\n .artifact-info-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-info-bar:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 16px;\n }\n\n .artifact-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .artifact-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 8px;\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.5px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .artifact-version {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .open-icon {\n flex-shrink: 0;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: color 200ms ease;\n }\n\n .artifact-info-bar:hover .open-icon {\n color: var(--mj-brand-primary);\n }\n\n .artifact-preview-wrapper {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-preview-wrapper:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-preview-caption {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .artifact-preview-caption .artifact-name {\n flex: 1;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-preview-caption .open-icon {\n color: var(--mj-text-disabled);\n transition: color 200ms ease;\n }\n\n .artifact-preview-wrapper:hover .artifact-preview-caption .open-icon {\n color: var(--mj-brand-primary);\n }\n "] }]
252
343
  }], () => [{ type: i1.ArtifactIconService }], { artifactId: [{
253
344
  type: Input
254
345
  }], versionNumber: [{
@@ -262,5 +353,5 @@ export class ArtifactMessageCardComponent extends BaseAngularComponent {
262
353
  }], actionPerformed: [{
263
354
  type: Output
264
355
  }] }); })();
265
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactMessageCardComponent, { className: "ArtifactMessageCardComponent", filePath: "src/lib/components/artifact-message-card.component.ts", lineNumber: 183 }); })();
356
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactMessageCardComponent, { className: "ArtifactMessageCardComponent", filePath: "src/lib/components/artifact-message-card.component.ts", lineNumber: 248 }); })();
266
357
  //# sourceMappingURL=artifact-message-card.component.js.map