osi-cards-lib 1.2.0 → 1.2.2

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.
package/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnDestroy, OnChanges, EventEmitter, ChangeDetectorRef, SimpleChanges, AfterViewInit, ElementRef, QueryList, OnInit } from '@angular/core';
2
+ import { OnDestroy, OnChanges, EventEmitter, ChangeDetectorRef, SimpleChanges, Type, Provider, EnvironmentProviders, AfterViewInit, ElementRef, QueryList, OnInit } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
+ import { Observable } from 'rxjs';
4
5
  import * as i1 from 'lucide-angular';
5
6
 
6
7
  type CardType = 'company' | 'contact' | 'opportunity' | 'product' | 'analytics' | 'event' | 'project' | 'sko';
@@ -356,10 +357,34 @@ declare class MagneticTiltService implements OnDestroy {
356
357
  private rafId;
357
358
  private pendingUpdate;
358
359
  private lastCalculations;
360
+ private currentRotateY;
361
+ private currentRotateX;
362
+ private currentGlowBlur;
363
+ private currentGlowOpacity;
364
+ private currentReflectionOpacity;
365
+ private targetRotateY;
366
+ private targetRotateX;
367
+ private targetGlowBlur;
368
+ private targetGlowOpacity;
369
+ private targetReflectionOpacity;
370
+ private smoothingRafId;
359
371
  private readonly CACHE_DURATION;
360
372
  private readonly ngZone;
361
373
  calculateTilt(mousePosition: MousePosition, element: HTMLElement | null): void;
362
374
  private processTiltUpdate;
375
+ /**
376
+ * Linear interpolation (lerp) for smooth value transitions
377
+ * @param start Current value
378
+ * @param end Target value
379
+ * @param factor Interpolation factor (0-1)
380
+ */
381
+ private lerp;
382
+ /**
383
+ * Continue smoothing animation until values are close to target
384
+ * Uses the latest target values stored in the service
385
+ * Optimized for smooth cursor following
386
+ */
387
+ private continueSmoothing;
363
388
  private getElementCache;
364
389
  private hasCalculationsChanged;
365
390
  private resetTimeoutId;
@@ -417,67 +442,6 @@ declare class SectionUtilsService {
417
442
  static ɵprov: i0.ɵɵInjectableDeclaration<SectionUtilsService>;
418
443
  }
419
444
 
420
- type CardChangeType = 'content' | 'structural';
421
- interface CardDiffResult {
422
- card: AICardConfig;
423
- changeType: CardChangeType;
424
- }
425
- /**
426
- * Deep comparison utility for card objects
427
- * Uses content hashing instead of JSON.stringify for better performance
428
- */
429
- declare class CardDiffUtil {
430
- /**
431
- * Creates an updated card with only changed sections/fields updated
432
- * Preserves references to unchanged sections for optimal performance
433
- */
434
- static mergeCardUpdates(oldCard: AICardConfig, newCard: AICardConfig): CardDiffResult;
435
- private static didStructureChange;
436
- /**
437
- * Merges sections array, preserving references to unchanged sections
438
- */
439
- private static mergeSections;
440
- /**
441
- * Merges a single section, preserving references to unchanged fields/items
442
- */
443
- private static mergeSection;
444
- /**
445
- * Merges fields array, preserving references to unchanged fields
446
- * Uses content hashing instead of JSON.stringify for better performance
447
- */
448
- private static mergeFields;
449
- /**
450
- * Merges items array, preserving references to unchanged items
451
- * Uses content hashing instead of JSON.stringify for better performance
452
- */
453
- private static mergeItems;
454
- /**
455
- * Fast equality check for cards
456
- */
457
- private static areCardsEqual;
458
- /**
459
- * Fast equality check for sections arrays
460
- */
461
- private static areSectionsEqual;
462
- /**
463
- * Fast equality check for fields arrays
464
- */
465
- private static areFieldsEqual;
466
- /**
467
- * Fast equality check for items arrays
468
- */
469
- private static areItemsEqual;
470
- }
471
-
472
- type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
473
- declare function getBreakpointFromWidth(width: number): Breakpoint;
474
-
475
- declare class LucideIconsModule {
476
- static ɵfac: i0.ɵɵFactoryDeclaration<LucideIconsModule, never>;
477
- static ɵmod: i0.ɵɵNgModuleDeclaration<LucideIconsModule, never, [typeof i1.LucideAngularModule], [typeof i1.LucideAngularModule]>;
478
- static ɵinj: i0.ɵɵInjectorDeclaration<LucideIconsModule>;
479
- }
480
-
481
445
  /**
482
446
  * Base interface for section field/item interactions
483
447
  */
@@ -614,6 +578,185 @@ declare abstract class BaseSectionComponent<T extends CardField | CardItem = Car
614
578
  static ɵcmp: i0.ɵɵComponentDeclaration<BaseSectionComponent<any>, "ng-component", never, { "section": { "alias": "section"; "required": true; }; }, { "fieldInteraction": "fieldInteraction"; "itemInteraction": "itemInteraction"; }, never, never, true, never>;
615
579
  }
616
580
 
