osi-cards-lib 1.5.40 → 1.5.41

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
@@ -5936,6 +5936,11 @@ declare class SectionNormalizationService {
5936
5936
  * Actual normalization logic (extracted for caching)
5937
5937
  */
5938
5938
  private performNormalization;
5939
+ /**
5940
+ * Get title from section type (fallback when title is missing)
5941
+ * Converts type like "contact-card" to "Contact Card"
5942
+ */
5943
+ private getTitleFromType;
5939
5944
  /**
5940
5945
  * Get the priority band for a section type
5941
5946
  */
@@ -8913,6 +8918,7 @@ declare class AICardRendererComponent implements OnInit, AfterViewInit, OnDestro
8913
8918
  private readonly magneticTiltService;
8914
8919
  private readonly iconService;
8915
8920
  private readonly sectionNormalizationService;
8921
+ private readonly sectionCompletenessService;
8916
8922
  private readonly http;
8917
8923
  /**
8918
8924
  * Optional LLM API endpoint for fallback card generation.
@@ -9411,6 +9417,18 @@ declare class SectionHeaderComponent {
9411
9417
  * Get the heading tag name based on level
9412
9418
  */
9413
9419
  get headingTag(): string;
9420
+ /**
9421
+ * Track expanded state for description
9422
+ */
9423
+ isDescriptionExpanded: boolean;
9424
+ /**
9425
+ * Toggle expanded state for description
9426
+ */
9427
+ toggleDescriptionExpanded(): void;
9428
+ /**
9429
+ * Check if description is long enough to need expansion
9430
+ */
9431
+ shouldShowExpandButton(): boolean;
9414
9432
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionHeaderComponent, never>;
9415
9433
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionHeaderComponent, "lib-section-header", never, { "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "level": { "alias": "level"; "required": false; }; "headerClass": { "alias": "headerClass"; "required": false; }; "titleClass": { "alias": "titleClass"; "required": false; }; "descriptionClass": { "alias": "descriptionClass"; "required": false; }; }, {}, never, never, true, never>;
9416
9434
  }
@@ -10477,6 +10495,18 @@ declare class InfoSectionComponent extends BaseSectionComponent implements OnIni
10477
10495
  * Get tagline/description from section or fields
10478
10496
  */
10479
10497
  getTagline(): string | null;
10498
+ /**
10499
+ * Track tagline expansion state
10500
+ */
10501
+ isTaglineExpanded: boolean;
10502
+ /**
10503
+ * Toggle tagline expansion
10504
+ */
10505
+ toggleTaglineExpanded(): void;
10506
+ /**
10507
+ * Check if tagline needs "Show more" button
10508
+ */
10509
+ shouldShowTaglineExpandButton(): boolean;
10480
10510
  /**
10481
10511
  * Get website URL from fields
10482
10512
  */
@@ -10585,6 +10615,14 @@ declare class ListSectionComponent extends BaseSectionComponent implements OnIni
10585
10615
  getPriorityVariant(priority?: string): 'error' | 'warning' | 'success' | 'default';
10586
10616
  toggleExpanded(index: number): void;
10587
10617
  onItemKeydown(event: KeyboardEvent, index: number): void;
10618
+ /**
10619
+ * Check if a description is long enough to need expansion
10620
+ */
10621
+ shouldShowExpandButton(item: any): boolean;
10622
+ /**
10623
+ * Check if an item is expanded
10624
+ */
10625
+ isItemExpanded(index: number): boolean;
10588
10626
  static ɵfac: i0.ɵɵFactoryDeclaration<ListSectionComponent, never>;
10589
10627
  static ɵcmp: i0.ɵɵComponentDeclaration<ListSectionComponent, "lib-list-section", never, {}, {}, never, never, true, never>;
10590
10628
  }
@@ -10648,6 +10686,22 @@ declare class NetworkCardSectionComponent extends BaseSectionComponent implement
10648
10686
  * Get status class
10649
10687
  */
10650
10688
  getStatusClass(status?: unknown): string;
10689
+ /**
10690
+ * Track expanded state for descriptions
10691
+ */
10692
+ descriptionExpandedStates: boolean[];
10693
+ /**
10694
+ * Toggle description expansion
10695
+ */
10696
+ toggleDescriptionExpanded(index: number): void;
10697
+ /**
10698
+ * Check if description is expanded
10699
+ */
10700
+ isDescriptionExpanded(index: number): boolean;
10701
+ /**
10702
+ * Check if description needs "Show more" button
10703
+ */
10704
+ shouldShowExpandButton(node: any): boolean;
10651
10705
  static ɵfac: i0.ɵɵFactoryDeclaration<NetworkCardSectionComponent, never>;
10652
10706
  static ɵcmp: i0.ɵɵComponentDeclaration<NetworkCardSectionComponent, "lib-network-card-section", never, {}, {}, never, never, true, never>;
