@memberjunction/ng-skip-chat 2.48.0 → 2.49.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 (31) hide show
  1. package/dist/lib/artifacts/skip-artifact-viewer.component.js +254 -270
  2. package/dist/lib/artifacts/skip-artifact-viewer.component.js.map +1 -1
  3. package/dist/lib/artifacts/skip-artifacts-counter.component.js +82 -90
  4. package/dist/lib/artifacts/skip-artifacts-counter.component.js.map +1 -1
  5. package/dist/lib/drill-down-info.js +4 -3
  6. package/dist/lib/drill-down-info.js.map +1 -1
  7. package/dist/lib/dynamic-report/base-report.js +147 -164
  8. package/dist/lib/dynamic-report/base-report.js.map +1 -1
  9. package/dist/lib/dynamic-report/dynamic-chart.js +77 -86
  10. package/dist/lib/dynamic-report/dynamic-chart.js.map +1 -1
  11. package/dist/lib/dynamic-report/dynamic-grid.js +80 -93
  12. package/dist/lib/dynamic-report/dynamic-grid.js.map +1 -1
  13. package/dist/lib/dynamic-report/dynamic-ui-component.js +173 -188
  14. package/dist/lib/dynamic-report/dynamic-ui-component.js.map +1 -1
  15. package/dist/lib/dynamic-report/linear-report.js +16 -26
  16. package/dist/lib/dynamic-report/linear-report.js.map +1 -1
  17. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +28 -28
  18. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
  19. package/dist/lib/dynamic-report/skip-react-component-host.js +203 -212
  20. package/dist/lib/dynamic-report/skip-react-component-host.js.map +1 -1
  21. package/dist/lib/module.js +22 -22
  22. package/dist/lib/module.js.map +1 -1
  23. package/dist/lib/report-cache.js +2 -5
  24. package/dist/lib/report-cache.js.map +1 -1
  25. package/dist/lib/skip-chat/skip-chat.component.js +1052 -1087
  26. package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
  27. package/dist/lib/skip-single-message/skip-single-message.component.js +251 -259
  28. package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
  29. package/dist/lib/split-panel/skip-split-panel.component.js +52 -51
  30. package/dist/lib/split-panel/skip-split-panel.component.js.map +1 -1
  31. package/package.json +13 -13
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { Component, EventEmitter, Input, Output, ViewChildren, HostListener } from '@angular/core';
11
2
  import { CompositeKey, LogError, Metadata, RunQuery, RunView } from '@memberjunction/core';
12
3
  import { SkipReactComponentHost } from './skip-react-component-host';
@@ -546,67 +537,46 @@ function SkipDynamicUIComponentComponent_Conditional_1_Template(rf, ctx) { if (r
546
537
  i0.ɵɵconditional(ctx_r1.currentError ? 26 : -1);
547
538
  } }
