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.
Files changed (39) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/osi-cards-lib.mjs +5242 -3734
  3. package/fesm2022/osi-cards-lib.mjs.map +1 -1
  4. package/index.d.ts +147 -273
  5. package/package.json +4 -3
  6. package/styles/bundles/_ai-card.scss +10 -40
  7. package/styles/bundles/_card-skeleton.scss +1 -1
  8. package/styles/components/_ai-card-renderer.scss +0 -2
  9. package/styles/components/_card-actions.scss +2 -4
  10. package/styles/components/_streaming-effects.scss +0 -20
  11. package/styles/components/sections/_all-sections.generated.scss +0 -3
  12. package/styles/components/sections/_all-sections.scss +88 -64
  13. package/styles/components/sections/_compact-mixins.scss +9 -8
  14. package/styles/components/sections/_component-mixins.scss +40 -11
  15. package/styles/components/sections/_design-system.scss +106 -11
  16. package/styles/components/sections/_master-compact-system.scss +0 -17
  17. package/styles/components/sections/_minimalistic-design.scss +1 -4
  18. package/styles/components/sections/_modern-effects.scss +1 -3
  19. package/styles/components/sections/_modern-sections.scss +13 -69
  20. package/styles/components/sections/_section-animations.scss +158 -77
  21. package/styles/components/sections/_section-shell.scss +38 -9
  22. package/styles/components/sections/_section-types.generated.scss +0 -3
  23. package/styles/components/sections/_sections-base.scss +341 -64
  24. package/styles/components/sections/_unified-section-style.scss +17 -44
  25. package/styles/components/sections/_visual-effects-library.scss +3 -3
  26. package/styles/core/_animations.scss +0 -51
  27. package/styles/core/_global-unified.scss +2 -6
  28. package/styles/core/_mixins.scss +1 -1
  29. package/styles/core/_surface-layers.scss +20 -11
  30. package/styles/design-system/_section-base.scss +9 -32
  31. package/styles/design-system/_tokens.scss +67 -5
  32. package/styles/design-system/_unified-sections.scss +21 -21
  33. package/styles/layout/_masonry.scss +22 -22
  34. package/styles/layout/_tilt.scss +3 -3
  35. package/styles/mixins/_section-mixins.scss +2 -2
  36. package/styles/reset/_shadow-reset.scss +3 -7
  37. package/styles/responsive.scss +9 -7
  38. package/styles/tokens/_master.scss +322 -120
  39. 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
- .ai-section--main {
55
- --section-background: var(--osi-section-background-main);
56
- --section-background-hover: var(--osi-section-background-main-hover);
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
- .ai-section--contrast {
60
- --section-background: var(--osi-section-background-contrast);
61
- --section-background-hover: var(--osi-section-background-contrast-hover);
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: 4px !important;
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 - Uses CSS Variables Only
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(--card-gap);
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
- max-width: 100%;
162
- box-sizing: border-box;
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
- background var(--duration-base) var(--ease-out),
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
- // Subtle accent border indicator
173
- &::before {
174
- content: "";
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: var(--osi-section-item-background-hover);
188
- border-color: var(--osi-section-item-border-hover);
189
- box-shadow: var(--osi-section-item-shadow-hover);
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: var(--border-width-accent-sm) solid var(--accent, var(--osi-accent));
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-default) dashed var(--border);
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 section-item-stream {
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
- @mixin section-item-animation {
391
- &.section-item-streaming {
392
- animation: section-item-stream 0.25s ease-out forwards;
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
- &.section-item-entered {
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
- &.section-item-stagger-#{$i} {
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
- @mixin legacy-item-animation {
407
- &.item-streaming {
408
- animation: section-item-stream 0.25s ease-out forwards;
677
+ // Respect reduced motion preferences
678
+ @media (prefers-reduced-motion: reduce) {
679
+ animation: none !important;
409
680
  }
681
+ }
410
682
 
411
- &.item-entered {
412
- animation: none;
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
- @for $i from 0 through 15 {
416
- &.item-stagger-#{$i} {
417
- animation-delay: calc(#{$i} * 30ms);
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
- animation: section-item-stream 0.25s ease-out forwards;
708
+ @extend .item-streaming;
425
709
  }
426
-
427
710
  &.field-entered {
428
- animation: none;
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
  }