10653
10707
  }
@@ -10678,6 +10732,22 @@ declare class NewsSectionComponent extends BaseSectionComponent implements OnIni
10678
10732
  * Format date for display
10679
10733
  */
10680
10734
  formatDate(dateStr: any): string;
10735
+ /**
10736
+ * Track expanded state for each article
10737
+ */
10738
+ expandedArticles: Set<number>;
10739
+ /**
10740
+ * Toggle expanded state for an article
10741
+ */
10742
+ toggleExpanded(index: number): void;
10743
+ /**
10744
+ * Check if an article is expanded
10745
+ */
10746
+ isExpanded(index: number): boolean;
10747
+ /**
10748
+ * Check if an excerpt is long enough to need expansion
10749
+ */
10750
+ shouldShowExpandButton(item: any): boolean;
10681
10751
  static ɵfac: i0.ɵɵFactoryDeclaration<NewsSectionComponent, never>;
10682
10752
  static ɵcmp: i0.ɵɵComponentDeclaration<NewsSectionComponent, "lib-news-section", never, {}, {}, never, never, true, never>;
10683
10753
  }
@@ -10703,6 +10773,22 @@ declare class OverviewSectionComponent extends BaseSectionComponent implements O
10703
10773
  * Check if field should be highlighted
10704
10774
  */
10705
10775
  isHighlighted(field: any): boolean;
10776
+ /**
10777
+ * Track expanded state for each field
10778
+ */
10779
+ expandedFields: Set<number>;
10780
+ /**
10781
+ * Toggle expanded state for a field
10782
+ */
10783
+ toggleExpanded(index: number): void;
10784
+ /**
10785
+ * Check if a field is expanded
10786
+ */
10787
+ isExpanded(index: number): boolean;
10788
+ /**
10789
+ * Check if a value is long enough to need expansion
10790
+ */
10791
+ shouldShowExpandButton(field: any): boolean;
10706
10792
  static ɵfac: i0.ɵɵFactoryDeclaration<OverviewSectionComponent, never>;
10707
10793
  static ɵcmp: i0.ɵɵComponentDeclaration<OverviewSectionComponent, "lib-overview-section", never, {}, {}, never, never, true, never>;
10708
10794
  }
@@ -10766,6 +10852,14 @@ declare class QuotationSectionComponent extends BaseSectionComponent implements
10766
10852
  getAuthorName(field: any): string;
10767
10853
  toggleExpanded(index: number): void;
10768
10854
  onQuoteKeydown(event: KeyboardEvent, index: number): void;
10855
+ /**
10856
+ * Check if a quote is long enough to need expansion
10857
+ */
10858
+ shouldShowExpandButton(field: any): boolean;
10859
+ /**
10860
+ * Check if a quote is expanded
10861
+ */
10862
+ isQuoteExpanded(index: number): boolean;
10769
10863
  static ɵfac: i0.ɵɵFactoryDeclaration<QuotationSectionComponent, never>;
10770
10864
  static ɵcmp: i0.ɵɵComponentDeclaration<QuotationSectionComponent, "lib-quotation-section", never, {}, {}, never, never, true, never>;
10771
10865
  }
@@ -10809,6 +10903,7 @@ declare class SocialMediaSectionComponent extends BaseSectionComponent implement
10809
10903
  declare class SolutionsSectionComponent extends BaseSectionComponent implements OnInit {
10810
10904
  private readonly layoutService;
10811
10905
  expandedIndex: number | null;
10906
+ descriptionExpandedStates: boolean[];
10812
10907
  ngOnInit(): void;
10813
10908
  /**
10814
10909
  * Calculate layout preferences for solutions section based on content.
@@ -10830,6 +10925,18 @@ declare class SolutionsSectionComponent extends BaseSectionComponent implements
10830
10925
  toggleExpanded(index: number): void;
10831
10926
  isExpanded(index: number): boolean;
10832
10927
  getVisibleBenefits(benefits: string[] | undefined, index: number): string[];
10928
+ /**
10929
+ * Check if description needs "Show more" button
10930
+ */
10931
+ shouldShowExpandButton(solution: any): boolean;
10932
+ /**
10933
+ * Toggle description expansion
10934
+ */
10935
+ toggleDescriptionExpanded(index: number): void;
10936
+ /**
10937
+ * Check if description is expanded
10938
+ */
10939
+ isDescriptionExpanded(index: number): boolean;
10833
10940
  static ɵfac: i0.ɵɵFactoryDeclaration<SolutionsSectionComponent, never>;
10834
10941
  static ɵcmp: i0.ɵɵComponentDeclaration<SolutionsSectionComponent, "lib-solutions-section", never, {}, {}, never, never, true, never>;
10835
10942
  }