548
539
  export class SkipDynamicUIComponentComponent {
540
+ sanitizer;
541
+ cdr;
542
+ ngZone;
543
+ UIComponentCode = null;
544
+ ComponentObjectName = null;
545
+ ShowPrintReport = true;
546
+ ShowReportOptionsToggle = true;
547
+ ShowCreateReportButton = false;
548
+ matchingReportID = null;
549
+ DrillDownEvent = new EventEmitter();
550
+ CreateReportRequested = new EventEmitter();
551
+ htmlContainers;
552
+ // Properties for handling multiple report options
553
+ reportOptions = [];
554
+ selectedReportOptionIndex = 0;
555
+ currentError = null;
556
+ isCreatingReport = false;
557
+ // Toggle states for showing/hiding component details
558
+ showFunctionalRequirements = false;
559
+ showDataRequirements = false;
560
+ showTechnicalDesign = false;
561
+ showCode = false;
562
+ // Details panel height for resizing
563
+ detailsPanelHeight = '300px';
564
+ isResizing = false;
565
+ startY = 0;
566
+ startHeight = 0;
567
+ // Cache for React component hosts - lazy loaded per option
568
+ reactHostCache = new Map();
569
+ currentHostIndex = null;
570
+ callbacks = {
571
+ RefreshData: () => this.handleRefreshData(),
572
+ OpenEntityRecord: (entityName, key) => this.handleOpenEntityRecord(entityName, key),
573
+ UpdateUserState: (userState) => this.handleUpdateUserState(userState),
574
+ NotifyEvent: (eventName, eventData) => this.handleNotifyEvent(eventName, eventData)
575
+ };
549
576
  constructor(sanitizer, cdr, ngZone) {
550
577
  this.sanitizer = sanitizer;
551
578
  this.cdr = cdr;
552
579
  this.ngZone = ngZone;
553
- this.UIComponentCode = null;
554
- this.ComponentObjectName = null;
555
- this.ShowPrintReport = true;
556
- this.ShowReportOptionsToggle = true;
557
- this.ShowCreateReportButton = false;
558
- this.matchingReportID = null;
559
- this.DrillDownEvent = new EventEmitter();
560
- this.CreateReportRequested = new EventEmitter();
561
- // Properties for handling multiple report options
562
- this.reportOptions = [];
563
- this.selectedReportOptionIndex = 0;
564
- this.currentError = null;
565
- this.isCreatingReport = false;
566
- // Toggle states for showing/hiding component details
567
- this.showFunctionalRequirements = false;
568
- this.showDataRequirements = false;
569
- this.showTechnicalDesign = false;
570
- this.showCode = false;
571
- // Details panel height for resizing
572
- this.detailsPanelHeight = '300px';
573
- this.isResizing = false;
574
- this.startY = 0;
575
- this.startHeight = 0;
576
- // Cache for React component hosts - lazy loaded per option
577
- this.reactHostCache = new Map();
578
- this.currentHostIndex = null;
579
- this.callbacks = {
580
- RefreshData: () => this.handleRefreshData(),
581
- OpenEntityRecord: (entityName, key) => this.handleOpenEntityRecord(entityName, key),
582
- UpdateUserState: (userState) => this.handleUpdateUserState(userState),
583
- NotifyEvent: (eventName, eventData) => this.handleNotifyEvent(eventName, eventData)
584
- };
585
- /**
586
- * Handle resize movement
587
- */
588
- this.onResize = (event) => {
589
- if (!this.isResizing)
590
- return;
591
- const currentY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;
592
- const deltaY = currentY - this.startY;
593
- const newHeight = Math.max(100, Math.min(600, this.startHeight + deltaY));
594
- // Run inside Angular to update the binding
595
- this.ngZone.run(() => {
596
- this.detailsPanelHeight = `${newHeight}px`;
597
- this.cdr.detectChanges();
598
- });
599
- };
600
- /**
601
- * Stop resizing
602
- */
603
- this.stopResize = () => {
604
- this.isResizing = false;
605
- document.removeEventListener('mousemove', this.onResize);
606
- document.removeEventListener('mouseup', this.stopResize);
607
- document.removeEventListener('touchmove', this.onResize);
608
- document.removeEventListener('touchend', this.stopResize);
609
- };
610
580
  }
611
581
  /**
612
582
  * Gets the currently selected report option
@@ -631,7 +601,7 @@ export class SkipDynamicUIComponentComponent {
631
601
  */
632
602
  isTopRanked(index) {
633
603
  const option = this.reportOptions[index];
634
- return (option === null || option === void 0 ? void 0 : option.AIRank) === 1;
604
+ return option?.AIRank === 1;
635
605
  }
636
606
  /**
637
607
  * Handles when the user selects a tab
@@ -675,23 +645,21 @@ export class SkipDynamicUIComponentComponent {
675
645
  this.currentError = {
676
646
  type: 'Component Assembly Error',
677
647
  message: 'Failed to assemble the component code. This usually happens when sub-components are missing or placeholders cannot be resolved.',
678
- technicalDetails: (error === null || error === void 0 ? void 0 : error.toString()) || 'Unknown error during component assembly'
648
+ technicalDetails: error?.toString() || 'Unknown error during component assembly'
679
649
  };
680
650
  // Clear the UI component code to prevent partial rendering
681
651
  this.UIComponentCode = null;
682
652
  this.ComponentObjectName = null;
683
653
  }
684
654
  }
685
- PrintReport() {
686
- return __awaiter(this, void 0, void 0, function* () {
687
- const currentHost = this.getCurrentReactHost();
688
- if (currentHost) {
689
- currentHost.print();
690
- }
691
- else {
692
- window.print();
693
- }
694
- });
655
+ async PrintReport() {
656
+ const currentHost = this.getCurrentReactHost();
657
+ if (currentHost) {
658
+ currentHost.print();
659
+ }
660
+ else {
661
+ window.print();
662
+ }
695
663
  }
696
664
  /**
697
665
  * Copy error details to clipboard for user to send back to Skip
@@ -716,18 +684,17 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
716
684
  * Get the container element for a specific option index
717
685
  */
718
686
  getContainerForOption(optionIndex) {
719
- var _a;
720
687
  if (!this.htmlContainers || this.htmlContainers.length === 0) {
721
688
  return null;
722
689
  }
723
690
  if (this.reportOptions.length === 1) {
724
691
  // Single option - use the only container
725
- return ((_a = this.htmlContainers.first) === null || _a === void 0 ? void 0 : _a.nativeElement) || null;
692
+ return this.htmlContainers.first?.nativeElement || null;
726
693
  }
727
694
  else {
728
695
  // Multiple options - find container by data-tab-index
729
696
  const container = this.htmlContainers.find(ref => ref.nativeElement.getAttribute('data-tab-index') === optionIndex.toString());
730
- return (container === null || container === void 0 ? void 0 : container.nativeElement) || null;
697
+ return container?.nativeElement || null;
731
698
  }
732
699
  }
733
700
  /**
@@ -883,6 +850,31 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
883
850
  document.addEventListener('touchend', this.stopResize);
884
851
  });
885
852
  }
853
+ /**
854
+ * Handle resize movement
855
+ */
856
+ onResize = (event) => {
857
+ if (!this.isResizing)
858
+ return;
859
+ const currentY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;
860
+ const deltaY = currentY - this.startY;
861
+ const newHeight = Math.max(100, Math.min(600, this.startHeight + deltaY));
862
+ // Run inside Angular to update the binding
863
+ this.ngZone.run(() => {
864
+ this.detailsPanelHeight = `${newHeight}px`;
865
+ this.cdr.detectChanges();
866
+ });
867
+ };
868
+ /**
869
+ * Stop resizing
870
+ */
871
+ stopResize = () => {
872
+ this.isResizing = false;
873
+ document.removeEventListener('mousemove', this.onResize);
874
+ document.removeEventListener('mouseup', this.stopResize);
875
+ document.removeEventListener('touchmove', this.onResize);
876
+ document.removeEventListener('touchend', this.stopResize);
877
+ };
886
878
  onWindowResize() {
887
879
  // Ensure the details panel height remains valid on window resize
888
880
  const currentHeight = parseInt(this.detailsPanelHeight, 10);
@@ -938,6 +930,7 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
938
930
  }
939
931
  return null;
940
932
  }
