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/fesm2022/osi-cards-lib.mjs +691 -122
- package/fesm2022/osi-cards-lib.mjs.map +1 -1
- package/index.d.ts +135 -4
- package/package.json +1 -1
- package/styles/_styles-scoped.scss +2 -2
- package/styles/components/_component-styles.scss +0 -4
- package/styles/components/cards/_ai-card.scss +11 -4
- package/styles/components/sections/_section-animations.scss +0 -1
- package/styles/components/sections/_section-shell.scss +46 -4
- package/styles/components/sections/_sections-base.scss +102 -0
- package/styles/layout/_masonry.scss +8 -1
- package/styles/tokens/_master.scss +8 -8
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-
|
|
11622
|
+
* Last synced: 2025-12-15T18:48:03.906Z
|
|
11492
11623
|
*/
|
|
11493
|
-
declare const VERSION = "1.5.
|
|
11494
|
-
declare const BUILD_DATE = "2025-12-
|
|
11495
|
-
declare const BUILD_HASH = "
|
|
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
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
display: flex;
|
|
55
55
|
justify-content: center;
|
|
56
56
|
align-items: flex-start;
|
|
57
|
-
padding:
|
|
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
|
|
@@ -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-
|
|
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
|
-
|
|
22
|
-
|
|
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);
|