osi-cards-lib 1.5.39 → 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.
@@ -9018,6 +9024,14 @@ declare class AICardRendererComponent implements OnInit, AfterViewInit, OnDestro
9018
9024
  * Makes an HTTP POST request to the LLM endpoint with a prompt to generate card data.
9019
9025
  */
9020
9026
  private generateFallbackCard;
9027
+ /**
9028
+ * Get the version string for display in tooltip
9029
+ */
9030
+ get versionString(): string;
9031
+ /**
9032
+ * Handle click on the signature to open OSI Cards website
9033
+ */
9034
+ onSignatureClick(): void;
9021
9035
  /**
9022
9036
  * Validates that animation providers are configured.
9023
9037
  * Warns in development mode if animations are not available.
@@ -9403,6 +9417,18 @@ declare class SectionHeaderComponent {
9403
9417
  * Get the heading tag name based on level
9404
9418
  */
9405
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;
9406
9432
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionHeaderComponent, never>;
9407
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>;
9408
9434
  }
@@ -10469,6 +10495,18 @@ declare class InfoSectionComponent extends BaseSectionComponent implements OnIni
10469
10495
  * Get tagline/description from section or fields
10470
10496
  */
10471
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;
10472
10510
  /**
10473
10511
  * Get website URL from fields
10474
10512
  */
@@ -10577,6 +10615,14 @@ declare class ListSectionComponent extends BaseSectionComponent implements OnIni
10577
10615
  getPriorityVariant(priority?: string): 'error' | 'warning' | 'success' | 'default';
10578
10616
  toggleExpanded(index: number): void;
10579
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;
10580
10626
  static ɵfac: i0.ɵɵFactoryDeclaration<ListSectionComponent, never>;
10581
10627
  static ɵcmp: i0.ɵɵComponentDeclaration<ListSectionComponent, "lib-list-section", never, {}, {}, never, never, true, never>;
10582
10628
  }
@@ -10640,6 +10686,22 @@ declare class NetworkCardSectionComponent extends BaseSectionComponent implement
10640
10686
  * Get status class
10641
10687
  */
10642
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;
10643
10705
  static ɵfac: i0.ɵɵFactoryDeclaration<NetworkCardSectionComponent, never>;
10644
10706
  static ɵcmp: i0.ɵɵComponentDeclaration<NetworkCardSectionComponent, "lib-network-card-section", never, {}, {}, never, never, true, never>;
10645
10707
  }
@@ -10670,6 +10732,22 @@ declare class NewsSectionComponent extends BaseSectionComponent implements OnIni
10670
10732
  * Format date for display
10671
10733
  */
10672
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;
10673
10751
  static ɵfac: i0.ɵɵFactoryDeclaration<NewsSectionComponent, never>;
10674
10752
  static ɵcmp: i0.ɵɵComponentDeclaration<NewsSectionComponent, "lib-news-section", never, {}, {}, never, never, true, never>;
10675
10753
  }
@@ -10695,6 +10773,22 @@ declare class OverviewSectionComponent extends BaseSectionComponent implements O
10695
10773
  * Check if field should be highlighted
10696
10774
  */
10697
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;
10698
10792
  static ɵfac: i0.ɵɵFactoryDeclaration<OverviewSectionComponent, never>;
10699
10793
  static ɵcmp: i0.ɵɵComponentDeclaration<OverviewSectionComponent, "lib-overview-section", never, {}, {}, never, never, true, never>;
10700
10794
  }
@@ -10758,6 +10852,14 @@ declare class QuotationSectionComponent extends BaseSectionComponent implements
10758
10852
  getAuthorName(field: any): string;
10759
10853
  toggleExpanded(index: number): void;
10760
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;
10761
10863
  static ɵfac: i0.ɵɵFactoryDeclaration<QuotationSectionComponent, never>;
10762
10864
  static ɵcmp: i0.ɵɵComponentDeclaration<QuotationSectionComponent, "lib-quotation-section", never, {}, {}, never, never, true, never>;
10763
10865
  }
