osi-cards-lib 1.5.42 → 1.5.44
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/README.md +1 -1
- package/fesm2022/osi-cards-lib.mjs +5242 -3734
- package/fesm2022/osi-cards-lib.mjs.map +1 -1
- package/index.d.ts +147 -273
- package/package.json +4 -3
- package/styles/bundles/_ai-card.scss +10 -40
- package/styles/bundles/_card-skeleton.scss +1 -1
- package/styles/components/_ai-card-renderer.scss +0 -2
- package/styles/components/_card-actions.scss +2 -4
- package/styles/components/_streaming-effects.scss +0 -20
- package/styles/components/sections/_all-sections.generated.scss +0 -3
- package/styles/components/sections/_all-sections.scss +88 -64
- package/styles/components/sections/_compact-mixins.scss +9 -8
- package/styles/components/sections/_component-mixins.scss +40 -11
- package/styles/components/sections/_design-system.scss +106 -11
- package/styles/components/sections/_master-compact-system.scss +0 -17
- package/styles/components/sections/_minimalistic-design.scss +1 -4
- package/styles/components/sections/_modern-effects.scss +1 -3
- package/styles/components/sections/_modern-sections.scss +13 -69
- package/styles/components/sections/_section-animations.scss +158 -77
- package/styles/components/sections/_section-shell.scss +38 -9
- package/styles/components/sections/_section-types.generated.scss +0 -3
- package/styles/components/sections/_sections-base.scss +341 -64
- package/styles/components/sections/_unified-section-style.scss +17 -44
- package/styles/components/sections/_visual-effects-library.scss +3 -3
- package/styles/core/_animations.scss +0 -51
- package/styles/core/_global-unified.scss +2 -6
- package/styles/core/_mixins.scss +1 -1
- package/styles/core/_surface-layers.scss +20 -11
- package/styles/design-system/_section-base.scss +9 -32
- package/styles/design-system/_tokens.scss +67 -5
- package/styles/design-system/_unified-sections.scss +21 -21
- package/styles/layout/_masonry.scss +22 -22
- package/styles/layout/_tilt.scss +3 -3
- package/styles/mixins/_section-mixins.scss +2 -2
- package/styles/reset/_shadow-reset.scss +3 -7
- package/styles/responsive.scss +9 -7
- package/styles/tokens/_master.scss +322 -120
- package/styles/tokens/_section-tokens.generated.scss +0 -7
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
.ai-section {
|
|
8
8
|
--section-accent: var(--osi-section-accent);
|
|
9
|
+
--section-border: var(--osi-section-border);
|
|
9
10
|
--section-border-hover: var(--osi-section-border-hover);
|
|
11
|
+
--section-box-shadow: var(--osi-section-shadow);
|
|
10
12
|
--section-background: var(--osi-section-background);
|
|
11
13
|
--section-background-hover: var(--osi-section-background-hover);
|
|
12
14
|
--section-backdrop-filter: var(--osi-section-backdrop-filter);
|
|
@@ -49,18 +51,26 @@
|
|
|
49
51
|
gap: var(--osi-section-gap, 8px) !important;
|
|
50
52
|
height: auto !important;
|
|
51
53
|
}
|
|
52
|
-
}
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
// Direct hover styles for sections (ensures they work regardless of mixin application)
|
|
56
|
+
// Smooth transitions for hover effects
|
|
57
|
+
transition:
|
|
58
|
+
border-color var(--osi-card-transition-normal, 0.22s) cubic-bezier(0.4, 0, 0.2, 1),
|
|
59
|
+
box-shadow var(--osi-card-transition-normal, 0.22s) cubic-bezier(0.4, 0, 0.2, 1);
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
// Hover state: gentle shadow with 30% more contrasty cool color and 20% more contrasty border
|
|
62
|
+
&:hover {
|
|
63
|
+
border-color: var(--osi-section-border-hover-enhanced-color);
|
|
64
|
+
box-shadow: var(--osi-section-shadow-hover-enhanced);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@media (prefers-reduced-motion: reduce) {
|
|
68
|
+
transition: none;
|
|
69
|
+
}
|
|
62
70
|
}
|
|
63
71
|
|
|
72
|
+
/* All sections now use unified background - removed --main and --contrast variants for consistency */
|
|
73
|
+
|
|
64
74
|
.ai-section__header {
|
|
65
75
|
@include section-header(column, var(--osi-section-header-gap));
|
|
66
76
|
flex-direction: column !important;
|
|
@@ -194,6 +204,10 @@
|
|
|
194
204
|
@include section-body(var(--osi-section-gap-internal));
|
|
195
205
|
padding: 0 !important;
|
|
196
206
|
margin: 0 !important;
|
|
207
|
+
width: 100% !important; // Ensure section body uses full width
|
|
208
|
+
max-width: 100% !important; // Ensure section body uses full width
|
|
209
|
+
min-width: 0 !important; // Allow shrinking for proper resizing
|
|
210
|
+
box-sizing: border-box !important; // Include padding in width
|
|
197
211
|
}
|
|
198
212
|
|
|
199
213
|
/* Consistent empty state styling for all sections */
|
|
@@ -272,6 +286,11 @@
|
|
|
272
286
|
|
|
273
287
|
.ai-section--overview {
|
|
274
288
|
--section-accent: var(--osi-section-accent-overview);
|
|
289
|
+
|
|
290
|
+
// Reduce title font size by 1.5px for Executive Summary
|
|
291
|
+
.ai-section__title {
|
|
292
|
+
font-size: calc(var(--osi-section-title-font-size) - 1.5px) !important;
|
|
293
|
+
}
|
|
275
294
|
}
|
|
276
295
|
|
|
277
296
|
.ai-section--list,
|
|
@@ -357,7 +376,17 @@
|
|
|
357
376
|
box-sizing: border-box !important;
|
|
358
377
|
display: flex !important;
|
|
359
378
|
flex-direction: column !important;
|
|
360
|
-
padding:
|
|
379
|
+
padding: 0 !important; // No padding - sections should use 100% width
|
|
380
|
+
margin: 0 !important; // No margin - sections should use 100% width
|
|
381
|
+
|
|
382
|
+
/* Ensure all direct children use full width */
|
|
383
|
+
> * {
|
|
384
|
+
width: 100% !important;
|
|
385
|
+
max-width: 100% !important;
|
|
386
|
+
box-sizing: border-box !important;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/* Design moved to section-item level - wrapper is now minimal */
|
|
361
390
|
}
|
|
362
391
|
|
|
363
392
|
/* Ensure FAQ section specifically resizes properly */
|
|
@@ -11,16 +11,13 @@
|
|
|
11
11
|
@import "../../../components/sections/chart-section/chart-section.scss"; // chart
|
|
12
12
|
@import "../../../components/sections/contact-card-section/contact-card-section.scss"; // contact-card
|
|
13
13
|
@import "../../../components/sections/event-section/event-section.scss"; // event
|
|
14
|
-
@import "../../../components/sections/fallback-section/fallback-section.scss"; // fallback
|
|
15
14
|
@import "../../../components/sections/faq-section/faq-section.scss"; // faq
|
|
16
15
|
@import "../../../components/sections/financials-section/financials-section.scss"; // financials
|
|
17
16
|
@import "../../../components/sections/gallery-section/gallery-section.scss"; // gallery
|
|
18
|
-
@import "../../../components/sections/info-section/info-section.scss"; // info
|
|
19
17
|
@import "../../../components/sections/list-section/list-section.scss"; // list
|
|
20
18
|
@import "../../../components/sections/map-section/map-section.scss"; // map
|
|
21
19
|
@import "../../../components/sections/network-card-section/network-card-section.scss"; // network-card
|
|
22
20
|
@import "../../../components/sections/news-section/news-section.scss"; // news
|
|
23
|
-
@import "../../../components/sections/overview-section/overview-section.scss"; // overview
|
|
24
21
|
@import "../../../components/sections/product-section/product-section.scss"; // product
|
|
25
22
|
@import "../../../components/sections/quotation-section/quotation-section.scss"; // quotation
|
|
26
23
|
@import "../../../components/sections/social-media-section/social-media-section.scss"; // social-media
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// =====================================================================
|
|
8
8
|
|
|
9
9
|
@use "../../tokens/master" as *;
|
|
10
|
+
@use "section-animations" as *;
|
|
10
11
|
|
|
11
12
|
// =====================================================================
|
|
12
13
|
// GRID MIXINS
|
|
@@ -139,63 +140,63 @@
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
// =====================================================================
|
|
142
|
-
// UNIVERSAL CARD MIXIN -
|
|
143
|
+
// UNIVERSAL CARD MIXIN - Single Source of Truth
|
|
143
144
|
// =====================================================================
|
|
145
|
+
// This is the PRIMARY base mixin for all card styling.
|
|
146
|
+
// All card variants should extend this mixin.
|
|
147
|
+
// Uses standardized --osi-section-item-* tokens.
|
|
144
148
|
|
|
145
|
-
@mixin card {
|
|
149
|
+
@mixin card($spacing: "normal") {
|
|
150
|
+
// Background & Border - using standardized tokens
|
|
146
151
|
background: var(--osi-section-item-background);
|
|
152
|
+
// Set border on all sides including top
|
|
147
153
|
border: var(--osi-section-item-border);
|
|
148
154
|
border-radius: var(--osi-section-item-border-radius);
|
|
149
155
|
box-shadow: var(--osi-section-item-shadow);
|
|
150
|
-
padding: var(--card-padding);
|
|
151
156
|
|
|
157
|
+
// Padding - using standardized tokens with spacing parameter
|
|
158
|
+
@if $spacing == "compact" {
|
|
159
|
+
padding: var(--osi-section-item-padding-compact);
|
|
160
|
+
} @else if $spacing == "spacious" {
|
|
161
|
+
padding: var(--osi-section-item-padding-spacious);
|
|
162
|
+
} @else {
|
|
163
|
+
padding: var(--osi-section-item-padding-normal);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Layout
|
|
152
167
|
display: flex;
|
|
153
168
|
flex-direction: column;
|
|
154
|
-
gap: var(--
|
|
169
|
+
gap: var(--osi-section-item-gap);
|
|
155
170
|
min-height: var(--card-min-height, auto);
|
|
156
171
|
|
|
172
|
+
// Interaction
|
|
157
173
|
cursor: pointer;
|
|
158
174
|
position: relative;
|
|
159
175
|
overflow: hidden;
|
|
160
176
|
overflow-x: hidden; /* Prevent horizontal scrolling */
|
|
161
|
-
|
|
162
|
-
|
|
177
|
+
width: 100% !important; // Ensure full width
|
|
178
|
+
max-width: 100% !important; // Ensure full width
|
|
179
|
+
box-sizing: border-box !important; // Include padding/border in width
|
|
163
180
|
text-align: left;
|
|
164
181
|
word-wrap: break-word;
|
|
165
182
|
overflow-wrap: break-word;
|
|
166
183
|
|
|
167
|
-
transition
|
|
168
|
-
|
|
169
|
-
box-shadow var(--duration-base) var(--ease-out),
|
|
170
|
-
border-color var(--duration-base) var(--ease-out);
|
|
184
|
+
// Transitions - using standardized transition token
|
|
185
|
+
transition: var(--osi-section-item-transition);
|
|
171
186
|
|
|
172
|
-
//
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
position: absolute;
|
|
176
|
-
top: 0;
|
|
177
|
-
left: 0;
|
|
178
|
-
right: 0;
|
|
179
|
-
height: var(--border-width-default);
|
|
180
|
-
background: linear-gradient(90deg, var(--accent, var(--osi-accent)) 0%, transparent 100%);
|
|
181
|
-
opacity: 0;
|
|
182
|
-
transition: opacity var(--duration-base) var(--ease-out);
|
|
183
|
-
border-radius: var(--osi-section-item-border-radius) var(--osi-section-item-border-radius) 0 0;
|
|
184
|
-
}
|
|
187
|
+
// Metal reflection effect (default left-to-right)
|
|
188
|
+
// Position-based direction will be handled by CSS selectors
|
|
189
|
+
@include section-metal-reflection("ltr");
|
|
185
190
|
|
|
186
191
|
&:hover {
|
|
187
|
-
background
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
&::before {
|
|
192
|
-
opacity: 0.6;
|
|
193
|
-
}
|
|
192
|
+
// Keep background unchanged - only border and shadow change
|
|
193
|
+
// background: var(--osi-section-item-background-hover); // Removed - background stays the same
|
|
194
|
+
border-color: var(--osi-section-item-border-hover-enhanced-color);
|
|
195
|
+
box-shadow: var(--osi-section-item-shadow-hover-enhanced);
|
|
194
196
|
}
|
|
195
197
|
|
|
196
198
|
&:focus-visible {
|
|
197
|
-
outline:
|
|
198
|
-
outline-offset: var(--border-width-accent-sm);
|
|
199
|
+
outline: none;
|
|
199
200
|
}
|
|
200
201
|
|
|
201
202
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -203,6 +204,52 @@
|
|
|
203
204
|
}
|
|
204
205
|
}
|
|
205
206
|
|
|
207
|
+
// =====================================================================
|
|
208
|
+
// LIST ITEM MIXIN
|
|
209
|
+
// =====================================================================
|
|
210
|
+
// Standardized list item styling extending base card
|
|
211
|
+
// Used for items within list sections
|
|
212
|
+
|
|
213
|
+
@mixin list-item($spacing: "normal") {
|
|
214
|
+
@include card($spacing);
|
|
215
|
+
|
|
216
|
+
// List-specific styling
|
|
217
|
+
// Items in lists typically don't need borders or shadows
|
|
218
|
+
border: none;
|
|
219
|
+
box-shadow: none;
|
|
220
|
+
background: transparent;
|
|
221
|
+
|
|
222
|
+
// Use margin for list item separation (not padding)
|
|
223
|
+
margin-bottom: var(--osi-section-item-margin-sm);
|
|
224
|
+
|
|
225
|
+
&:not(:last-child) {
|
|
226
|
+
border-bottom: 1px solid var(--border);
|
|
227
|
+
padding-bottom: var(--osi-section-item-gap-md);
|
|
228
|
+
margin-bottom: var(--osi-section-item-gap-md);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
&:hover {
|
|
232
|
+
background: var(--osi-section-item-background-hover);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// No accent border for list items
|
|
236
|
+
&::before {
|
|
237
|
+
display: none;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// =====================================================================
|
|
242
|
+
// LIST CONTAINER MIXIN
|
|
243
|
+
// =====================================================================
|
|
244
|
+
// Container for list items - uses standardized tokens
|
|
245
|
+
|
|
246
|
+
@mixin list-container($spacing: "normal") {
|
|
247
|
+
@include card($spacing);
|
|
248
|
+
|
|
249
|
+
// List containers can have different styling if needed
|
|
250
|
+
gap: var(--osi-section-item-gap);
|
|
251
|
+
}
|
|
252
|
+
|
|
206
253
|
// =====================================================================
|
|
207
254
|
// UNIFIED SECTION CARD CLASS
|
|
208
255
|
// =====================================================================
|
|
@@ -213,6 +260,91 @@
|
|
|
213
260
|
|
|
214
261
|
.section-card {
|
|
215
262
|
@include card;
|
|
263
|
+
& {
|
|
264
|
+
width: 100% !important; // Ensure full width
|
|
265
|
+
max-width: 100% !important; // Ensure full width
|
|
266
|
+
box-sizing: border-box !important; // Include padding/border in width
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// =====================================================================
|
|
271
|
+
// GLOBAL SECTION ITEM HOVER ENHANCEMENT
|
|
272
|
+
// =====================================================================
|
|
273
|
+
// Ensure all section items get enhanced hover effects
|
|
274
|
+
// This applies to any element with .section-item class
|
|
275
|
+
// Higher specificity to ensure it overrides component-specific styles
|
|
276
|
+
// Each section item gets its own independent hover animation
|
|
277
|
+
|
|
278
|
+
.section-item {
|
|
279
|
+
// Enhanced hover effects for all section items
|
|
280
|
+
// Ensure border and shadow transitions are included
|
|
281
|
+
transition:
|
|
282
|
+
border-color var(--osi-card-transition-normal, 0.22s) cubic-bezier(0.4, 0, 0.2, 1),
|
|
283
|
+
box-shadow var(--osi-card-transition-normal, 0.22s) cubic-bezier(0.4, 0, 0.2, 1),
|
|
284
|
+
var(--osi-section-item-transition);
|
|
285
|
+
|
|
286
|
+
// Ensure each section item has its own metal reflection animation
|
|
287
|
+
position: relative;
|
|
288
|
+
overflow: hidden;
|
|
289
|
+
|
|
290
|
+
// Metal reflection pseudo-element for each individual item
|
|
291
|
+
// Using ::before to avoid conflicts with components that use ::after
|
|
292
|
+
&::before {
|
|
293
|
+
content: "";
|
|
294
|
+
position: absolute;
|
|
295
|
+
top: 0;
|
|
296
|
+
left: 0;
|
|
297
|
+
right: 0;
|
|
298
|
+
bottom: 0;
|
|
299
|
+
pointer-events: none;
|
|
300
|
+
z-index: 1;
|
|
301
|
+
opacity: 0;
|
|
302
|
+
border-radius: inherit;
|
|
303
|
+
animation: none;
|
|
304
|
+
|
|
305
|
+
// Default: left-to-right reflection with sweep animation (more discrete)
|
|
306
|
+
background: linear-gradient(
|
|
307
|
+
90deg,
|
|
308
|
+
transparent 0%,
|
|
309
|
+
rgba(255, 255, 255, 0.2) 20%,
|
|
310
|
+
rgba(255, 255, 255, 0.3) 40%,
|
|
311
|
+
rgba(255, 255, 255, 0.2) 60%,
|
|
312
|
+
transparent 100%
|
|
313
|
+
);
|
|
314
|
+
width: 50%;
|
|
315
|
+
|
|
316
|
+
// Use overlay blend mode for metallic appearance
|
|
317
|
+
mix-blend-mode: overlay;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
&:hover {
|
|
321
|
+
// Keep background unchanged - only border and shadow change
|
|
322
|
+
// Use !important to ensure these styles take precedence
|
|
323
|
+
border-color: var(--osi-section-item-border-hover-enhanced-color) !important;
|
|
324
|
+
box-shadow: var(--osi-section-item-shadow-hover-enhanced) !important;
|
|
325
|
+
// Ensure background doesn't change
|
|
326
|
+
background: var(--osi-section-item-background) !important;
|
|
327
|
+
|
|
328
|
+
// Trigger metal sweep animation for this specific item independently
|
|
329
|
+
// Default direction (will be overridden by position-based selectors below)
|
|
330
|
+
&::before {
|
|
331
|
+
opacity: 1;
|
|
332
|
+
animation: metal-sweep-ltr 0.23s ease-out forwards;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Reset animation when hover ends so it can play again on next hover for this item
|
|
337
|
+
&:not(:hover)::before {
|
|
338
|
+
animation: none;
|
|
339
|
+
opacity: 0;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
@media (prefers-reduced-motion: reduce) {
|
|
343
|
+
transition: none;
|
|
344
|
+
&::after {
|
|
345
|
+
display: none;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
216
348
|
}
|
|
217
349
|
|
|
218
350
|
// =====================================================================
|
|
@@ -227,6 +359,7 @@
|
|
|
227
359
|
color: var(--muted-foreground);
|
|
228
360
|
line-height: 1.3;
|
|
229
361
|
font-family: inherit;
|
|
362
|
+
margin-bottom: 0.05em; // Reduced gap between label and value
|
|
230
363
|
}
|
|
231
364
|
|
|
232
365
|
@mixin metric-value {
|
|
@@ -241,7 +374,7 @@
|
|
|
241
374
|
@mixin section-description {
|
|
242
375
|
font-size: var(--card-subtitle-font-size);
|
|
243
376
|
color: var(--muted-foreground);
|
|
244
|
-
line-height: 1.5
|
|
377
|
+
line-height: 1.3; // Reduced from 1.5 for tighter spacing
|
|
245
378
|
font-weight: 400;
|
|
246
379
|
font-family: inherit;
|
|
247
380
|
}
|
|
@@ -260,13 +393,16 @@
|
|
|
260
393
|
// =====================================================================
|
|
261
394
|
|
|
262
395
|
@mixin section-empty-state {
|
|
263
|
-
padding: var(--osi-section-padding);
|
|
396
|
+
padding: var(--osi-section-container-padding);
|
|
264
397
|
text-align: center;
|
|
265
398
|
color: var(--muted-foreground);
|
|
266
|
-
border: var(--border-width
|
|
399
|
+
border: var(--osi-section-item-border-width) dashed var(--border);
|
|
267
400
|
border-radius: var(--osi-section-item-border-radius);
|
|
268
401
|
background: var(--osi-section-item-background);
|
|
269
402
|
min-height: auto;
|
|
403
|
+
|
|
404
|
+
// Use standardized spacing
|
|
405
|
+
margin: var(--osi-section-item-margin-md);
|
|
270
406
|
}
|
|
271
407
|
|
|
272
408
|
@mixin section-empty-icon {
|
|
@@ -356,6 +492,136 @@
|
|
|
356
492
|
background: var(--muted);
|
|
357
493
|
}
|
|
358
494
|
|
|
495
|
+
// =====================================================================
|
|
496
|
+
// POSITION-BASED METAL REFLECTION DIRECTION
|
|
497
|
+
// =====================================================================
|
|
498
|
+
//
|
|
499
|
+
// Detects card position in grid and applies appropriate reflection direction.
|
|
500
|
+
// Left-positioned cards: left-to-right reflection
|
|
501
|
+
// Right-positioned cards: right-to-left reflection
|
|
502
|
+
//
|
|
503
|
+
|
|
504
|
+
// For masonry grid items - detect position based on column
|
|
505
|
+
// Targets section items nested within masonry items
|
|
506
|
+
// Left side items: right-to-left animation (rtl)
|
|
507
|
+
// Right side items: left-to-right animation (ltr)
|
|
508
|
+
.masonry-container,
|
|
509
|
+
.masonry-grid-container {
|
|
510
|
+
// Items in first columns (left side) - right-to-left reflection
|
|
511
|
+
.masonry-item:nth-child(4n + 1),
|
|
512
|
+
.masonry-item:nth-child(4n + 2) {
|
|
513
|
+
// Target all section items and cards within the masonry item
|
|
514
|
+
.section-item,
|
|
515
|
+
.unified-card,
|
|
516
|
+
.section-card,
|
|
517
|
+
[class*="-card"]:not([class*="__"]),
|
|
518
|
+
[class*="-item"]:not([class*="__"]) {
|
|
519
|
+
&::before {
|
|
520
|
+
// Right-to-left reflection for left side items
|
|
521
|
+
background: linear-gradient(
|
|
522
|
+
270deg,
|
|
523
|
+
transparent 0%,
|
|
524
|
+
rgba(255, 255, 255, 0.2) 20%,
|
|
525
|
+
rgba(255, 255, 255, 0.3) 40%,
|
|
526
|
+
rgba(255, 255, 255, 0.2) 60%,
|
|
527
|
+
transparent 100%
|
|
528
|
+
) !important;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
&:hover::before {
|
|
532
|
+
animation: metal-sweep-rtl 0.23s ease-out forwards !important;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Items in last columns (right side) - left-to-right reflection
|
|
538
|
+
.masonry-item:nth-child(4n + 3),
|
|
539
|
+
.masonry-item:nth-child(4n + 4),
|
|
540
|
+
.masonry-item[data-col-span="2"]:nth-child(odd),
|
|
541
|
+
.masonry-item[data-col-span="3"],
|
|
542
|
+
.masonry-item[data-col-span="4"] {
|
|
543
|
+
// Target all section items and cards within the masonry item
|
|
544
|
+
.section-item,
|
|
545
|
+
.unified-card,
|
|
546
|
+
.section-card,
|
|
547
|
+
[class*="-card"]:not([class*="__"]),
|
|
548
|
+
[class*="-item"]:not([class*="__"]) {
|
|
549
|
+
&::before {
|
|
550
|
+
// Left-to-right reflection for right side items
|
|
551
|
+
background: linear-gradient(
|
|
552
|
+
90deg,
|
|
553
|
+
transparent 0%,
|
|
554
|
+
rgba(255, 255, 255, 0.2) 20%,
|
|
555
|
+
rgba(255, 255, 255, 0.3) 40%,
|
|
556
|
+
rgba(255, 255, 255, 0.2) 60%,
|
|
557
|
+
transparent 100%
|
|
558
|
+
) !important;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
&:hover::before {
|
|
562
|
+
animation: metal-sweep-ltr 0.23s ease-out forwards !important;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// For CSS Grid layouts - detect based on grid column position
|
|
569
|
+
@supports (grid-template-rows: masonry) {
|
|
570
|
+
.masonry-container--native {
|
|
571
|
+
// Items starting in first columns (left side) - right-to-left reflection
|
|
572
|
+
.masonry-item:nth-child(4n + 1),
|
|
573
|
+
.masonry-item:nth-child(4n + 2) {
|
|
574
|
+
.section-item,
|
|
575
|
+
.unified-card,
|
|
576
|
+
.section-card,
|
|
577
|
+
[class*="-card"]:not([class*="__"]),
|
|
578
|
+
[class*="-item"]:not([class*="__"]) {
|
|
579
|
+
&::before {
|
|
580
|
+
// Right-to-left reflection for left side items
|
|
581
|
+
background: linear-gradient(
|
|
582
|
+
270deg,
|
|
583
|
+
transparent 0%,
|
|
584
|
+
rgba(255, 255, 255, 0.2) 20%,
|
|
585
|
+
rgba(255, 255, 255, 0.3) 40%,
|
|
586
|
+
rgba(255, 255, 255, 0.2) 60%,
|
|
587
|
+
transparent 100%
|
|
588
|
+
) !important;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
&:hover::before {
|
|
592
|
+
animation: metal-sweep-rtl 0.23s ease-out forwards !important;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// Items in last columns (right side) - left-to-right reflection
|
|
598
|
+
.masonry-item:nth-child(4n + 3),
|
|
599
|
+
.masonry-item:nth-child(4n + 4) {
|
|
600
|
+
.section-item,
|
|
601
|
+
.unified-card,
|
|
602
|
+
.section-card,
|
|
603
|
+
[class*="-card"]:not([class*="__"]),
|
|
604
|
+
[class*="-item"]:not([class*="__"]) {
|
|
605
|
+
&::before {
|
|
606
|
+
// Left-to-right reflection for right side items
|
|
607
|
+
background: linear-gradient(
|
|
608
|
+
90deg,
|
|
609
|
+
transparent 0%,
|
|
610
|
+
rgba(255, 255, 255, 0.2) 20%,
|
|
611
|
+
rgba(255, 255, 255, 0.3) 40%,
|
|
612
|
+
rgba(255, 255, 255, 0.2) 60%,
|
|
613
|
+
transparent 100%
|
|
614
|
+
) !important;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
&:hover::before {
|
|
618
|
+
animation: metal-sweep-ltr 0.23s ease-out forwards !important;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
359
625
|
// =====================================================================
|
|
360
626
|
// REDUCED MOTION
|
|
361
627
|
// =====================================================================
|
|
@@ -373,13 +639,14 @@
|
|
|
373
639
|
}
|
|
374
640
|
|
|
375
641
|
// =====================================================================
|
|
376
|
-
// ANIMATION SYSTEM
|
|
642
|
+
// ANIMATION SYSTEM - Standardized
|
|
377
643
|
// =====================================================================
|
|
644
|
+
// Single unified animation system for all items/fields
|
|
378
645
|
|
|
379
|
-
@keyframes
|
|
646
|
+
@keyframes item-stream {
|
|
380
647
|
0% {
|
|
381
648
|
opacity: 0;
|
|
382
|
-
transform: translate3d(0, var(--motion-distance-sm), 0);
|
|
649
|
+
transform: translate3d(0, var(--osi-motion-distance-sm, 8px), 0);
|
|
383
650
|
}
|
|
384
651
|
100% {
|
|
385
652
|
opacity: 1;
|
|
@@ -387,50 +654,60 @@
|
|
|
387
654
|
}
|
|
388
655
|
}
|
|
389
656
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
657
|
+
// Unified animation mixin for all items and fields
|
|
658
|
+
@mixin item-animation {
|
|
659
|
+
// Standard streaming state
|
|
660
|
+
&.item-streaming {
|
|
661
|
+
animation: item-stream var(--osi-section-item-animation-duration, 220ms)
|
|
662
|
+
var(--osi-section-item-animation-easing, cubic-bezier(0.4, 0, 0.2, 1)) forwards;
|
|
393
663
|
}
|
|
394
664
|
|
|
395
|
-
|
|
665
|
+
// Completed state (animation done)
|
|
666
|
+
&.item-entered {
|
|
396
667
|
animation: none;
|
|
397
668
|
}
|
|
398
669
|
|
|
670
|
+
// Stagger delays for sequential animations
|
|
399
671
|
@for $i from 0 through 15 {
|
|
400
|
-
&.
|
|
401
|
-
animation-delay: calc(#{$i} * 30ms);
|
|
672
|
+
&.item-stagger-#{$i} {
|
|
673
|
+
animation-delay: calc(#{$i} * var(--osi-section-item-stagger-delay, 30ms));
|
|
402
674
|
}
|
|
403
675
|
}
|
|
404
|
-
}
|
|
405
676
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
animation:
|
|
677
|
+
// Respect reduced motion preferences
|
|
678
|
+
@media (prefers-reduced-motion: reduce) {
|
|
679
|
+
animation: none !important;
|
|
409
680
|
}
|
|
681
|
+
}
|
|
410
682
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
683
|
+
// Legacy support mixins (deprecated but kept for backward compatibility)
|
|
684
|
+
@mixin section-item-animation {
|
|
685
|
+
@include item-animation;
|
|
686
|
+
@warn "section-item-animation is deprecated. Use @include item-animation instead.";
|
|
414
687
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
688
|
+
// Legacy class name support
|
|
689
|
+
&.section-item-streaming {
|
|
690
|
+
@extend .item-streaming;
|
|
691
|
+
}
|
|
692
|
+
&.section-item-entered {
|
|
693
|
+
@extend .item-entered;
|
|
419
694
|
}
|
|
420
695
|
}
|
|
421
696
|
|
|
697
|
+
@mixin legacy-item-animation {
|
|
698
|
+
@include item-animation;
|
|
699
|
+
@warn "legacy-item-animation is deprecated. Use @include item-animation instead.";
|
|
700
|
+
}
|
|
701
|
+
|
|
422
702
|
@mixin legacy-field-animation {
|
|
703
|
+
@include item-animation;
|
|
704
|
+
@warn "legacy-field-animation is deprecated. Use @include item-animation instead.";
|
|
705
|
+
|
|
706
|
+
// Legacy class name support
|
|
423
707
|
&.field-streaming {
|
|
424
|
-
|
|
708
|
+
@extend .item-streaming;
|
|
425
709
|
}
|
|
426
|
-
|
|
427
710
|
&.field-entered {
|
|
428
|
-
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
@for $i from 0 through 15 {
|
|
432
|
-
&.field-stagger-#{$i} {
|
|
433
|
-
animation-delay: calc(#{$i} * 30ms);
|
|
434
|
-
}
|
|
711
|
+
@extend .item-entered;
|
|
435
712
|
}
|
|
436
713
|
}
|