933
+ _skipData;
941
934
  get SkipData() {
942
935
  return this._skipData ? this._skipData : undefined;
943
936
  }
@@ -972,9 +965,8 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
972
965
  if (data.componentOptions && data.componentOptions.length > 0) {
973
966
  // Sort by AIRank (lower numbers = better ranking)
974
967
  this.reportOptions = [...data.componentOptions].sort((a, b) => {
975
- var _a, _b;
976
- const rankA = (_a = a.AIRank) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER;
977
- const rankB = (_b = b.AIRank) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER;
968
+ const rankA = a.AIRank ?? Number.MAX_SAFE_INTEGER;
969
+ const rankB = b.AIRank ?? Number.MAX_SAFE_INTEGER;
978
970
  return rankA - rankB;
979
971
  });
980
972
  // Select the best option (first in sorted array)
@@ -987,81 +979,77 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
987
979
  /**
988
980
  * Create a React host for a specific option index
989
981
  */
990
- createReactHostForOption(optionIndex) {
991
- return __awaiter(this, void 0, void 0, function* () {
992
- var _a, _b, _c;
993
- const option = this.reportOptions[optionIndex];
994
- if (!option)
995
- return;
996
- const container = this.getContainerForOption(optionIndex);
997
- if (!container)
998
- return;
999
- try {
1000
- const componentCode = BuildSkipComponentCompleteCode(option.option);
1001
- // Check for unresolved placeholders in the code
1002
- if (componentCode.includes('<<') && componentCode.includes('>>')) {
1003
- const placeholderMatch = componentCode.match(/<<([^>]+)>>/);
1004
- const placeholderName = placeholderMatch ? placeholderMatch[1] : 'Unknown';
1005
- this.currentError = {
1006
- type: 'Incomplete Component',
1007
- message: `This component option contains unresolved placeholders (${placeholderName}). The component generation was not completed successfully.`,
1008
- technicalDetails: `The component code contains placeholder tokens that should have been replaced with actual implementations. This typically happens when the AI generation process was interrupted or encountered an error.\n\nPlaceholder found: <<${placeholderName}>>`
1009
- };
1010
- return;
1011
- }
1012
- const md = new Metadata();
1013
- const data = this.getFlattenedDataContext();
1014
- // Create the React component host directly in the tab container
1015
- const reactHost = new SkipReactComponentHost({
1016
- componentCode: componentCode,
1017
- container: container,
1018
- callbacks: this.callbacks,
1019
- data: data,
1020
- utilities: this.SetupUtilities(md),
1021
- styles: this.SetupStyles()
1022
- });
1023
- // Initialize and render the React component
1024
- yield reactHost.initialize();
1025
- // Cache the host
1026
- this.reactHostCache.set(optionIndex, reactHost);
1027
- // Update current index if this is the selected option
1028
- if (optionIndex === this.selectedReportOptionIndex) {
1029
- this.currentHostIndex = optionIndex;
1030
- }
1031
- }
1032
- catch (e) {
1033
- console.error('Error creating React host:', e);
1034
- // Determine the type of error and create a user-friendly message
1035
- let errorType = 'Component Initialization Error';
1036
- let errorMessage = 'Failed to initialize the React component.';
1037
- let technicalDetails = e.toString();
1038
- if ((_a = e.message) === null || _a === void 0 ? void 0 : _a.includes('JSX transpilation failed')) {
1039
- errorType = 'Code Compilation Error';
1040
- errorMessage = 'The component code could not be compiled. This usually indicates a syntax error in the generated code.';
1041
- technicalDetails = e.message;
1042
- }
1043
- else if ((_b = e.message) === null || _b === void 0 ? void 0 : _b.includes('is not defined')) {
1044
- errorType = 'Missing Dependency';
1045
- errorMessage = 'The component is trying to use a feature or library that is not available.';
1046
- }
1047
- else if ((_c = e.message) === null || _c === void 0 ? void 0 : _c.includes('Cannot read properties')) {
1048
- errorType = 'Property Access Error';
1049
- errorMessage = 'The component is trying to access data that doesn\'t exist. This often happens when property names don\'t match the data structure.';
1050
- }
982
+ async createReactHostForOption(optionIndex) {
983
+ const option = this.reportOptions[optionIndex];
984
+ if (!option)
985
+ return;
986
+ const container = this.getContainerForOption(optionIndex);
987
+ if (!container)
988
+ return;
989
+ try {
990
+ const componentCode = BuildSkipComponentCompleteCode(option.option);
991
+ // Check for unresolved placeholders in the code
992
+ if (componentCode.includes('<<') && componentCode.includes('>>')) {
993
+ const placeholderMatch = componentCode.match(/<<([^>]+)>>/);
994
+ const placeholderName = placeholderMatch ? placeholderMatch[1] : 'Unknown';
1051
995
  this.currentError = {
1052
- type: errorType,
1053
- message: errorMessage,
1054
- technicalDetails: technicalDetails + '\n\nComponent Option: ' + (optionIndex + 1) + '\nComponent Name: ' + option.option.componentName
996
+ type: 'Incomplete Component',
997
+ message: `This component option contains unresolved placeholders (${placeholderName}). The component generation was not completed successfully.`,
998
+ technicalDetails: `The component code contains placeholder tokens that should have been replaced with actual implementations. This typically happens when the AI generation process was interrupted or encountered an error.\n\nPlaceholder found: <<${placeholderName}>>`
1055
999
  };
1056
- LogError(e);
1000
+ return;
1057
1001
  }
1058
- });
1002
+ const md = new Metadata();
1003
+ const data = this.getFlattenedDataContext();
1004
+ // Create the React component host directly in the tab container
1005
+ const reactHost = new SkipReactComponentHost({
1006
+ componentCode: componentCode,
1007
+ container: container,
1008
+ callbacks: this.callbacks,
1009
+ data: data,
1010
+ utilities: this.SetupUtilities(md),
1011
+ styles: this.SetupStyles()
1012
+ });
1013
+ // Initialize and render the React component
1014
+ await reactHost.initialize();
1015
+ // Cache the host
1016
+ this.reactHostCache.set(optionIndex, reactHost);
1017
+ // Update current index if this is the selected option
1018
+ if (optionIndex === this.selectedReportOptionIndex) {
1019
+ this.currentHostIndex = optionIndex;
1020
+ }
1021
+ }
1022
+ catch (e) {
1023
+ console.error('Error creating React host:', e);
1024
+ // Determine the type of error and create a user-friendly message
1025
+ let errorType = 'Component Initialization Error';
1026
+ let errorMessage = 'Failed to initialize the React component.';
1027
+ let technicalDetails = e.toString();
1028
+ if (e.message?.includes('JSX transpilation failed')) {
1029
+ errorType = 'Code Compilation Error';
1030
+ errorMessage = 'The component code could not be compiled. This usually indicates a syntax error in the generated code.';
1031
+ technicalDetails = e.message;
1032
+ }
1033
+ else if (e.message?.includes('is not defined')) {
1034
+ errorType = 'Missing Dependency';
1035
+ errorMessage = 'The component is trying to use a feature or library that is not available.';
1036
+ }
1037
+ else if (e.message?.includes('Cannot read properties')) {
1038
+ errorType = 'Property Access Error';
1039
+ errorMessage = 'The component is trying to access data that doesn\'t exist. This often happens when property names don\'t match the data structure.';
1040
+ }
1041
+ this.currentError = {
1042
+ type: errorType,
1043
+ message: errorMessage,
1044
+ technicalDetails: technicalDetails + '\n\nComponent Option: ' + (optionIndex + 1) + '\nComponent Name: ' + option.option.componentName
1045
+ };
1046
+ LogError(e);
1047
+ }
1059
1048
  }
1060
1049
  getFlattenedDataContext() {
1061
- var _a;
1062
1050
  const flattenedDataContext = {};
1063
- if ((_a = this.SkipData) === null || _a === void 0 ? void 0 : _a.dataContext) {
1064
- const loadedItems = this.SkipData.dataContext.Items.filter((i) => { var _a; return i.DataLoaded && ((_a = i._Data) === null || _a === void 0 ? void 0 : _a.length) > 0; });
1051
+ if (this.SkipData?.dataContext) {
1052
+ const loadedItems = this.SkipData.dataContext.Items.filter((i) => i.DataLoaded && i._Data?.length > 0);
1065
1053
  for (let i = 0; i < loadedItems.length; i++) {
1066
1054
  flattenedDataContext["data_item_" + i] = loadedItems[i]._Data;
1067
1055
  }
@@ -1097,14 +1085,13 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1097
1085
  // TODO: Implement user state persistence if needed
1098
1086
  }
1099
1087
  handleNotifyEvent(eventName, eventData) {
1100
- var _a;
1101
1088
  console.log(`Component raised event: ${eventName} notified with data:`, eventData);
1102
1089
  // Handle component errors from React host
1103
1090
  if (eventName === 'componentError') {
1104
1091
  this.currentError = {
1105
1092
  type: eventData.source || 'React Component Error',
1106
1093
  message: eventData.error || 'An unknown error occurred in the React component',
1107
- technicalDetails: eventData.stackTrace || ((_a = eventData.errorInfo) === null || _a === void 0 ? void 0 : _a.componentStack) || ''
1094
+ technicalDetails: eventData.stackTrace || eventData.errorInfo?.componentStack || ''
1108
1095
  };
1109
1096
  }
1110
1097
  // TODO: Handle other custom events as needed
@@ -1226,43 +1213,43 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1226
1213
  }
1227
1214
  CreateSimpleRunQuery(rq) {
1228
1215
  return {
1229
- runQuery: (params) => __awaiter(this, void 0, void 0, function* () {
1216
+ runQuery: async (params) => {
1230
1217
  // Run a single query and return the results
1231
1218
  try {
1232
- const result = yield rq.RunQuery(params);
1219
+ const result = await rq.RunQuery(params);
1233
1220
  return result;
1234
1221
  }
1235
1222
  catch (error) {
1236
1223
  LogError(error);
1237
1224
  throw error; // Re-throw to handle it in the caller
1238
1225
  }
1239
- })
1226
+ }
1240
1227
  };
1241
1228
  }
1242
1229
  CreateSimpleRunView(rv) {
1243
1230
  return {
1244
- runView: (params) => __awaiter(this, void 0, void 0, function* () {
1231
+ runView: async (params) => {
1245
1232
  // Run a single view and return the results
1246
1233
  try {
1247
- const result = yield rv.RunView(params);
1234
+ const result = await rv.RunView(params);
1248
1235
  return result;
1249
1236
  }
1250
1237
  catch (error) {
1251
1238
  LogError(error);
1252
1239
  throw error; // Re-throw to handle it in the caller
1253
1240
  }
1254
- }),
1255
- runViews: (params) => __awaiter(this, void 0, void 0, function* () {
1241
+ },
1242
+ runViews: async (params) => {
1256
1243
  // Runs multiple views and returns the results
1257
1244
  try {
1258
- const results = yield rv.RunViews(params);
1245
+ const results = await rv.RunViews(params);
1259
1246
  return results;
1260
1247
  }
1261
1248
  catch (error) {
1262
1249
  LogError(error);
1263
1250
  throw error; // Re-throw to handle it in the caller
1264
1251
  }
1265
- })
1252
+ }
1266
1253
  };
1267
1254
  }
1268
1255
  SetupCallbacks() {
@@ -1304,32 +1291,30 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1304
1291
  };
1305
1292
  return cb;
1306
1293
  }
1307
- refreshReport(data) {
1308
- return __awaiter(this, void 0, void 0, function* () {
1309
- const currentHost = this.getCurrentReactHost();
1310
- if (currentHost) {
1311
- currentHost.refresh(data);
1312
- }
1313
- else {
1314
- // If no React host is available, create one for the current option
1315
- this.createReactHostForOption(this.selectedReportOptionIndex);
1316
- }
1317
- });
1294
+ async refreshReport(data) {
1295
+ const currentHost = this.getCurrentReactHost();
1296
+ if (currentHost) {
1297
+ currentHost.refresh(data);
1298
+ }
1299
+ else {
1300
+ // If no React host is available, create one for the current option
1301
+ this.createReactHostForOption(this.selectedReportOptionIndex);
1302
+ }
1318
1303
  }
1304
+ static ɵfac = function SkipDynamicUIComponentComponent_Factory(t) { return new (t || SkipDynamicUIComponentComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
1305
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipDynamicUIComponentComponent, selectors: [["skip-dynamic-ui-component"]], viewQuery: function SkipDynamicUIComponentComponent_Query(rf, ctx) { if (rf & 1) {
1306
+ i0.ɵɵviewQuery(_c0, 5);
1307
+ } if (rf & 2) {
1308
+ let _t;
1309
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.htmlContainers = _t);
1310
+ } }, hostBindings: function SkipDynamicUIComponentComponent_HostBindings(rf, ctx) { if (rf & 1) {
1311
+ i0.ɵɵlistener("resize", function SkipDynamicUIComponentComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
1312
+ } }, inputs: { UIComponentCode: "UIComponentCode", ComponentObjectName: "ComponentObjectName", ShowPrintReport: "ShowPrintReport", ShowReportOptionsToggle: "ShowReportOptionsToggle", ShowCreateReportButton: "ShowCreateReportButton", matchingReportID: "matchingReportID", SkipData: "SkipData" }, outputs: { DrillDownEvent: "DrillDownEvent", CreateReportRequested: "CreateReportRequested" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["htmlContainer", ""], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "keepTabContent"], [2, "height", "100%", "display", "flex", "flex-direction", "column"], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "tabSelect", "keepTabContent"], [3, "selected"], ["kendoTabTitle", ""], ["kendoTabContent", ""], [1, "fa-solid", "fa-star", "star-icon"], [1, "tab-action-bar"], [1, "tab-actions-left"], ["title", "Toggle Functional Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-list-check"], ["title", "Toggle Data Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-database"], ["title", "Toggle Technical Design", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-cogs"], ["title", "Toggle Code View", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-code"], [1, "tab-actions-right"], ["class", "tab-action-button create-button", 3, "disabled", "click", 4, "ngIf"], ["class", "tab-action-button print-button", "title", "Print Report", 3, "click", 4, "ngIf"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "0", "overflow", "hidden"], [2, "flex", "1", "position", "relative", "min-height", "0", "overflow", "auto"], [2, "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"], [1, "tab-action-button", "create-button", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["title", "Print Report", 1, "tab-action-button", "print-button", 3, "click"], [1, "fa-solid", "fa-print"], [1, "details-panel"], [2, "height", "100%"], [1, "panel-resizer", 3, "mousedown", "touchstart"], [1, "resizer-handle"], [1, "details-content"], [3, "innerHTML"], [1, "details-content", "code-content"], [2, "height", "100%", 3, "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "height", "500px", "background-color", "#f8f9fa", "border", "2px solid #dc3545", "border-radius", "8px", "padding", "20px", "overflow-y", "auto", "box-shadow", "0 4px 6px rgba(0, 0, 0, 0.1)"], [2, "position", "relative"], ["kendoButton", "", 2, "position", "absolute", "top", "0", "right", "0", "font-size", "12px", 3, "click"], [1, "fa-solid", "fa-copy"], [2, "color", "#dc3545", "margin-top", "0", "margin-right", "150px", "font-size", "18px"], [1, "fa-solid", "fa-exclamation-triangle"], [2, "margin-bottom", "10px", "font-size", "14px"], [2, "background-color", "#fff", "border", "1px solid #dee2e6", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px", "font-family", "'Courier New', monospace", "font-size", "12px"], [2, "margin-top", "8px"], [2, "background-color", "#e7f3ff", "border", "1px solid #b3d9ff", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px"], [2, "font-size", "14px"], [2, "margin", "8px 0 0 20px", "padding", "0", "font-size", "13px"], ["kendoButton", "", 2, "font-size", "13px", 3, "click"], [1, "fa-solid", "fa-rotate"], [2, "cursor", "pointer", "color", "#0056b3"], [2, "margin-top", "8px", "white-space", "pre-wrap", "word-break", "break-word", "font-size", "11px"], [2, "position", "absolute", "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
1313
+ i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 1)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 27, 12, "div", 2);
1314
+ } if (rf & 2) {
1315
+ i0.ɵɵconditional(ctx.reportOptions.length > 1 ? 0 : 1);
1316
+ } }, dependencies: [i2.NgIf, i3.TabStripComponent, i3.TabStripTabComponent, i3.TabContentDirective, i3.TabTitleDirective, i4.ButtonComponent, i5.CodeEditorComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n position: relative;\n }\n \n \n\n .tab-action-bar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background-color: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n }\n \n .tab-actions-left[_ngcontent-%COMP%], \n .tab-actions-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n \n\n .tab-action-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background-color: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .tab-action-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n \n \n\n .tab-action-button.create-button[_ngcontent-%COMP%], \n .tab-action-button.print-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #333;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.create-button[_ngcontent-%COMP%]:hover:not(:disabled), \n .tab-action-button.print-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n \n\n .tab-action-button.toggle-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #666;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.toggle-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n color: #333;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%] {\n background-color: #5B4FE9;\n color: white;\n border-color: #5B4FE9;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #4940D4;\n border-color: #4940D4;\n }\n \n \n\n .details-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid #e0e0e0;\n background-color: #fafafa;\n overflow: hidden;\n transition: height 0.3s ease;\n }\n \n .details-content[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n font-size: 14px;\n line-height: 1.6;\n }\n \n .details-content.code-content[_ngcontent-%COMP%] {\n padding: 0;\n }\n \n \n\n .panel-resizer[_ngcontent-%COMP%] {\n height: 4px;\n background-color: #e0e0e0;\n cursor: ns-resize;\n position: relative;\n transition: background-color 0.2s ease;\n }\n \n .panel-resizer[_ngcontent-%COMP%]:hover {\n background-color: #d0d0d0;\n }\n \n .resizer-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 40px;\n height: 2px;\n background-color: #999;\n border-radius: 1px;\n }\n \n \n\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h1) { font-size: 1.5em; margin-top: 0; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h2) { font-size: 1.3em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h3) { font-size: 1.1em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ul), .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ol) { margin-left: 1.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(code) { \n background-color: #f4f4f4; \n padding: 2px 4px; \n border-radius: 3px; \n font-family: 'Courier New', monospace; \n font-size: 0.9em;\n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(pre) { \n background-color: #f4f4f4; \n padding: 12px; \n border-radius: 4px; \n overflow-x: auto; \n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(blockquote) { \n border-left: 4px solid #e0e0e0; \n padding-left: 16px; \n margin-left: 0; \n color: #666; \n }\n \n \n\n .k-tabstrip {\n border: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 10px 5px 5px 5px;\n }\n \n .k-tabstrip-items {\n background: #f8f9fa;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: 0 0 auto;\n padding: 8px 12px 0 12px;\n gap: 4px;\n display: flex;\n }\n \n .k-tabstrip-items-wrapper {\n height: 100%;\n }\n \n .k-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-top: none;\n border-radius: 0 0 8px 8px;\n }\n \n .k-tabstrip .k-item {\n margin-right: 2px;\n border: none;\n background: transparent;\n border-radius: 6px 6px 0 0;\n padding: 2px;\n transition: all 0.2s ease;\n }\n \n .k-tabstrip .k-item.k-selected {\n background: white;\n border: 1px solid #e0e0e0;\n border-bottom: 1px solid white;\n margin-bottom: -1px;\n z-index: 1;\n }\n \n .k-tabstrip .k-link {\n padding: 8px 16px;\n font-weight: 500;\n font-size: 13px;\n color: #666;\n transition: all 0.15s ease;\n border-radius: 4px 4px 0 0;\n background: transparent;\n border: none;\n text-transform: lowercase;\n }\n \n .k-tabstrip .k-link:first-letter {\n text-transform: uppercase;\n }\n \n .k-tabstrip .k-item:hover:not(.k-selected) .k-link {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n \n .k-tabstrip .k-item.k-selected .k-link {\n color: #1976d2;\n font-weight: 600;\n background: white;\n }\n \n \n\n .k-tabstrip .k-link .star-icon {\n display: inline-block;\n margin-right: 4px;\n color: #ffd700;\n font-size: 12px;\n vertical-align: middle;\n }\n \n \n\n .k-tabstrip-items::before, \n .k-tabstrip-items::after {\n display: none;\n }\n \n .k-tabstrip .k-item::before, \n .k-tabstrip .k-item::after {\n display: none;\n }\n \n \n\n .k-tabstrip .k-link:focus {\n outline: none;\n box-shadow: none;\n }\n \n \n\n .k-tabstrip .k-content.k-state-active {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n \n\n .react-host-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }"] });
1319
1317
  }
1320
- SkipDynamicUIComponentComponent.ɵfac = function SkipDynamicUIComponentComponent_Factory(t) { return new (t || SkipDynamicUIComponentComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
1321
- SkipDynamicUIComponentComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipDynamicUIComponentComponent, selectors: [["skip-dynamic-ui-component"]], viewQuery: function SkipDynamicUIComponentComponent_Query(rf, ctx) { if (rf & 1) {
1322
- i0.ɵɵviewQuery(_c0, 5);
1323
- } if (rf & 2) {
1324
- let _t;
1325
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.htmlContainers = _t);
1326
- } }, hostBindings: function SkipDynamicUIComponentComponent_HostBindings(rf, ctx) { if (rf & 1) {
1327
- i0.ɵɵlistener("resize", function SkipDynamicUIComponentComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
1328
- } }, inputs: { UIComponentCode: "UIComponentCode", ComponentObjectName: "ComponentObjectName", ShowPrintReport: "ShowPrintReport", ShowReportOptionsToggle: "ShowReportOptionsToggle", ShowCreateReportButton: "ShowCreateReportButton", matchingReportID: "matchingReportID", SkipData: "SkipData" }, outputs: { DrillDownEvent: "DrillDownEvent", CreateReportRequested: "CreateReportRequested" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["htmlContainer", ""], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "keepTabContent"], [2, "height", "100%", "display", "flex", "flex-direction", "column"], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "tabSelect", "keepTabContent"], [3, "selected"], ["kendoTabTitle", ""], ["kendoTabContent", ""], [1, "fa-solid", "fa-star", "star-icon"], [1, "tab-action-bar"], [1, "tab-actions-left"], ["title", "Toggle Functional Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-list-check"], ["title", "Toggle Data Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-database"], ["title", "Toggle Technical Design", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-cogs"], ["title", "Toggle Code View", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-code"], [1, "tab-actions-right"], ["class", "tab-action-button create-button", 3, "disabled", "click", 4, "ngIf"], ["class", "tab-action-button print-button", "title", "Print Report", 3, "click", 4, "ngIf"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "0", "overflow", "hidden"], [2, "flex", "1", "position", "relative", "min-height", "0", "overflow", "auto"], [2, "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"], [1, "tab-action-button", "create-button", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["title", "Print Report", 1, "tab-action-button", "print-button", 3, "click"], [1, "fa-solid", "fa-print"], [1, "details-panel"], [2, "height", "100%"], [1, "panel-resizer", 3, "mousedown", "touchstart"], [1, "resizer-handle"], [1, "details-content"], [3, "innerHTML"], [1, "details-content", "code-content"], [2, "height", "100%", 3, "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "height", "500px", "background-color", "#f8f9fa", "border", "2px solid #dc3545", "border-radius", "8px", "padding", "20px", "overflow-y", "auto", "box-shadow", "0 4px 6px rgba(0, 0, 0, 0.1)"], [2, "position", "relative"], ["kendoButton", "", 2, "position", "absolute", "top", "0", "right", "0", "font-size", "12px", 3, "click"], [1, "fa-solid", "fa-copy"], [2, "color", "#dc3545", "margin-top", "0", "margin-right", "150px", "font-size", "18px"], [1, "fa-solid", "fa-exclamation-triangle"], [2, "margin-bottom", "10px", "font-size", "14px"], [2, "background-color", "#fff", "border", "1px solid #dee2e6", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px", "font-family", "'Courier New', monospace", "font-size", "12px"], [2, "margin-top", "8px"], [2, "background-color", "#e7f3ff", "border", "1px solid #b3d9ff", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px"], [2, "font-size", "14px"], [2, "margin", "8px 0 0 20px", "padding", "0", "font-size", "13px"], ["kendoButton", "", 2, "font-size", "13px", 3, "click"], [1, "fa-solid", "fa-rotate"], [2, "cursor", "pointer", "color", "#0056b3"], [2, "margin-top", "8px", "white-space", "pre-wrap", "word-break", "break-word", "font-size", "11px"], [2, "position", "absolute", "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
1329
- i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 1)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 27, 12, "div", 2);
1330
- } if (rf & 2) {
1331
- i0.ɵɵconditional(ctx.reportOptions.length > 1 ? 0 : 1);
1332
- } }, dependencies: [i2.NgIf, i3.TabStripComponent, i3.TabStripTabComponent, i3.TabContentDirective, i3.TabTitleDirective, i4.ButtonComponent, i5.CodeEditorComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n position: relative;\n }\n \n \n\n .tab-action-bar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background-color: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n }\n \n .tab-actions-left[_ngcontent-%COMP%], \n .tab-actions-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n \n\n .tab-action-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background-color: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .tab-action-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n \n \n\n .tab-action-button.create-button[_ngcontent-%COMP%], \n .tab-action-button.print-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #333;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.create-button[_ngcontent-%COMP%]:hover:not(:disabled), \n .tab-action-button.print-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n \n\n .tab-action-button.toggle-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #666;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.toggle-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n color: #333;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%] {\n background-color: #5B4FE9;\n color: white;\n border-color: #5B4FE9;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #4940D4;\n border-color: #4940D4;\n }\n \n \n\n .details-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid #e0e0e0;\n background-color: #fafafa;\n overflow: hidden;\n transition: height 0.3s ease;\n }\n \n .details-content[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n font-size: 14px;\n line-height: 1.6;\n }\n \n .details-content.code-content[_ngcontent-%COMP%] {\n padding: 0;\n }\n \n \n\n .panel-resizer[_ngcontent-%COMP%] {\n height: 4px;\n background-color: #e0e0e0;\n cursor: ns-resize;\n position: relative;\n transition: background-color 0.2s ease;\n }\n \n .panel-resizer[_ngcontent-%COMP%]:hover {\n background-color: #d0d0d0;\n }\n \n .resizer-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 40px;\n height: 2px;\n background-color: #999;\n border-radius: 1px;\n }\n \n \n\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h1) { font-size: 1.5em; margin-top: 0; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h2) { font-size: 1.3em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h3) { font-size: 1.1em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ul), .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ol) { margin-left: 1.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(code) { \n background-color: #f4f4f4; \n padding: 2px 4px; \n border-radius: 3px; \n font-family: 'Courier New', monospace; \n font-size: 0.9em;\n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(pre) { \n background-color: #f4f4f4; \n padding: 12px; \n border-radius: 4px; \n overflow-x: auto; \n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(blockquote) { \n border-left: 4px solid #e0e0e0; \n padding-left: 16px; \n margin-left: 0; \n color: #666; \n }\n \n \n\n .k-tabstrip {\n border: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 10px 5px 5px 5px;\n }\n \n .k-tabstrip-items {\n background: #f8f9fa;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: 0 0 auto;\n padding: 8px 12px 0 12px;\n gap: 4px;\n display: flex;\n }\n \n .k-tabstrip-items-wrapper {\n height: 100%;\n }\n \n .k-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-top: none;\n border-radius: 0 0 8px 8px;\n }\n \n .k-tabstrip .k-item {\n margin-right: 2px;\n border: none;\n background: transparent;\n border-radius: 6px 6px 0 0;\n padding: 2px;\n transition: all 0.2s ease;\n }\n \n .k-tabstrip .k-item.k-selected {\n background: white;\n border: 1px solid #e0e0e0;\n border-bottom: 1px solid white;\n margin-bottom: -1px;\n z-index: 1;\n }\n \n .k-tabstrip .k-link {\n padding: 8px 16px;\n font-weight: 500;\n font-size: 13px;\n color: #666;\n transition: all 0.15s ease;\n border-radius: 4px 4px 0 0;\n background: transparent;\n border: none;\n text-transform: lowercase;\n }\n \n .k-tabstrip .k-link:first-letter {\n text-transform: uppercase;\n }\n \n .k-tabstrip .k-item:hover:not(.k-selected) .k-link {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n \n .k-tabstrip .k-item.k-selected .k-link {\n color: #1976d2;\n font-weight: 600;\n background: white;\n }\n \n \n\n .k-tabstrip .k-link .star-icon {\n display: inline-block;\n margin-right: 4px;\n color: #ffd700;\n font-size: 12px;\n vertical-align: middle;\n }\n \n \n\n .k-tabstrip-items::before, \n .k-tabstrip-items::after {\n display: none;\n }\n \n .k-tabstrip .k-item::before, \n .k-tabstrip .k-item::after {\n display: none;\n }\n \n \n\n .k-tabstrip .k-link:focus {\n outline: none;\n box-shadow: none;\n }\n \n \n\n .k-tabstrip .k-content.k-state-active {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n \n\n .react-host-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }"] });
1333
1318
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipDynamicUIComponentComponent, [{
1334
1319
  type: Component,
1335
1320
  args: [{ selector: 'skip-dynamic-ui-component', template: `