@@ -10801,6 +10903,7 @@ declare class SocialMediaSectionComponent extends BaseSectionComponent implement
10801
10903
  declare class SolutionsSectionComponent extends BaseSectionComponent implements OnInit {
10802
10904
  private readonly layoutService;
10803
10905
  expandedIndex: number | null;
10906
+ descriptionExpandedStates: boolean[];
10804
10907
  ngOnInit(): void;
10805
10908
  /**
10806
10909
  * Calculate layout preferences for solutions section based on content.
@@ -10822,6 +10925,18 @@ declare class SolutionsSectionComponent extends BaseSectionComponent implements
10822
10925
  toggleExpanded(index: number): void;
10823
10926
  isExpanded(index: number): boolean;
10824
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;
10825
10940
  static ɵfac: i0.ɵɵFactoryDeclaration<SolutionsSectionComponent, never>;
10826
10941
  static ɵcmp: i0.ɵɵComponentDeclaration<SolutionsSectionComponent, "lib-solutions-section", never, {}, {}, never, never, true, never>;
10827
10942
  }
@@ -10852,6 +10967,22 @@ declare class TextReferenceSectionComponent extends BaseSectionComponent impleme
10852
10967
  * Get reference content
10853
10968
  */
10854
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;
10855
10986
  static ɵfac: i0.ɵɵFactoryDeclaration<TextReferenceSectionComponent, never>;
10856
10987
  static ɵcmp: i0.ɵɵComponentDeclaration<TextReferenceSectionComponent, "lib-text-reference-section", never, {}, {}, never, never, true, never>;
10857
10988
  }
@@ -11488,11 +11619,11 @@ declare function packWithZeroGapsGuarantee(sections: CardSection[], columns?: nu
11488
11619
  * Do not edit manually - generated by scripts/generate-version.js
11489
11620
  *
11490
11621
  * Source of truth: version.config.json
11491
- * Last synced: 2025-12-15T10:19:22.227Z
11622
+ * Last synced: 2025-12-15T18:48:03.906Z
11492
11623
  */
11493
- declare const VERSION = "1.5.39";
11494
- declare const BUILD_DATE = "2025-12-15T10:19:22.227Z";
11495
- declare const BUILD_HASH = "9010f4a";
11624
+ declare const VERSION = "1.5.41";
11625
+ declare const BUILD_DATE = "2025-12-15T18:48:03.906Z";
11626
+ declare const BUILD_HASH = "6071ff4";
11496
11627
  declare const BUILD_BRANCH = "main";
11497
11628
  interface VersionInfo {
11498
11629
  version: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osi-cards-lib",
3
- "version": "1.5.39",
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",
@@ -54,7 +54,7 @@
54
54
  display: flex;
55
55
  justify-content: center;
56
56
  align-items: flex-start;
57
- padding: 8px;
57
+ padding: var(--osi-card-padding, 16px) !important;
58
58
  background: transparent !important;
59
59
  background-color: transparent !important;
60
60
  min-height: 0;
@@ -76,7 +76,7 @@
76
76
 
77
77
  // Responsive: reduce padding on mobile
78
78
  @media (max-width: 480px) {
79
- padding: 4px;
79
+ padding: var(--osi-card-padding-mobile, 4px) !important;
80
80
  }
81
81
 
82
82
  // Bootstrap isolation - must come first to reset external Bootstrap variables
@@ -203,7 +203,3 @@ app-card-streaming-indicator {
203
203
  white-space: nowrap;
204
204
  border: 0;
205
205
  }
206
-
207
-
208
-
209
-
@@ -20,8 +20,10 @@
20
20
  display: flex;
21
21
  flex-direction: column;
22
22
  width: 100%;
23
+ max-width: 100%;
23
24
  min-height: 0; // Allow content to determine height
24
25
  overflow: visible;
26
+ box-sizing: border-box !important;
25
27
 
26
28
  /* CSS Isolation */
27
29
  isolation: isolate;
@@ -49,14 +51,17 @@
49
51
  box-shadow: var(--osi-card-shadow) !important;
50
52
 
51
53
  /* Padding - card-specific spacing */
52
- padding: var(--osi-card-padding) !important;
53
- padding-bottom: var(--osi-card-padding) !important;
54
+ padding: var(--osi-card-padding, 16px) !important;
55
+ padding-top: var(--osi-card-padding, 16px) !important;
56
+ padding-bottom: var(--osi-card-padding, 16px) !important;
57
+ padding-left: var(--osi-card-padding, 16px) !important;
58
+ padding-right: var(--osi-card-padding, 16px) !important;
54
59
 
55
60
  /* Border radius - card-specific (larger than sections) */
56
61
  border-radius: var(--osi-card-border-radius) !important;
57
62
 
58
63
  /* Gap - specific space between header and sections */
59
- gap: var(--osi-card-gap) !important;
64
+ gap: var(--osi-card-gap, 12px) !important;
60
65
  /* ========== END CARD SPECIFIC STYLES ========== */
61
66
 
62
67
  /* Smooth transitions */
@@ -483,8 +488,10 @@
483
488
  margin-bottom: 0 !important;
484
489
  display: flex;
485
490
  flex-direction: column;
486
- gap: var(--osi-card-body-gap); /* Constant gap between sections */
491
+ gap: var(--osi-card-body-gap, 12px) !important; /* Constant gap between sections */
487
492
  min-height: 0;
493
+ max-width: 100%;
494
+ box-sizing: border-box !important;
488
495
  /* Allow content to flow properly - no overflow clipping */
489
496
  overflow: visible;
490
497
  /* NO BORDER - completely invisible */
@@ -10,7 +10,7 @@
10
10
  --section-background: var(--osi-section-background);
11
11
  --section-background-hover: var(--osi-section-background-hover);
12
12
  --section-backdrop-filter: var(--osi-section-backdrop-filter);
13
- --section-spacing-bottom: var(--osi-section-spacing-bottom);
13
+ --section-spacing-bottom: var(--osi-section-spacing-bottom, 12px);
14
14
  --section-glow-background: var(--osi-section-glow-background);
15
15
  --section-glow-opacity-hover: var(--osi-section-glow-opacity-hover);
16
16
  --section-title-underline-length: var(--osi-section-title-underline-length);
@@ -18,8 +18,16 @@
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
- height: 100% !important;
22
- margin-bottom: var(--section-spacing-bottom) !important;
21
+ width: 100% !important;
22
+ max-width: 100% !important;
23
+ height: auto !important;
24
+ min-height: 0 !important;
25
+ max-height: none !important;
26
+ margin-bottom: var(--section-spacing-bottom, 12px) !important;
27
+ margin-top: 0 !important;
28
+ margin-left: 0 !important;
29
+ margin-right: 0 !important;
30
+ box-sizing: border-box !important;
23
31
  -webkit-font-smoothing: antialiased !important;
24
32
  -moz-osx-font-smoothing: grayscale !important;
25
33
 
@@ -38,7 +46,8 @@
38
46
  .masonry-item & {
39
47
  display: flex !important;
40
48
  flex-direction: column !important;
41
- gap: var(--osi-section-gap) !important;
49
+ gap: var(--osi-section-gap, 12px) !important;
50
+ height: auto !important;
42
51
  }
43
52
  }
44
53
 
@@ -335,3 +344,36 @@
335
344
 
336
345
  /* Theme system handles all light/dark variations automatically */
337
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
  /* ============================================================
@@ -290,7 +298,6 @@
290
298
  /* Left accent border removed for consistency */
291
299
  }