581
+ /**
582
+ * Plugin metadata for a custom section type
583
+ */
584
+ interface SectionPluginMetadata {
585
+ /** Unique identifier for the section type */
586
+ type: string;
587
+ /** Display name for the section type */
588
+ name: string;
589
+ /** Description of what this section type does */
590
+ description?: string;
591
+ /** Version of the plugin */
592
+ version?: string;
593
+ /** Author information */
594
+ author?: string;
595
+ }
596
+ /**
597
+ * Configuration options for a section plugin
598
+ */
599
+ interface SectionPluginConfig {
600
+ /** Priority for plugin resolution (higher = higher priority) */
601
+ priority?: number;
602
+ /** Whether this plugin should override built-in sections with the same type */
603
+ override?: boolean;
604
+ /** Additional metadata */
605
+ metadata?: Partial<SectionPluginMetadata>;
606
+ }
607
+ /**
608
+ * Plugin interface that custom section components must implement
609
+ *
610
+ * @example
611
+ * ```typescript
612
+ * @Component({
613
+ * selector: 'app-custom-section',
614
+ * standalone: true,
615
+ * template: `...`
616
+ * })
617
+ * export class CustomSectionComponent extends BaseSectionComponent implements SectionPlugin {
618
+ * static readonly PLUGIN_TYPE = 'custom-section';
619
+ *
620
+ * getPluginType(): string {
621
+ * return CustomSectionComponent.PLUGIN_TYPE;
622
+ * }
623
+ *
624
+ * canHandle(section: CardSection): boolean {
625
+ * return section.type === 'custom-section';
626
+ * }
627
+ * }
628
+ * ```
629
+ */
630
+ interface SectionPlugin {
631
+ /**
632
+ * Returns the section type this plugin handles
633
+ */
634
+ getPluginType(): string;
635
+ /**
636
+ * Determines if this plugin can handle the given section
637
+ * @param section - The section to check
638
+ * @returns True if this plugin can handle the section
639
+ */
640
+ canHandle(section: CardSection): boolean;
641
+ }
642
+ /**
643
+ * Extended plugin interface with component type
644
+ */
645
+ interface RegisteredSectionPlugin extends SectionPluginMetadata {
646
+ /** The component class that handles this section type */
647
+ component: Type<BaseSectionComponent>;
648
+ /** Configuration options */
649
+ config: SectionPluginConfig;
650
+ /** Priority for resolution (default: 0) */
651
+ priority: number;
652
+ }
653
+
654
+ /**
655
+ * Registry service for managing custom section type plugins
656
+ *
657
+ * Allows external developers to register custom section components that extend
658
+ * the library's built-in section types.
659
+ *
660
+ * @example
661
+ * ```typescript
662
+ * const registry = inject(SectionPluginRegistry);
663
+ *
664
+ * // Register a custom section plugin
665
+ * registry.register({
666
+ * type: 'custom-section',
667
+ * name: 'Custom Section',
668
+ * description: 'A custom section type',
669
+ * component: CustomSectionComponent,
670
+ * config: {
671
+ * priority: 10,
672
+ * override: false
673
+ * }
674
+ * });
675
+ *
676
+ * // Get a component for a section type
677
+ * const component = registry.getComponent(section);
678
+ * ```
679
+ */
680
+ declare class SectionPluginRegistry {
681
+ private plugins;
682
+ private readonly defaultFallback;
683
+ /**
684
+ * Register a custom section plugin
685
+ *
686
+ * @param plugin - The plugin metadata and component
687
+ * @throws Error if plugin type already exists and override is false
688
+ */
689
+ register(plugin: {
690
+ type: string;
691
+ name: string;
692
+ description?: string;
693
+ component: Type<BaseSectionComponent & SectionPlugin>;
694
+ config?: SectionPluginConfig;
695
+ metadata?: Partial<SectionPluginMetadata>;
696
+ }): void;
697
+ /**
698
+ * Unregister a plugin
699
+ *
700
+ * @param type - The section type to unregister
701
+ * @returns True if plugin was removed, false if not found
702
+ */
703
+ unregister(type: string): boolean;
704
+ /**
705
+ * Get the component class for a given section type
706
+ *
707
+ * @param sectionType - The section type identifier
708
+ * @returns The component class or null if not found
709
+ */
710
+ getComponent(sectionType: string): Type<BaseSectionComponent> | null;
711
+ /**
712
+ * Get the component class for a section
713
+ * Returns null if no plugin is registered (built-in sections will handle it)
714
+ *
715
+ * @param section - The card section
716
+ * @returns The component class or null if no plugin registered
717
+ */
718
+ getComponentForSection(section: CardSection): Type<BaseSectionComponent> | null;
719
+ /**
720
+ * Check if a plugin is registered for a section type
721
+ *
722
+ * @param type - The section type identifier
723
+ * @returns True if a plugin is registered
724
+ */
725
+ hasPlugin(type: string): boolean;
726
+ /**
727
+ * Get all registered plugins
728
+ *
729
+ * @returns Array of registered plugin metadata
730
+ */
731
+ getPlugins(): RegisteredSectionPlugin[];
732
+ /**
733
+ * Get plugin metadata for a specific type
734
+ *
735
+ * @param type - The section type identifier
736
+ * @returns Plugin metadata or null if not found
737
+ */
738
+ getPluginMetadata(type: string): RegisteredSectionPlugin | null;
739
+ /**
740
+ * Clear all registered plugins
741
+ */
742
+ clear(): void;
743
+ /**
744
+ * Register multiple plugins at once
745
+ *
746
+ * @param plugins - Array of plugins to register
747
+ */
748
+ registerAll(plugins: Array<{
749
+ type: string;
750
+ name: string;
751
+ description?: string;
752
+ component: Type<BaseSectionComponent & SectionPlugin>;
753
+ config?: SectionPluginConfig;
754
+ metadata?: Partial<SectionPluginMetadata>;
755
+ }>): void;
756
+ static ɵfac: i0.ɵɵFactoryDeclaration<SectionPluginRegistry, never>;
757
+ static ɵprov: i0.ɵɵInjectableDeclaration<SectionPluginRegistry>;
758
+ }
759
+
617
760
  type InfoField = CardField & {
618
761
  description?: string;
619
762
  change?: number;
@@ -654,17 +797,887 @@ interface SectionRenderEvent {
654
797
  declare class SectionRendererComponent {
655
798
  section: CardSection;
656
799
  sectionEvent: EventEmitter<SectionRenderEvent>;
800
+ private readonly pluginRegistry;
657
801
  get sectionTypeAttribute(): string;
658
802
  get sectionIdAttribute(): string | null;
803
+ /**
804
+ * Get the component type for the current section, checking plugins first
805
+ */
806
+ get sectionComponent(): Type<BaseSectionComponent> | null;
807
+ /**
808
+ * Check if current section uses a plugin
809
+ */
810
+ get usesPlugin(): boolean;
659
811
  get resolvedType(): string;
660
812
  onInfoFieldInteraction(event: InfoSectionFieldInteraction): void;
661
813
  emitFieldInteraction(field: CardField, metadata?: Record<string, unknown>): void;
662
814
  emitItemInteraction(item: CardItem | CardField, metadata?: Record<string, unknown>): void;
663
815
  emitActionInteraction(action: CardAction, metadata?: Record<string, unknown>): void;
816
+ /**
817
+ * Handle events from plugin components
818
+ */
819
+ onPluginSectionEvent(event: SectionRenderEvent): void;
664
820
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionRendererComponent, never>;
665
821
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionRendererComponent, "app-section-renderer", never, { "section": { "alias": "section"; "required": true; }; }, { "sectionEvent": "sectionEvent"; }, never, never, true, never>;
666
822
  }
667
823
 
824
+ /**
825
+ * Event middleware interface for intercepting and transforming card events
826
+ *
827
+ * Middleware functions can be used to:
828
+ * - Log events for debugging
829
+ * - Transform event data
830
+ * - Add analytics tracking
831
+ * - Implement custom event filtering
832
+ * - Enrich events with additional metadata
833
+ *
834
+ * @example
835
+ * ```typescript
836
+ * const loggingMiddleware: EventMiddleware = {
837
+ * handle: (event, next) => {
838
+ * console.log('Event:', event);
839
+ * return next(event);
840
+ * }
841
+ * };
842
+ * ```
843
+ */
844
+ interface EventMiddleware {
845
+ /**
846
+ * Handle an event, optionally transforming it before passing to next middleware
847
+ *
848
+ * @param event - The event to handle
849
+ * @param next - Function to call the next middleware in the chain
850
+ * @returns The processed event (can be the original or transformed)
851
+ */
852
+ handle(event: SectionRenderEvent, next: (event: SectionRenderEvent) => SectionRenderEvent): SectionRenderEvent;
853
+ /**
854
+ * Optional priority for middleware ordering (higher = earlier in chain)
855
+ */
856
+ priority?: number;
857
+ }
858
+ /**
859
+ * Event handler function type
860
+ */
861
+ type EventHandler = (event: SectionRenderEvent) => void | SectionRenderEvent;
862
+ /**
863
+ * Event transformation function type
864
+ */
865
+ type EventTransformer = (event: SectionRenderEvent) => SectionRenderEvent;
866
+ /**
867
+ * Event filter function type
868
+ */
869
+ type EventFilter = (event: SectionRenderEvent) => boolean;
870
+
871
+ /**
872
+ * Event Middleware Service
873
+ *
874
+ * Manages event middleware chains for processing card events before they reach handlers.
875
+ * Supports logging, transformation, filtering, and analytics integration.
876
+ *
877
+ * @example
878
+ * ```typescript
879
+ * const eventService = inject(EventMiddlewareService);
880
+ *
881
+ * // Add logging middleware
882
+ * eventService.addMiddleware({
883
+ * handle: (event, next) => {
884
+ * console.log('Event:', event);
885
+ * return next(event);
886
+ * }
887
+ * });
888
+ *
889
+ * // Subscribe to processed events
890
+ * eventService.processedEvents$.subscribe(event => {
891
+ * // Handle event
892
+ * });
893
+ * ```
894
+ */
895
+ declare class EventMiddlewareService {
896
+ private middleware;
897
+ private processedEventsSubject;
898
+ private rawEventsSubject;
899
+ /** Observable of processed events (after middleware chain) */
900
+ processedEvents$: Observable<SectionRenderEvent>;
901
+ /** Observable of raw events (before middleware) */
902
+ rawEvents$: Observable<SectionRenderEvent>;
903
+ /**
904
+ * Add middleware to the chain
905
+ *
906
+ * @param middleware - Middleware to add
907
+ * @returns Function to remove the middleware
908
+ */
909
+ addMiddleware(middleware: EventMiddleware): () => void;
910
+ /**
911
+ * Remove middleware from the chain
912
+ *
913
+ * @param middleware - Middleware to remove
914
+ */
915
+ removeMiddleware(middleware: EventMiddleware): void;
916
+ /**
917
+ * Clear all middleware
918
+ */
919
+ clearMiddleware(): void;
920
+ /**
921
+ * Process an event through the middleware chain
922
+ *
923
+ * @param event - Event to process
924
+ * @returns Processed event
925
+ */
926
+ processEvent(event: SectionRenderEvent): SectionRenderEvent;
927
+ /**
928
+ * Create a logging middleware
929
+ *
930
+ * @param logger - Optional logger function (defaults to console.log)
931
+ * @returns Logging middleware
932
+ */
933
+ createLoggingMiddleware(logger?: (message: string, event: SectionRenderEvent) => void): EventMiddleware;
934
+ /**
935
+ * Create a filtering middleware
936
+ *
937
+ * @param filter - Filter function
938
+ * @returns Filtering middleware
939
+ */
940
+ createFilterMiddleware(filter: EventFilter): EventMiddleware;
941
+ /**
942
+ * Create a transformation middleware
943
+ *
944
+ * @param transformer - Transformation function
945
+ * @returns Transformation middleware
946
+ */
947
+ createTransformMiddleware(transformer: EventTransformer): EventMiddleware;
948
+ /**
949
+ * Create an analytics middleware
950
+ *
951
+ * @param trackEvent - Analytics tracking function
952
+ * @returns Analytics middleware
953
+ */
954
+ createAnalyticsMiddleware(trackEvent: (eventName: string, properties: Record<string, unknown>) => void): EventMiddleware;
955
+ /**
956
+ * Sort middleware by priority (higher priority first)
957
+ */
958
+ private sortMiddleware;
959
+ static ɵfac: i0.ɵɵFactoryDeclaration<EventMiddlewareService, never>;
960
+ static ɵprov: i0.ɵɵInjectableDeclaration<EventMiddlewareService>;
961
+ }
962
+
963
+ type CardChangeType = 'content' | 'structural';
964
+ interface CardDiffResult {
965
+ card: AICardConfig;
966
+ changeType: CardChangeType;
967
+ }
968
+ /**
969
+ * Deep comparison utility for card objects
970
+ * Uses content hashing instead of JSON.stringify for better performance
971
+ */
972
+ declare class CardDiffUtil {
973
+ /**
974
+ * Creates an updated card with only changed sections/fields updated
975
+ * Preserves references to unchanged sections for optimal performance
976
+ */
977
+ static mergeCardUpdates(oldCard: AICardConfig, newCard: AICardConfig): CardDiffResult;
978
+ private static didStructureChange;
979
+ /**
980
+ * Merges sections array, preserving references to unchanged sections
981
+ */
982
+ private static mergeSections;
983
+ /**
984
+ * Merges a single section, preserving references to unchanged fields/items
985
+ */
986
+ private static mergeSection;
987
+ /**
988
+ * Merges fields array, preserving references to unchanged fields
989
+ * Uses content hashing instead of JSON.stringify for better performance
990
+ */
991
+ private static mergeFields;
992
+ /**
993
+ * Merges items array, preserving references to unchanged items
994
+ * Uses content hashing instead of JSON.stringify for better performance
995
+ */
996
+ private static mergeItems;
997
+ /**
998
+ * Fast equality check for cards
999
+ */
1000
+ private static areCardsEqual;
1001
+ /**
1002
+ * Fast equality check for sections arrays
1003
+ */
1004
+ private static areSectionsEqual;
1005
+ /**
1006
+ * Fast equality check for fields arrays
1007
+ */
1008
+ private static areFieldsEqual;
1009
+ /**
1010
+ * Fast equality check for items arrays
1011
+ */
1012
+ private static areItemsEqual;
1013
+ }
1014
+
1015
+ type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
1016
+ declare function getBreakpointFromWidth(width: number): Breakpoint;
1017
+
1018
+ /**
1019
+ * Card Spawner Utilities
1020
+ *
1021
+ * Helper functions for dynamically instantiating and managing card components,
1022
+ * particularly useful for agentic flows and LLM integrations.
1023
+ */
1024
+ /**
1025
+ * Creates an empty card configuration for initialization
1026
+ */
1027
+ declare function createEmptyCard(title?: string): AICardConfig;
1028
+ /**
1029
+ * Creates a skeleton card configuration for loading states
1030
+ */
1031
+ declare function createSkeletonCard(): AICardConfig;
1032
+ /**
1033
+ * Merges a partial card configuration into an existing card configuration
1034
+ * This is useful for progressive updates during streaming
1035
+ */
1036
+ declare function mergeCardConfig(existing: AICardConfig, update: Partial<AICardConfig>): AICardConfig;
1037
+ /**
1038
+ * Merges sections arrays, updating existing sections or adding new ones
1039
+ */
1040
+ declare function mergeSections(existing: CardSection[], updates: CardSection[]): CardSection[];
1041
+ /**
1042
+ * Validates a card configuration for completeness
1043
+ */
1044
+ declare function validateCardConfig(card: Partial<AICardConfig>): {
1045
+ valid: boolean;
1046
+ errors: string[];
1047
+ };
1048
+ /**
1049
+ * Creates a card configuration from a partial update
1050
+ * Useful when receiving streaming updates that may be incomplete
1051
+ */
1052
+ declare function createCardFromPartial(partial: Partial<AICardConfig>, defaults?: Partial<AICardConfig>): AICardConfig;
1053
+ /**
1054
+ * Checks if a card configuration is complete (all required fields present)
1055
+ */
1056
+ declare function isCardComplete(card: Partial<AICardConfig>): boolean;
1057
+ /**
1058
+ * Creates a card configuration with error information
1059
+ */
1060
+ declare function createErrorCard(error: Error | string, title?: string): AICardConfig;
1061
+ /**
1062
+ * Prepares a card configuration for streaming updates
1063
+ * Ensures the card has the necessary structure for progressive updates
1064
+ */
1065
+ declare function prepareCardForStreaming(card: Partial<AICardConfig>): AICardConfig;
1066
+ /**
1067
+ * Updates a card configuration incrementally
1068
+ * Optimized for streaming scenarios where partial updates arrive
1069
+ */
1070
+ declare function updateCardIncremental(existing: AICardConfig, update: Partial<AICardConfig>): AICardConfig;
1071
+ /**
1072
+ * Creates a copy of a card configuration (deep clone)
1073
+ */
1074
+ declare function cloneCardConfig(card: AICardConfig): AICardConfig;
1075
+
1076
+ /**
1077
+ * Style Validator Utilities
1078
+ *
1079
+ * Helper functions to validate that the OSI Cards design system styles
1080
+ * are properly loaded and configured.
1081
+ */
1082
+ /**
1083
+ * Result of style validation
1084
+ */
1085
+ interface StyleValidationResult {
1086
+ valid: boolean;
1087
+ missing: string[];
1088
+ recommended: string[];
1089
+ warnings: string[];
1090
+ }
1091
+ /**
1092
+ * Validates that required CSS variables are present
1093
+ *
1094
+ * @param element - Optional element to check (defaults to document root)
1095
+ * @returns Validation result with missing variables and warnings
1096
+ *
1097
+ * @example
1098
+ * ```typescript
1099
+ * const validation = validateStyles();
1100
+ * if (!validation.valid) {
1101
+ * console.warn('Missing styles:', validation.missing);
1102
+ * }
1103
+ * ```
1104
+ */
1105
+ declare function validateStyles(element?: HTMLElement): StyleValidationResult;
1106
+ /**
1107
+ * Validates styles and logs warnings to console if issues are found
1108
+ *
1109
+ * @param element - Optional element to check
1110
+ * @param logToConsole - Whether to log warnings to console (default: true)
1111
+ * @returns Validation result
1112
+ *
1113
+ * @example
1114
+ * ```typescript
1115
+ * // In component ngOnInit or after styles load
1116
+ * validateAndWarnStyles();
1117
+ * ```
1118
+ */
1119
+ declare function validateAndWarnStyles(element?: HTMLElement, logToConsole?: boolean): StyleValidationResult;
1120
+ /**
1121
+ * Checks if a specific CSS variable is defined
1122
+ *
1123
+ * @param variableName - Name of the CSS variable (with or without -- prefix)
1124
+ * @param element - Optional element to check
1125
+ * @returns True if the variable is defined and has a value
1126
+ */
1127
+ declare function isCSSVariableDefined(variableName: string, element?: HTMLElement): boolean;
1128
+ /**
1129
+ * Gets the value of a CSS variable
1130
+ *
1131
+ * @param variableName - Name of the CSS variable (with or without -- prefix)
1132
+ * @param element - Optional element to check
1133
+ * @returns The CSS variable value, or null if not defined
1134
+ */
1135
+ declare function getCSSVariableValue(variableName: string, element?: HTMLElement): string | null;
1136
+ /**
1137
+ * Checks if styles are loaded by looking for a specific marker class or variable
1138
+ * This is a lighter check than full validation
1139
+ *
1140
+ * @returns True if styles appear to be loaded
1141
+ */
1142
+ declare function areStylesLoaded(): boolean;
1143
+ /**
1144
+ * Waits for styles to be loaded by polling
1145
+ * Useful when styles are loaded asynchronously
1146
+ *
1147
+ * @param timeout - Maximum time to wait in milliseconds (default: 5000)
1148
+ * @param pollInterval - How often to check in milliseconds (default: 100)
1149
+ * @returns Promise that resolves when styles are loaded or timeout is reached
1150
+ */
1151
+ declare function waitForStyles(timeout?: number, pollInterval?: number): Promise<boolean>;
1152
+
1153
+ declare class LucideIconsModule {
1154
+ static ɵfac: i0.ɵɵFactoryDeclaration<LucideIconsModule, never>;
1155
+ static ɵmod: i0.ɵɵNgModuleDeclaration<LucideIconsModule, never, [typeof i1.LucideAngularModule], [typeof i1.LucideAngularModule]>;
1156
+ static ɵinj: i0.ɵɵInjectorDeclaration<LucideIconsModule>;
1157
+ }
1158
+
1159
+ /**
1160
+ * Configuration options for OSI Cards Library
1161
+ */
1162
+ interface OSICardsLibConfig {
1163
+ /**
1164
+ * Whether to enable animations. Defaults to true.
1165
+ * Set to false to use noop animations (useful for testing or when animations are not desired).
1166
+ */
1167
+ enableAnimations?: boolean;
1168
+ }
1169
+ /**
1170
+ * Provide OSI Cards Library with required providers
1171
+ *
1172
+ * This function provides all necessary providers for the OSI Cards library to function
1173
+ * correctly in an Angular application. It includes:
1174
+ * - Animation providers (required for component animations)
1175
+ * - Service providers (services use providedIn: 'root' so they're automatically available)
1176
+ *
1177
+ * @param config - Optional configuration object
1178
+ * @returns Array of providers to be added to your ApplicationConfig
1179
+ *
1180
+ * @example
1181
+ * ```typescript
1182
+ * // In your app.config.ts
1183
+ * import { ApplicationConfig } from '@angular/core';
1184
+ * import { provideOSICards } from 'osi-cards-lib';
1185
+ *
1186
+ * export const appConfig: ApplicationConfig = {
1187
+ * providers: [
1188
+ * provideOSICards(), // Enable animations (default)
1189
+ * // ... other providers
1190
+ * ]
1191
+ * };
1192
+ * ```
1193
+ *
1194
+ * @example
1195
+ * ```typescript
1196
+ * // Disable animations (for testing or performance)
1197
+ * export const appConfig: ApplicationConfig = {
1198
+ * providers: [
1199
+ * provideOSICards({ enableAnimations: false }),
1200
+ * // ... other providers
1201
+ * ]
1202
+ * };
1203
+ * ```
1204
+ *
1205
+ * @remarks
1206
+ * - **REQUIRED**: You must call this function in your app.config.ts providers array
1207
+ * - Animations are required for proper component behavior (entrance animations, transitions)
1208
+ * - Services (MagneticTiltService, IconService, etc.) are automatically provided via providedIn: 'root'
1209
+ * - Styles must be imported separately: @import 'osi-cards-lib/styles/_styles';
1210
+ */
1211
+ declare function provideOSICards(config?: OSICardsLibConfig): (Provider | EnvironmentProviders)[];
1212
+
1213
+ /**
1214
+ * Theme configuration interface
1215
+ */
1216
+ interface OSICardsThemeConfig {
1217
+ /** Theme name (e.g., 'light', 'dark', 'high-contrast', 'custom') */
1218
+ name: string;
1219
+ /** CSS variable overrides */
1220
+ variables: Record<string, string>;
1221
+ /** Whether this theme is a built-in preset */
1222
+ preset?: boolean;
1223
+ }
1224
+ /**
1225
+ * Built-in theme presets
1226
+ */
1227
+ type ThemePreset = 'light' | 'dark' | 'night' | 'day' | 'high-contrast' | 'custom';
1228
+ /**
1229
+ * Theme Service
1230
+ *
1231
+ * Manages theme configuration and runtime theme switching for OSI Cards library.
1232
+ * Supports built-in presets and custom themes via CSS custom properties.
1233
+ *
1234
+ * @example
1235
+ * ```typescript
1236
+ * const themeService = inject(ThemeService);
1237
+ *
1238
+ * // Switch to dark theme
1239
+ * themeService.setTheme('night');
1240
+ *
1241
+ * // Apply custom theme
1242
+ * themeService.applyCustomTheme({
1243
+ * name: 'my-brand',
1244
+ * variables: {
1245
+ * '--color-brand': '#ff0000',
1246
+ * '--card-padding': '20px'
1247
+ * }
1248
+ * });
1249
+ * ```
1250
+ */
1251
+ declare class ThemeService {
1252
+ private readonly platformId;
1253
+ private readonly document;
1254
+ private currentThemeSubject;
1255
+ currentTheme$: Observable<ThemePreset | string>;
1256
+ private customThemes;
1257
+ private readonly rootElement;
1258
+ constructor();
1259
+ /**
1260
+ * Get the current active theme
1261
+ */
1262
+ getCurrentTheme(): ThemePreset | string;
1263
+ /**
1264
+ * Set theme to a built-in preset
1265
+ *
1266
+ * @param preset - Built-in theme preset name
1267
+ */
1268
+ setTheme(preset: ThemePreset): void;
1269
+ /**
1270
+ * Apply a custom theme configuration
1271
+ *
1272
+ * @param config - Custom theme configuration
1273
+ */
1274
+ applyCustomTheme(config: OSICardsThemeConfig): void;
1275
+ /**
1276
+ * Apply CSS variables to the document root
1277
+ *
1278
+ * @param variables - Object mapping CSS variable names to values
1279
+ */
1280
+ applyCSSVariables(variables: Record<string, string>): void;
1281
+ /**
1282
+ * Reset CSS variables (useful when switching themes)
1283
+ */
1284
+ resetCSSVariables(): void;
1285
+ /**
1286
+ * Get a custom theme configuration
1287
+ *
1288
+ * @param name - Theme name
1289
+ * @returns Theme configuration or null if not found
1290
+ */
1291
+ getCustomTheme(name: string): OSICardsThemeConfig | null;
1292
+ /**
1293
+ * Register a custom theme (without applying it)
1294
+ *
1295
+ * @param config - Custom theme configuration
1296
+ */
1297
+ registerTheme(config: OSICardsThemeConfig): void;
1298
+ /**
1299
+ * Remove a custom theme
1300
+ *
1301
+ * @param name - Theme name to remove
1302
+ * @returns True if theme was removed, false if not found
1303
+ */
1304
+ unregisterTheme(name: string): boolean;
1305
+ /**
1306
+ * Get all registered custom themes
1307
+ *
1308
+ * @returns Array of custom theme configurations
1309
+ */
1310
+ getCustomThemes(): OSICardsThemeConfig[];
1311
+ /**
1312
+ * Validate a theme configuration
1313
+ *
1314
+ * @param config - Theme configuration to validate
1315
+ * @returns Validation result with errors if any
1316
+ */
1317
+ validateTheme(config: OSICardsThemeConfig): {
1318
+ valid: boolean;
1319
+ errors: string[];
1320
+ };
1321
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThemeService, never>;
1322
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThemeService>;
1323
+ }
1324
+
1325
+ /**
1326
+ * Light theme preset configuration
1327
+ * Based on the day theme from the design system
1328
+ */
1329
+ declare const lightTheme: OSICardsThemeConfig;
1330
+
1331
+ /**
1332
+ * Dark theme preset configuration
1333
+ * Based on the night theme from the design system
1334
+ */
1335
+ declare const darkTheme: OSICardsThemeConfig;
1336
+
1337
+ /**
1338
+ * High contrast theme preset for accessibility
1339
+ * Provides maximum contrast for better visibility
1340
+ */
1341
+ declare const highContrastTheme: OSICardsThemeConfig;
1342
+
1343
+ /**
1344
+ * Theme Builder Utility
1345
+ *
1346
+ * Helper functions for building and modifying theme configurations
1347
+ */
1348
+ /**
1349
+ * Create a theme configuration from a base theme with overrides
1350
+ *
1351
+ * @param baseTheme - Base theme configuration
1352
+ * @param overrides - Variable overrides to apply
1353
+ * @returns New theme configuration with overrides applied
1354
+ *
1355
+ * @example
1356
+ * ```typescript
1357
+ * const customTheme = buildThemeFromBase(lightTheme, {
1358
+ * '--color-brand': '#ff0000',
1359
+ * '--card-padding': '24px'
1360
+ * });
1361
+ * ```
1362
+ */
1363
+ declare function buildThemeFromBase(baseTheme: OSICardsThemeConfig, overrides: Record<string, string>): OSICardsThemeConfig;
1364
+ /**
1365
+ * Merge multiple theme configurations
1366
+ * Later themes override earlier ones
1367
+ *
1368
+ * @param themes - Array of theme configurations to merge
1369
+ * @returns Merged theme configuration
1370
+ */
1371
+ declare function mergeThemes(...themes: OSICardsThemeConfig[]): OSICardsThemeConfig;
1372
+ /**
1373
+ * Create a theme with only specific CSS variables
1374
+ * Useful for partial theme customization
1375
+ *
1376
+ * @param name - Theme name
1377
+ * @param variables - CSS variables to include
1378
+ * @returns Theme configuration with only specified variables
1379
+ */
1380
+ declare function createPartialTheme(name: string, variables: Record<string, string>): OSICardsThemeConfig;
1381
+ /**
1382
+ * Validate CSS variable names
1383
+ *
1384
+ * @param variables - Object with CSS variable names as keys
1385
+ * @returns Array of invalid variable names
1386
+ */
1387
+ declare function validateCSSVariableNames(variables: Record<string, string>): string[];
1388
+ /**
1389
+ * Generate a theme from a color palette
1390
+ * Automatically generates related CSS variables from base colors
1391
+ *
1392
+ * @param name - Theme name
1393
+ * @param colors - Color palette object
1394
+ * @returns Theme configuration with generated variables
1395
+ *
1396
+ * @example
1397
+ * ```typescript
1398
+ * const theme = generateThemeFromPalette('my-brand', {
1399
+ * primary: '#ff7900',
1400
+ * background: '#ffffff',
1401
+ * foreground: '#000000'
1402
+ * });
1403
+ * ```
1404
+ */
1405
+ declare function generateThemeFromPalette(name: string, colors: {
1406
+ primary?: string;
1407
+ secondary?: string;
1408
+ background?: string;
1409
+ foreground?: string;
1410
+ muted?: string;
1411
+ border?: string;
1412
+ }): OSICardsThemeConfig;
1413
+
1414
+ /**
1415
+ * Company Card Preset
1416
+ *
1417
+ * Factory functions for creating company profile cards with common sections.
1418
+ */
1419
+ /**
1420
+ * Options for company card preset
1421
+ */
1422
+ interface CompanyCardOptions {
1423
+ /** Company name */
1424
+ name: string;
1425
+ /** Company subtitle/description */
1426
+ subtitle?: string;
1427
+ /** Industry */
1428
+ industry?: string;
1429
+ /** Founded year */
1430
+ founded?: string;
1431
+ /** Number of employees */
1432
+ employees?: string;
1433
+ /** Headquarters location */
1434
+ headquarters?: string;
1435
+ /** Annual revenue */
1436
+ revenue?: string;
1437
+ /** Growth rate percentage */
1438
+ growthRate?: number;
1439
+ /** Market share percentage */
1440
+ marketShare?: number;
1441
+ /** Website URL */
1442
+ websiteUrl?: string;
1443
+ /** Additional custom sections */
1444
+ customSections?: CardSection[];
1445
+ /** Custom actions */
1446
+ customActions?: CardAction[];
1447
+ }
1448
+ /**
1449
+ * Create a basic company card
1450
+ *
1451
+ * @param options - Company card options
1452
+ * @returns AICardConfig for a company card
1453
+ *
1454
+ * @example
1455
+ * ```typescript
1456
+ * const card = createCompanyCard({
1457
+ * name: 'Acme Corp',
1458
+ * industry: 'Technology',
1459
+ * employees: '500+',
1460
+ * websiteUrl: 'https://acme.com'
1461
+ * });
1462
+ * ```
1463
+ */
1464
+ declare function createCompanyCard(options: CompanyCardOptions): AICardConfig;
1465
+ /**
1466
+ * Create an enhanced company card with more sections
1467
+ */
1468
+ declare function createEnhancedCompanyCard(options: CompanyCardOptions & {
1469
+ financials?: Array<{
1470
+ label: string;
1471
+ value: string | number;
1472
+ }>;
1473
+ products?: Array<{
1474
+ name: string;
1475
+ description?: string;
1476
+ }>;
1477
+ }): AICardConfig;
1478
+
1479
+ /**
1480
+ * Contact Card Preset
1481
+ *
1482
+ * Factory functions for creating contact profile cards.
1483
+ */
1484
+ /**
1485
+ * Options for contact card preset
1486
+ */
1487
+ interface ContactCardOptions {
1488
+ /** Contact name */
1489
+ name: string;
1490
+ /** Job title */
1491
+ jobTitle?: string;
1492
+ /** Company name */
1493
+ company?: string;
1494
+ /** Location */
1495
+ location?: string;
1496
+ /** Years of experience */
1497
+ experience?: string;
1498
+ /** Email address */
1499
+ email?: string;
1500
+ /** Phone number */
1501
+ phone?: string;
1502
+ /** LinkedIn URL */
1503
+ linkedIn?: string;
1504
+ /** Performance metrics */
1505
+ metrics?: Array<{
1506
+ label: string;
1507
+ value: string | number;
1508
+ percentage?: number;
1509
+ trend?: 'up' | 'down' | 'stable';
1510
+ }>;
1511
+ /** Custom sections */
1512
+ customSections?: CardSection[];
1513
+ /** Custom actions */
1514
+ customActions?: CardAction[];
1515
+ }
1516
+ /**
1517
+ * Create a basic contact card
1518
+ *
1519
+ * @param options - Contact card options
1520
+ * @returns AICardConfig for a contact card
1521
+ *
1522
+ * @example
1523
+ * ```typescript
1524
+ * const card = createContactCard({
1525
+ * name: 'John Doe',
1526
+ * jobTitle: 'Sales Director',
1527
+ * email: 'john@example.com',
1528
+ * phone: '+1 555 1234'
1529
+ * });
1530
+ * ```
1531
+ */
1532
+ declare function createContactCard(options: ContactCardOptions): AICardConfig;
1533
+
1534
+ /**
1535
+ * Analytics Dashboard Preset
1536
+ *
1537
+ * Factory functions for creating analytics dashboard cards.
1538
+ */
1539
+ /**
1540
+ * Options for analytics dashboard preset
1541
+ */
1542
+ interface AnalyticsDashboardOptions {
1543
+ /** Dashboard title */
1544
+ title: string;
1545
+ /** Dashboard subtitle */
1546
+ subtitle?: string;
1547
+ /** Dashboard type */
1548
+ dashboardType?: string;
1549
+ /** Data source */
1550
+ dataSource?: string;
1551
+ /** Update frequency */
1552
+ updateFrequency?: string;
1553
+ /** Time range */
1554
+ timeRange?: string;
1555
+ /** Key performance indicators */
1556
+ kpis?: Array<{
1557
+ label: string;
1558
+ value: string | number;
1559
+ percentage?: number;
1560
+ performance?: 'excellent' | 'good' | 'fair' | 'poor';
1561
+ trend?: 'up' | 'down' | 'stable' | 'neutral';
1562
+ }>;
1563
+ /** Chart data (optional) */
1564
+ chartData?: {
1565
+ labels: string[];
1566
+ datasets: Array<{
1567
+ label: string;
1568
+ data: number[];
1569
+ }>;
1570
+ };
1571
+ /** Dashboard URL */
1572
+ dashboardUrl?: string;
1573
+ /** Custom sections */
1574
+ customSections?: CardSection[];
1575
+ /** Custom actions */
1576
+ customActions?: CardAction[];
1577
+ }
1578
+ /**
1579
+ * Create an analytics dashboard card
1580
+ *
1581
+ * @param options - Analytics dashboard options
1582
+ * @returns AICardConfig for an analytics dashboard
1583
+ *
1584
+ * @example
1585
+ * ```typescript
1586
+ * const card = createAnalyticsDashboard({
1587
+ * title: 'Sales Performance',
1588
+ * kpis: [
1589
+ * { label: 'Revenue', value: '$1.2M', percentage: 105, trend: 'up' },
1590
+ * { label: 'Conversion Rate', value: '32%', percentage: 32, trend: 'up' }
1591
+ * ]
1592
+ * });
1593
+ * ```
1594
+ */
1595
+ declare function createAnalyticsDashboard(options: AnalyticsDashboardOptions): AICardConfig;
1596
+
1597
+ /**
1598
+ * Preset Factory
1599
+ *
1600
+ * Centralized factory for creating card presets with common configurations.
1601
+ *
1602
+ * @example
1603
+ * ```typescript
1604
+ * import { PresetFactory } from 'osi-cards-lib';
1605
+ *
1606
+ * // Create a company card
1607
+ * const companyCard = PresetFactory.createCompany({
1608
+ * name: 'Acme Corp',
1609
+ * industry: 'Technology'
1610
+ * });
1611
+ *
1612
+ * // Create a contact card
1613
+ * const contactCard = PresetFactory.createContact({
1614
+ * name: 'John Doe',
1615
+ * email: 'john@example.com'
1616
+ * });
1617
+ * ```
1618
+ */
1619
+ declare class PresetFactory {
1620
+ /**
1621
+ * Create a company card
1622
+ *
1623
+ * @param options - Company card options
1624
+ * @returns Company card configuration
1625
+ */
1626
+ static createCompany(options: CompanyCardOptions): AICardConfig;
1627
+ /**
1628
+ * Create an enhanced company card with additional sections
1629
+ *
1630
+ * @param options - Enhanced company card options
1631
+ * @returns Enhanced company card configuration
1632
+ */
1633
+ static createEnhancedCompany(options: CompanyCardOptions & {
1634
+ financials?: Array<{
1635
+ label: string;
1636
+ value: string | number;
1637
+ }>;
1638
+ products?: Array<{
1639
+ name: string;
1640
+ description?: string;
1641
+ }>;
1642
+ }): AICardConfig;
1643
+ /**
1644
+ * Create a contact card
1645
+ *
1646
+ * @param options - Contact card options
1647
+ * @returns Contact card configuration
1648
+ */
1649
+ static createContact(options: ContactCardOptions): AICardConfig;
1650
+ /**
1651
+ * Create an analytics dashboard card
1652
+ *
1653
+ * @param options - Analytics dashboard options
1654
+ * @returns Analytics dashboard configuration
1655
+ */
1656
+ static createAnalytics(options: AnalyticsDashboardOptions): AICardConfig;
1657
+ /**
1658
+ * Create a custom card from a template
1659
+ *
1660
+ * @param template - Template function that returns AICardConfig
1661
+ * @returns Card configuration
1662
+ */
1663
+ static createCustom<T extends AICardConfig>(template: (config: Partial<T>) => T, config: Partial<T>): AICardConfig;
1664
+ }
1665
+ /**
1666
+ * Convenience factory functions (alternative to PresetFactory class)
1667
+ */
1668
+ /**
1669
+ * Create a company card (convenience function)
1670
+ */
1671
+ declare function createCompanyPreset(options: CompanyCardOptions): AICardConfig;
1672
+ /**
1673
+ * Create a contact card (convenience function)
1674
+ */
1675
+ declare function createContactPreset(options: ContactCardOptions): AICardConfig;
1676
+ /**
1677
+ * Create an analytics dashboard (convenience function)
1678
+ */
1679
+ declare function createAnalyticsPreset(options: AnalyticsDashboardOptions): AICardConfig;
1680
+
668
1681
  interface MasonryLayoutInfo {
669
1682
  breakpoint: Breakpoint;
670
1683
  columns: number;
@@ -744,6 +1757,8 @@ declare class AICardRendererComponent implements OnInit, AfterViewInit, OnDestro
744
1757
  private _cardConfig?;
745
1758
  private readonly el;
746
1759
  private readonly cdr;
1760
+ private readonly injector;
1761
+ private readonly platformId;
747
1762
  Math: Math;
748
1763
  private previousSectionsHash;
749
1764
  private normalizedSectionCache;
@@ -885,6 +1900,11 @@ declare class AICardRendererComponent implements OnInit, AfterViewInit, OnDestro
885
1900
  private mergeWithPreviousOrder;
886
1901
  private getSectionKey;
887
1902
  private resetProcessedSections;
1903
+ /**
1904
+ * Validates that animation providers are configured.
1905
+ * Warns in development mode if animations are not available.
1906
+ */
1907
+ private validateAnimationsProvider;
888
1908
  static ɵfac: i0.ɵɵFactoryDeclaration<AICardRendererComponent, never>;
889
1909
  static ɵcmp: i0.ɵɵComponentDeclaration<AICardRendererComponent, "app-ai-card-renderer", never, { "cardConfig": { "alias": "cardConfig"; "required": false; }; "updateSource": { "alias": "updateSource"; "required": false; }; "isFullscreen": { "alias": "isFullscreen"; "required": false; }; "tiltEnabled": { "alias": "tiltEnabled"; "required": false; }; "streamingStage": { "alias": "streamingStage"; "required": false; }; "streamingProgress": { "alias": "streamingProgress"; "required": false; }; "streamingProgressLabel": { "alias": "streamingProgressLabel"; "required": false; }; "changeType": { "alias": "changeType"; "required": false; }; }, { "fieldInteraction": "fieldInteraction"; "cardInteraction": "cardInteraction"; "fullscreenToggle": "fullscreenToggle"; "agentAction": "agentAction"; "questionAction": "questionAction"; }, never, never, true, never>;
890
1910
  }
@@ -946,6 +1966,109 @@ declare class CardPreviewComponent implements OnInit, OnChanges, OnDestroy {
946
1966
  static ɵcmp: i0.ɵɵComponentDeclaration<CardPreviewComponent, "app-card-preview", never, { "generatedCard": { "alias": "generatedCard"; "required": false; }; "isGenerating": { "alias": "isGenerating"; "required": false; }; "isInitialized": { "alias": "isInitialized"; "required": false; }; "isFullscreen": { "alias": "isFullscreen"; "required": false; }; }, { "cardInteraction": "cardInteraction"; "fieldInteraction": "fieldInteraction"; "fullscreenToggle": "fullscreenToggle"; "agentAction": "agentAction"; "questionAction": "questionAction"; }, never, never, true, never>;
947
1967
  }
948
1968
 
1969
+ /**
1970
+ * Card Header Component
1971
+ *
1972
+ * Composable component for rendering card header with title, subtitle, and optional actions.
1973
+ * Can be used independently or as part of the full card renderer.
1974
+ *
1975
+ * @example
1976
+ * ```html
1977
+ * <app-card-header
1978
+ * [title]="card.cardTitle"
1979
+ * [subtitle]="card.cardSubtitle"
1980
+ * [showFullscreenButton]="true"
1981
+ * [isFullscreen]="false"
1982
+ * (fullscreenToggle)="onFullscreenToggle($event)">
1983
+ * </app-card-header>
1984
+ * ```
1985
+ */
1986
+ declare class CardHeaderComponent {
1987
+ /** Card title */
1988
+ title?: string;
1989
+ /** Card subtitle */
1990
+ subtitle?: string;
1991
+ /** Whether to show fullscreen toggle button */
1992
+ showFullscreenButton: boolean;
1993
+ /** Current fullscreen state */
1994
+ isFullscreen: boolean;
1995
+ /** Emitted when fullscreen button is clicked */
1996
+ fullscreenToggle: EventEmitter<boolean>;
1997
+ onFullscreenClick(): void;
1998
+ static ɵfac: i0.ɵɵFactoryDeclaration<CardHeaderComponent, never>;
1999
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardHeaderComponent, "app-card-header", never, { "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "showFullscreenButton": { "alias": "showFullscreenButton"; "required": false; }; "isFullscreen": { "alias": "isFullscreen"; "required": false; }; }, { "fullscreenToggle": "fullscreenToggle"; }, never, never, true, never>;
2000
+ }
2001
+
2002
+ /**
2003
+ * Card Body Component
2004
+ *
2005
+ * Composable component for rendering card body with sections in a masonry grid layout.
2006
+ * Wraps MasonryGridComponent for easier composition.
2007
+ *
2008
+ * @example
2009
+ * ```html
2010
+ * <app-card-body
2011
+ * [sections]="card.sections"
2012
+ * [gap]="12"
2013
+ * [minColumnWidth]="280"
2014
+ * (sectionEvent)="onSectionEvent($event)"
2015
+ * (layoutChange)="onLayoutChange($event)">
2016
+ * </app-card-body>
2017
+ * ```
2018
+ */
2019
+ declare class CardBodyComponent {
2020
+ /** Sections to render */
2021
+ sections: CardSection[];
2022
+ /** Gap between grid items in pixels */
2023
+ gap: number;
2024
+ /** Minimum column width in pixels */
2025
+ minColumnWidth: number;
2026
+ /** Emitted when a section event occurs */
2027
+ sectionEvent: EventEmitter<SectionRenderEvent>;
2028
+ /** Emitted when layout changes */
2029
+ layoutChange: EventEmitter<MasonryLayoutInfo>;
2030
+ onSectionEvent(event: SectionRenderEvent): void;
2031
+ onLayoutChange(info: MasonryLayoutInfo): void;
2032
+ static ɵfac: i0.ɵɵFactoryDeclaration<CardBodyComponent, never>;
2033
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardBodyComponent, "app-card-body", never, { "sections": { "alias": "sections"; "required": false; }; "gap": { "alias": "gap"; "required": false; }; "minColumnWidth": { "alias": "minColumnWidth"; "required": false; }; }, { "sectionEvent": "sectionEvent"; "layoutChange": "layoutChange"; }, never, ["*"], true, never>;
2034
+ }
2035
+
2036
+ /**
2037
+ * Card Footer Component
2038
+ *
2039
+ * Composable component for rendering card footer with actions and optional signature.
2040
+ * Can be used independently or as part of the full card renderer.
2041
+ *
2042
+ * @example
2043
+ * ```html
2044
+ * <app-card-footer
2045
+ * [actions]="card.actions"
2046
+ * [showSignature]="true"
2047
+ * (actionClick)="onActionClick($event)">
2048
+ * </app-card-footer>
2049
+ * ```
2050
+ */
2051
+ declare class CardFooterComponent {
2052
+ /** Actions to display */
2053
+ actions: CardAction[];
2054
+ /** Whether to show the signature */
2055
+ showSignature: boolean;
2056
+ /** Signature text to display */
2057
+ signatureText: string;
2058
+ /** Emitted when an action is clicked */
2059
+ actionClick: EventEmitter<CardAction>;
2060
+ private readonly iconService;
2061
+ get hasActions(): boolean;
2062
+ trackAction(index: number, action: CardAction): string;
2063
+ getActionButtonClasses(action: CardAction): Record<string, boolean>;
2064
+ getActionIconNameForDisplay(action: CardAction): string | null;
2065
+ hasImageIcon(action: CardAction): boolean;
2066
+ hasTextIcon(action: CardAction): boolean;
2067
+ onActionClick(action: CardAction): void;
2068
+ static ɵfac: i0.ɵɵFactoryDeclaration<CardFooterComponent, never>;
2069
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardFooterComponent, "app-card-footer", never, { "actions": { "alias": "actions"; "required": false; }; "showSignature": { "alias": "showSignature"; "required": false; }; "signatureText": { "alias": "signatureText"; "required": false; }; }, { "actionClick": "actionClick"; }, never, never, true, never>;
2070
+ }
2071
+
949
2072
  type AnalyticsField = CardField & {
950
2073
  change?: number;
951
2074
  trend?: 'up' | 'down' | 'stable';
@@ -1302,5 +2425,5 @@ declare class TextReferenceSectionComponent extends BaseSectionComponent<TextRef
1302
2425
  static ɵcmp: i0.ɵɵComponentDeclaration<TextReferenceSectionComponent, "app-text-reference-section", never, {}, {}, never, never, true, never>;
1303
2426
  }
1304
2427
 
1305
- export { AICardRendererComponent, AnalyticsSectionComponent, BaseSectionComponent, BrandColorsSectionComponent, CardDiffUtil, CardPreviewComponent, CardSkeletonComponent, CardTypeGuards, CardUtils, ChartSectionComponent, ContactCardSectionComponent, EventSectionComponent, FallbackSectionComponent, FinancialsSectionComponent, IconService, InfoSectionComponent, ListSectionComponent, LucideIconsModule, MagneticTiltService, MapSectionComponent, MasonryGridComponent, NetworkCardSectionComponent, NewsSectionComponent, OverviewSectionComponent, ProductSectionComponent, QuotationSectionComponent, SectionNormalizationService, SectionRendererComponent, SectionUtilsService, SocialMediaSectionComponent, SolutionsSectionComponent, TextReferenceSectionComponent, getBreakpointFromWidth };
1306
- export type { AICardConfig, AgentCardAction, Breakpoint, CardAction, CardActionButtonType, CardChangeType, CardDiffResult, CardField, CardFieldInteractionEvent, CardItem, CardSection, CardType, EmailConfig, EmailContact, InfoSectionFieldInteraction, LegacyCardAction, MailCardAction, MasonryLayoutInfo, MousePosition, PriorityValue, QuestionCardAction, SectionInteraction, SectionRenderEvent, StatusValue, StreamingStage, TiltCalculations, TrendValue, WebsiteCardAction };
2428
+ export { AICardRendererComponent, AnalyticsSectionComponent, BaseSectionComponent, BrandColorsSectionComponent, CardBodyComponent, CardDiffUtil, CardFooterComponent, CardHeaderComponent, CardPreviewComponent, CardSkeletonComponent, CardTypeGuards, CardUtils, ChartSectionComponent, ContactCardSectionComponent, EventMiddlewareService, EventSectionComponent, FallbackSectionComponent, FinancialsSectionComponent, IconService, InfoSectionComponent, ListSectionComponent, LucideIconsModule, MagneticTiltService, MapSectionComponent, MasonryGridComponent, NetworkCardSectionComponent, NewsSectionComponent, OverviewSectionComponent, PresetFactory, ProductSectionComponent, QuotationSectionComponent, SectionNormalizationService, SectionPluginRegistry, SectionRendererComponent, SectionUtilsService, SocialMediaSectionComponent, SolutionsSectionComponent, TextReferenceSectionComponent, ThemeService, areStylesLoaded, buildThemeFromBase, cloneCardConfig, createAnalyticsDashboard, createAnalyticsPreset, createCardFromPartial, createCompanyCard, createCompanyPreset, createContactCard, createContactPreset, createEmptyCard, createEnhancedCompanyCard, createErrorCard, createPartialTheme, createSkeletonCard, darkTheme, generateThemeFromPalette, getBreakpointFromWidth, getCSSVariableValue, highContrastTheme, isCSSVariableDefined, isCardComplete, lightTheme, mergeCardConfig, mergeSections, mergeThemes, prepareCardForStreaming, provideOSICards, updateCardIncremental, validateAndWarnStyles, validateCSSVariableNames, validateCardConfig, validateStyles, waitForStyles };
2429
+ export type { AICardConfig, AgentCardAction, AnalyticsDashboardOptions, Breakpoint, CardAction, CardActionButtonType, CardChangeType, CardDiffResult, CardField, CardFieldInteractionEvent, CardItem, CardSection, CardType, CompanyCardOptions, ContactCardOptions, EmailConfig, EmailContact, EventFilter, EventHandler, EventMiddleware, EventTransformer, InfoSectionFieldInteraction, LegacyCardAction, MailCardAction, MasonryLayoutInfo, MousePosition, OSICardsLibConfig, OSICardsThemeConfig, PriorityValue, QuestionCardAction, RegisteredSectionPlugin, SectionInteraction, SectionPlugin, SectionPluginConfig, SectionPluginMetadata, SectionRenderEvent, StatusValue, StreamingStage, StyleValidationResult, ThemePreset, TiltCalculations, TrendValue, WebsiteCardAction };