@@ -10860,6 +10967,22 @@ declare class TextReferenceSectionComponent extends BaseSectionComponent impleme
10860
10967
  * Get reference content
10861
10968
  */
10862
10969
  getReferenceContent(field: any): string;
10970
+ /**
10971
+ * Track expanded state for each reference item
10972
+ */
10973
+ expandedItems: Set<number>;
10974
+ /**
10975
+ * Toggle expanded state for a reference item
10976
+ */
10977
+ toggleExpanded(index: number): void;
10978
+ /**
10979
+ * Check if a reference item is expanded
10980
+ */
10981
+ isExpanded(index: number): boolean;
10982
+ /**
10983
+ * Check if a reference content is long enough to need expansion
10984
+ */
10985
+ shouldShowExpandButton(field: any): boolean;
10863
10986
  static ɵfac: i0.ɵɵFactoryDeclaration<TextReferenceSectionComponent, never>;
10864
10987
  static ɵcmp: i0.ɵɵComponentDeclaration<TextReferenceSectionComponent, "lib-text-reference-section", never, {}, {}, never, never, true, never>;
10865
10988
  }
@@ -11496,11 +11619,11 @@ declare function packWithZeroGapsGuarantee(sections: CardSection[], columns?: nu
11496
11619
  * Do not edit manually - generated by scripts/generate-version.js
11497
11620
  *
11498
11621
  * Source of truth: version.config.json
11499
- * Last synced: 2025-12-15T12:34:41.034Z
11622
+ * Last synced: 2025-12-15T18:48:03.906Z
11500
11623
  */
11501
- declare const VERSION = "1.5.40";
11502
- declare const BUILD_DATE = "2025-12-15T12:34:41.034Z";
11503
- declare const BUILD_HASH = "5e74926";
11624
+ declare const VERSION = "1.5.41";
11625
+ declare const BUILD_DATE = "2025-12-15T18:48:03.906Z";
11626
+ declare const BUILD_HASH = "6071ff4";
11504
11627
  declare const BUILD_BRANCH = "main";
11505
11628
  interface VersionInfo {
11506
11629
  version: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osi-cards-lib",
3
- "version": "1.5.40",
3
+ "version": "1.5.41",
4
4
  "description": "Standalone OSI Cards library for Angular applications with CSS Layer support for easy style overrides",
5
5
  "keywords": [
6
6
  "angular",
@@ -18,6 +18,8 @@
18
18
  --section-title-underline-height: var(--osi-section-title-underline-height);
19
19
  --section-title-underline-offset: var(--osi-section-title-underline-offset);
20
20
  --section-title-hover-color: var(--osi-section-title-hover-color);
21
+ width: 100% !important;
22
+ max-width: 100% !important;
21
23
  height: auto !important;
22
24
  min-height: 0 !important;
23
25
  max-height: none !important;
@@ -342,3 +344,36 @@
342
344
 
343
345
  /* Theme system handles all light/dark variations automatically */
344
346
  /* All colors adapt through CSS variables defined in tokens/_master.scss */
347
+
348
+ /* ============================================================
349
+ GLOBAL SECTION CONTENT WIDTH RULES
350
+ Ensure all section content expands to use full available width
351
+ ============================================================ */
352
+
353
+ .section-content {
354
+ width: 100% !important;
355
+ max-width: 100% !important;
356
+ min-width: 0 !important; // Allow shrinking for proper resizing
357
+ box-sizing: border-box !important;
358
+ display: flex !important;
359
+ flex-direction: column !important;
360
+ }
361
+
362
+ /* Ensure FAQ section specifically resizes properly */
363
+ .ai-section--faq {
364
+ min-width: 0 !important; // Override any min-width constraints
365
+ width: 100% !important;
366
+ max-width: 100% !important;
367
+
368
+ .list {
369
+ min-width: 0 !important;
370
+ width: 100% !important;
371
+ max-width: 100% !important;
372
+ }
373
+
374
+ .item {
375
+ min-width: 0 !important;
376
+ width: 100% !important;
377
+ max-width: 100% !important;
378
+ }
379
+ }
@@ -18,6 +18,14 @@
18
18
  grid-template-columns: repeat(auto-fit, minmax($min-width, 1fr));
19
19
  min-height: 0;
20
20
  box-sizing: border-box;
21
+ max-width: 100%;
22
+ overflow-x: hidden;
23
+ word-wrap: break-word;
24
+ overflow-wrap: break-word;
25
+
26
+ @media (max-width: 600px) {
27
+ grid-template-columns: 1fr;
28
+ }
21
29
 
22
30
  @media (max-width: 420px) {
23
31
  grid-template-columns: 1fr;
@@ -34,10 +42,100 @@
34
42
  grid-template-columns: repeat(auto-fit, minmax($min-width, 1fr));
35
43
  min-height: 0;
36
44
  box-sizing: border-box;
45
+ max-width: 100%;
46
+ overflow-x: hidden;
47
+ word-wrap: break-word;
48
+ overflow-wrap: break-word;
37
49
 
38
50
  @media (max-width: $tablet-breakpoint) {
39
51
  grid-template-columns: 1fr;
40
52
  }
53
+
54
+ @media (max-width: 600px) {
55
+ grid-template-columns: 1fr;
56
+ }
57
+ }
58
+
59
+ // =====================================================================
60
+ // RESPONSIVE SINGLE COLUMN MIXIN
61
+ // =====================================================================
62
+
63
+ @mixin responsive-single-column($breakpoint: 600px) {
64
+ @media (max-width: $breakpoint) {
65
+ grid-template-columns: 1fr !important;
66
+ }
67
+ }
68
+
69
+ // =====================================================================
70
+ // TEXT OVERFLOW ELLIPSIS MIXIN
71
+ // =====================================================================
72
+
73
+ @mixin text-overflow-ellipsis($lines: 1) {
74
+ @if $lines == unset {
75
+ display: block;
76
+ -webkit-line-clamp: unset;
77
+ overflow: visible;
78
+ } @else {
79
+ display: -webkit-box;
80
+ -webkit-line-clamp: $lines;
81
+ -webkit-box-orient: vertical;
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ }
85
+ word-break: break-word;
86
+ overflow-wrap: break-word;
87
+ word-wrap: break-word;
88
+ max-width: 100%;
89
+ box-sizing: border-box;
90
+ }
91
+
92
+ // =====================================================================
93
+ // EXPANDABLE TEXT MIXIN
94
+ // =====================================================================
95
+
96
+ @mixin expandable-text($max-lines: 3) {
97
+ display: -webkit-box;
98
+ -webkit-line-clamp: $max-lines;
99
+ -webkit-box-orient: vertical;
100
+ overflow: hidden;
101
+ word-break: break-word;
102
+ overflow-wrap: break-word;
103
+ word-wrap: break-word;
104
+ max-width: 100%;
105
+ box-sizing: border-box;
106
+
107
+ &--expanded {
108
+ display: block;
109
+ -webkit-line-clamp: unset;
110
+ overflow: visible;
111
+ }
112
+ }
113
+
114
+ // =====================================================================
115
+ // BUTTON TEXT MINIMAL MIXIN
116
+ // =====================================================================
117
+
118
+ @mixin button-text-minimal {
119
+ align-self: flex-start;
120
+ background: none;
121
+ border: none;
122
+ color: var(--accent);
123
+ font-size: 0.7rem;
124
+ font-weight: var(--font-medium);
125
+ cursor: pointer;
126
+ padding: var(--osi-spacing-compact-xs, 2px) 0;
127
+ transition: opacity 200ms var(--ease-out);
128
+
129
+ &:hover {
130
+ text-decoration: underline;
131
+ opacity: 0.8;
132
+ }
133
+
134
+ &:focus-visible {
135
+ outline: 2px solid var(--accent);
136
+ outline-offset: 2px;
137
+ border-radius: 2px;
138
+ }
41
139
  }
42
140
 
43
141
  // =====================================================================
@@ -59,8 +157,12 @@
59
157
  cursor: pointer;
60
158
  position: relative;
61
159
  overflow: hidden;
160
+ overflow-x: hidden; /* Prevent horizontal scrolling */
161
+ max-width: 100%;
62
162
  box-sizing: border-box;
63
163
  text-align: left;
164
+ word-wrap: break-word;
165
+ overflow-wrap: break-word;
64
166
 
65
167
  transition:
66
168
  background var(--duration-base) var(--ease-out),
@@ -116,14 +116,17 @@
116
116
  height: fit-content;
117
117
  min-height: fit-content;
118
118
  width: 100%;
119
+ max-width: 100%;
119
120
  break-inside: avoid;
120
121
  page-break-inside: avoid;
121
122
  display: flex;
122
123
  flex-direction: column;
123
124
  overflow: visible;
125
+ overflow-x: hidden; /* Prevent horizontal scrolling */
124
126
  box-sizing: border-box;
125
127
  overflow-wrap: break-word;
126
128
  word-wrap: break-word;
129
+ word-break: break-word; /* Break long unbreakable strings */
127
130
 
128
131
  /* Performance optimization: CSS containment */
129
132
  contain: layout style paint;
@@ -155,6 +158,11 @@
155
158
  height: auto !important;
156
159
  min-height: fit-content !important;
157
160
  max-height: none !important;
161
+ max-width: 100% !important;
162
+ box-sizing: border-box !important;
163
+ word-wrap: break-word !important;
164
+ overflow-wrap: break-word !important;
165
+ overflow-x: hidden !important;
158
166
  }
159
167
 
160
168
  /* ============================================================