292
300
 
293
-
294
301
  /* Flex grow sections - expand to fill space */
295
302
  .masonry-item--flex-grow {
296
303
  flex-grow: 1 !important;
@@ -649,11 +649,11 @@ $breakpoints: (
649
649
  --osi-card-shadow-fullscreen: none;
650
650
 
651
651
  // Card Spacing - Padding
652
- --osi-card-padding: var(--card-main-padding);
653
- --osi-card-padding-top: var(--card-main-padding);
654
- --osi-card-padding-bottom: var(--card-main-padding);
655
- --osi-card-padding-left: var(--card-main-padding);
656
- --osi-card-padding-right: var(--card-main-padding);
652
+ --osi-card-padding: var(--card-main-padding, 16px);
653
+ --osi-card-padding-top: var(--card-main-padding, 16px);
654
+ --osi-card-padding-bottom: var(--card-main-padding, 16px);
655
+ --osi-card-padding-left: var(--card-main-padding, 16px);
656
+ --osi-card-padding-right: var(--card-main-padding, 16px);
657
657
  --osi-card-padding-mobile: 4px; // Fixed padding - no responsive behavior
658
658
 
659
659
  // Card Spacing - Margins
@@ -663,9 +663,9 @@ $breakpoints: (
663
663
  --osi-card-margin-right: 0;
664
664
 
665
665
  // Card Spacing - Gaps
666
- --osi-card-gap: var(--section-card-gap);
667
- --osi-card-body-gap: var(--space-3);
668
- --osi-card-grid-gap: var(--section-card-gap);
666
+ --osi-card-gap: var(--section-card-gap, 12px);
667
+ --osi-card-body-gap: var(--space-3, 12px);
668
+ --osi-card-grid-gap: var(--section-card-gap, 12px);
669
669
 
670
670
  // Card Border Radius
671
671
  --osi-card-border-radius: var(--card-border-radius);