react-native-ease 0.2.0 → 0.4.0

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/ios/EaseView.mm CHANGED
@@ -58,6 +58,92 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
58
58
  kMaskScaleX | kMaskScaleY | kMaskRotate |
59
59
  kMaskRotateX | kMaskRotateY;
60
60
 
61
+ // Per-property transition config resolved from the transitions struct
62
+ struct EaseTransitionConfig {
63
+ std::string type;
64
+ int duration;
65
+ float bezier[4];
66
+ float damping;
67
+ float stiffness;
68
+ float mass;
69
+ std::string loop;
70
+ int delay;
71
+ };
72
+
73
+ // Convert from a codegen-generated transition config struct to our local
74
+ // EaseTransitionConfig
75
+ template <typename T>
76
+ static EaseTransitionConfig transitionConfigFromStruct(const T &src) {
77
+ EaseTransitionConfig config;
78
+ config.type = src.type;
79
+ config.duration = src.duration;
80
+ const auto &b = src.easingBezier;
81
+ if (b.size() == 4) {
82
+ config.bezier[0] = b[0];
83
+ config.bezier[1] = b[1];
84
+ config.bezier[2] = b[2];
85
+ config.bezier[3] = b[3];
86
+ } else {
87
+ config.bezier[0] = 0.42f;
88
+ config.bezier[1] = 0.0f;
89
+ config.bezier[2] = 0.58f;
90
+ config.bezier[3] = 1.0f;
91
+ }
92
+ config.damping = src.damping;
93
+ config.stiffness = src.stiffness;
94
+ config.mass = src.mass;
95
+ config.loop = src.loop;
96
+ config.delay = src.delay;
97
+ return config;
98
+ }
99
+
100
+ // Check if a category config was explicitly set (non-empty type means JS sent
101
+ // it)
102
+ template <typename T> static bool hasConfig(const T &cfg) {
103
+ return !cfg.type.empty();
104
+ }
105
+
106
+ static EaseTransitionConfig
107
+ transitionConfigForProperty(const std::string &name,
108
+ const EaseViewProps &props) {
109
+ const auto &t = props.transitions;
110
+
111
+ // Map property name to category, check if category override exists
112
+ if (name == "opacity" && hasConfig(t.opacity)) {
113
+ return transitionConfigFromStruct(t.opacity);
114
+ } else if ((name == "translateX" || name == "translateY" ||
115
+ name == "scaleX" || name == "scaleY" || name == "rotate" ||
116
+ name == "rotateX" || name == "rotateY") &&
117
+ hasConfig(t.transform)) {
118
+ return transitionConfigFromStruct(t.transform);
119
+ } else if (name == "borderRadius" && hasConfig(t.borderRadius)) {
120
+ return transitionConfigFromStruct(t.borderRadius);
121
+ } else if (name == "backgroundColor" && hasConfig(t.backgroundColor)) {
122
+ return transitionConfigFromStruct(t.backgroundColor);
123
+ }
124
+ // Fallback to defaultConfig
125
+ return transitionConfigFromStruct(t.defaultConfig);
126
+ }
127
+
128
+ // Find lowest property name with a set mask bit among transform properties
129
+ static std::string lowestTransformPropertyName(int mask) {
130
+ if (mask & kMaskTranslateX)
131
+ return "translateX";
132
+ if (mask & kMaskTranslateY)
133
+ return "translateY";
134
+ if (mask & kMaskScaleX)
135
+ return "scaleX";
136
+ if (mask & kMaskScaleY)
137
+ return "scaleY";
138
+ if (mask & kMaskRotate)
139
+ return "rotate";
140
+ if (mask & kMaskRotateX)
141
+ return "rotateX";
142
+ if (mask & kMaskRotateY)
143
+ return "rotateY";
144
+ return "translateX"; // fallback
145
+ }
146
+
61
147
  @implementation EaseView {
62
148
  BOOL _isFirstMount;
63
149
  NSInteger _animationBatchId;
@@ -139,16 +225,16 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
139
225
  - (CAAnimation *)createAnimationForKeyPath:(NSString *)keyPath
140
226
  fromValue:(NSValue *)fromValue
141
227
  toValue:(NSValue *)toValue
142
- props:(const EaseViewProps &)props
228
+ config:(EaseTransitionConfig)config
143
229
  loop:(BOOL)loop {
144
- if (props.transitionType == EaseViewTransitionType::Spring) {
230
+ if (config.type == "spring") {
145
231
  CASpringAnimation *spring =
146
232
  [CASpringAnimation animationWithKeyPath:keyPath];
147
233
  spring.fromValue = fromValue;
148
234
  spring.toValue = toValue;
149
- spring.damping = props.transitionDamping;
150
- spring.stiffness = props.transitionStiffness;
151
- spring.mass = props.transitionMass;
235
+ spring.damping = config.damping;
236
+ spring.stiffness = config.stiffness;
237
+ spring.mass = config.mass;
152
238
  spring.initialVelocity = 0;
153
239
  spring.duration = spring.settlingDuration;
154
240
  return spring;
@@ -156,23 +242,14 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
156
242
  CABasicAnimation *timing = [CABasicAnimation animationWithKeyPath:keyPath];
157
243
  timing.fromValue = fromValue;
158
244
  timing.toValue = toValue;
159
- timing.duration = props.transitionDuration / 1000.0;
160
- {
161
- const auto &b = props.transitionEasingBezier;
162
- if (b.size() == 4) {
163
- timing.timingFunction = [CAMediaTimingFunction
164
- functionWithControlPoints:(float)b[0]:(float)b[1]:(float)b[2
165
- ]:(float)b[3]];
166
- } else {
167
- // Fallback: easeInOut
168
- timing.timingFunction =
169
- [CAMediaTimingFunction functionWithControlPoints:0.42:0.0:0.58:1.0];
170
- }
171
- }
245
+ timing.duration = config.duration / 1000.0;
246
+ timing.timingFunction = [CAMediaTimingFunction
247
+ functionWithControlPoints:config.bezier[0]:config.bezier[1
248
+ ]:config.bezier[2]:config.bezier[3]];
172
249
  if (loop) {
173
- if (props.transitionLoop == EaseViewTransitionLoop::Repeat) {
250
+ if (config.loop == "repeat") {
174
251
  timing.repeatCount = HUGE_VALF;
175
- } else if (props.transitionLoop == EaseViewTransitionLoop::Reverse) {
252
+ } else if (config.loop == "reverse") {
176
253
  timing.repeatCount = HUGE_VALF;
177
254
  timing.autoreverses = YES;
178
255
  }
@@ -185,15 +262,19 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
185
262
  animationKey:(NSString *)animationKey
186
263
  fromValue:(NSValue *)fromValue
187
264
  toValue:(NSValue *)toValue
188
- props:(const EaseViewProps &)props
265
+ config:(EaseTransitionConfig)config
189
266
  loop:(BOOL)loop {
190
267
  _pendingAnimationCount++;
191
268
 
192
269
  CAAnimation *animation = [self createAnimationForKeyPath:keyPath
193
270
  fromValue:fromValue
194
271
  toValue:toValue
195
- props:props
272
+ config:config
196
273
  loop:loop];
274
+ if (config.delay > 0) {
275
+ animation.beginTime = CACurrentMediaTime() + (config.delay / 1000.0);
276
+ animation.fillMode = kCAFillModeBackwards;
277
+ }
197
278
  [animation setValue:@(_animationBatchId) forKey:@"easeBatchId"];
198
279
  animation.delegate = self;
199
280
  [self.layer addAnimation:animation forKey:animationKey];
@@ -224,6 +305,10 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
224
305
  const auto &newViewProps =
225
306
  *std::static_pointer_cast<const EaseViewProps>(props);
226
307
 
308
+ // oldProps can be null. Fall back to props so the diff is a no-op.
309
+ const auto &oldViewProps = *std::static_pointer_cast<const EaseViewProps>(
310
+ oldProps ? oldProps : props);
311
+
227
312
  [super updateProps:props oldProps:oldProps];
228
313
 
229
314
  [CATransaction begin];
@@ -298,40 +383,77 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
298
383
  newViewProps.initialAnimateBackgroundColor)
299
384
  .CGColor;
300
385
 
301
- // Animate from initial to target
386
+ // Animate from initial to target (skip if config is 'none')
302
387
  if (hasInitialOpacity) {
388
+ EaseTransitionConfig opacityConfig =
389
+ transitionConfigForProperty("opacity", newViewProps);
303
390
  self.layer.opacity = newViewProps.animateOpacity;
304
- [self applyAnimationForKeyPath:@"opacity"
305
- animationKey:kAnimKeyOpacity
306
- fromValue:@(newViewProps.initialAnimateOpacity)
307
- toValue:@(newViewProps.animateOpacity)
308
- props:newViewProps
309
- loop:YES];
391
+ if (opacityConfig.type != "none") {
392
+ [self applyAnimationForKeyPath:@"opacity"
393
+ animationKey:kAnimKeyOpacity
394
+ fromValue:@(newViewProps.initialAnimateOpacity)
395
+ toValue:@(newViewProps.animateOpacity)
396
+ config:opacityConfig
397
+ loop:YES];
398
+ }
310
399
  }
311
400
  if (hasInitialTransform) {
401
+ // Build mask of which transform sub-properties actually changed
402
+ int changedInitTransform = 0;
403
+ if (newViewProps.initialAnimateTranslateX !=
404
+ newViewProps.animateTranslateX)
405
+ changedInitTransform |= kMaskTranslateX;
406
+ if (newViewProps.initialAnimateTranslateY !=
407
+ newViewProps.animateTranslateY)
408
+ changedInitTransform |= kMaskTranslateY;
409
+ if (newViewProps.initialAnimateScaleX != newViewProps.animateScaleX)
410
+ changedInitTransform |= kMaskScaleX;
411
+ if (newViewProps.initialAnimateScaleY != newViewProps.animateScaleY)
412
+ changedInitTransform |= kMaskScaleY;
413
+ if (newViewProps.initialAnimateRotate != newViewProps.animateRotate)
414
+ changedInitTransform |= kMaskRotate;
415
+ if (newViewProps.initialAnimateRotateX != newViewProps.animateRotateX)
416
+ changedInitTransform |= kMaskRotateX;
417
+ if (newViewProps.initialAnimateRotateY != newViewProps.animateRotateY)
418
+ changedInitTransform |= kMaskRotateY;
419
+ std::string transformName =
420
+ lowestTransformPropertyName(changedInitTransform);
421
+ EaseTransitionConfig transformConfig =
422
+ transitionConfigForProperty(transformName, newViewProps);
312
423
  self.layer.transform = targetT;
313
- [self applyAnimationForKeyPath:@"transform"
424
+ if (transformConfig.type != "none") {
425
+ [self
426
+ applyAnimationForKeyPath:@"transform"
314
427
  animationKey:kAnimKeyTransform
315
428
  fromValue:[NSValue valueWithCATransform3D:initialT]
316
429
  toValue:[NSValue valueWithCATransform3D:targetT]
317
- props:newViewProps
430
+ config:transformConfig
318
431
  loop:YES];
432
+ }
319
433
  }
320
434
  if (hasInitialBorderRadius) {
435
+ EaseTransitionConfig brConfig =
436
+ transitionConfigForProperty("borderRadius", newViewProps);
321
437
  self.layer.cornerRadius = newViewProps.animateBorderRadius;
322
- [self
323
- applyAnimationForKeyPath:@"cornerRadius"
324
- animationKey:kAnimKeyCornerRadius
325
- fromValue:@(newViewProps.initialAnimateBorderRadius)
326
- toValue:@(newViewProps.animateBorderRadius)
327
- props:newViewProps
328
- loop:YES];
438
+ if (brConfig.type != "none") {
439
+ [self applyAnimationForKeyPath:@"cornerRadius"
440
+ animationKey:kAnimKeyCornerRadius
441
+ fromValue:@(newViewProps
442
+ .initialAnimateBorderRadius)
443
+ toValue:@(newViewProps.animateBorderRadius)
444
+ config:brConfig
445
+ loop:YES];
446
+ }
329
447
  }
330
448
  if (hasInitialBackgroundColor) {
449
+ EaseTransitionConfig bgConfig =
450
+ transitionConfigForProperty("backgroundColor", newViewProps);
331
451
  self.layer.backgroundColor =
332
452
  RCTUIColorFromSharedColor(newViewProps.animateBackgroundColor)
333
453
  .CGColor;
334
- [self applyAnimationForKeyPath:@"backgroundColor"
454
+ if (bgConfig.type != "none") {
455
+ [self
456
+ applyAnimationForKeyPath:@"backgroundColor"
335
457
  animationKey:kAnimKeyBackgroundColor
336
458
  fromValue:(__bridge id)RCTUIColorFromSharedColor(
337
459
  newViewProps
@@ -340,8 +462,19 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
340
462
  toValue:(__bridge id)RCTUIColorFromSharedColor(
341
463
  newViewProps.animateBackgroundColor)
342
464
  .CGColor
343
- props:newViewProps
465
+ config:bgConfig
344
466
  loop:YES];
467
+ }
468
+ }
469
+
470
+ // If all per-property configs were 'none', no animations were queued.
471
+ // Fire onTransitionEnd immediately to match the scalar 'none' contract.
472
+ if (_pendingAnimationCount == 0 && _eventEmitter) {
473
+ auto emitter =
474
+ std::static_pointer_cast<const EaseViewEventEmitter>(_eventEmitter);
475
+ emitter->onTransitionEnd(EaseViewEventEmitter::OnTransitionEnd{
476
+ .finished = true,
477
+ });
345
478
  }
346
479
  } else {
347
480
  // No initial animation — set target values directly
@@ -358,8 +491,16 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
358
491
  RCTUIColorFromSharedColor(newViewProps.animateBackgroundColor)
359
492
  .CGColor;
360
493
  }
361
- } else if (newViewProps.transitionType == EaseViewTransitionType::None) {
362
- // No transition — set values immediately
494
+ } else if (newViewProps.transitions.defaultConfig.type == "none" &&
495
+ (!hasConfig(newViewProps.transitions.transform) ||
496
+ newViewProps.transitions.transform.type == "none") &&
497
+ (!hasConfig(newViewProps.transitions.opacity) ||
498
+ newViewProps.transitions.opacity.type == "none") &&
499
+ (!hasConfig(newViewProps.transitions.borderRadius) ||
500
+ newViewProps.transitions.borderRadius.type == "none") &&
501
+ (!hasConfig(newViewProps.transitions.backgroundColor) ||
502
+ newViewProps.transitions.backgroundColor.type == "none")) {
503
+ // All transitions are 'none' — set values immediately
363
504
  [self.layer removeAllAnimations];
364
505
  if (mask & kMaskOpacity)
365
506
  self.layer.opacity = newViewProps.animateOpacity;
@@ -382,19 +523,27 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
382
523
  }
383
524
  } else {
384
525
  // Subsequent updates: animate changed properties
385
- const auto &oldViewProps =
386
- *std::static_pointer_cast<const EaseViewProps>(oldProps);
526
+ BOOL anyPropertyChanged = NO;
387
527
 
388
528
  if ((mask & kMaskOpacity) &&
389
529
  oldViewProps.animateOpacity != newViewProps.animateOpacity) {
390
- self.layer.opacity = newViewProps.animateOpacity;
391
- [self
392
- applyAnimationForKeyPath:@"opacity"
393
- animationKey:kAnimKeyOpacity
394
- fromValue:[self presentationValueForKeyPath:@"opacity"]
395
- toValue:@(newViewProps.animateOpacity)
396
- props:newViewProps
397
- loop:NO];
530
+ anyPropertyChanged = YES;
531
+ EaseTransitionConfig opacityConfig =
532
+ transitionConfigForProperty("opacity", newViewProps);
533
+ if (opacityConfig.type == "none") {
534
+ self.layer.opacity = newViewProps.animateOpacity;
535
+ [self.layer removeAnimationForKey:kAnimKeyOpacity];
536
+ } else {
537
+ self.layer.opacity = newViewProps.animateOpacity;
538
+ [self
539
+ applyAnimationForKeyPath:@"opacity"
540
+ animationKey:kAnimKeyOpacity
541
+ fromValue:[self
542
+ presentationValueForKeyPath:@"opacity"]
543
+ toValue:@(newViewProps.animateOpacity)
544
+ config:opacityConfig
545
+ loop:NO];
546
+ }
398
547
  }
399
548
 
400
549
  // Check if ANY transform-related property changed
@@ -409,46 +558,98 @@ static const int kMaskAnyTransform = kMaskTranslateX | kMaskTranslateY |
409
558
  oldViewProps.animateRotateY != newViewProps.animateRotateY;
410
559
 
411
560
  if (anyTransformChanged) {
412
- CATransform3D fromT = [self presentationTransform];
413
- CATransform3D toT = [self targetTransformFromProps:newViewProps];
414
- self.layer.transform = toT;
415
- [self applyAnimationForKeyPath:@"transform"
416
- animationKey:kAnimKeyTransform
417
- fromValue:[NSValue valueWithCATransform3D:fromT]
418
- toValue:[NSValue valueWithCATransform3D:toT]
419
- props:newViewProps
420
- loop:NO];
561
+ anyPropertyChanged = YES;
562
+ // Determine which transform sub-properties changed for config selection
563
+ int changedTransformMask = 0;
564
+ if (oldViewProps.animateTranslateX != newViewProps.animateTranslateX)
565
+ changedTransformMask |= kMaskTranslateX;
566
+ if (oldViewProps.animateTranslateY != newViewProps.animateTranslateY)
567
+ changedTransformMask |= kMaskTranslateY;
568
+ if (oldViewProps.animateScaleX != newViewProps.animateScaleX)
569
+ changedTransformMask |= kMaskScaleX;
570
+ if (oldViewProps.animateScaleY != newViewProps.animateScaleY)
571
+ changedTransformMask |= kMaskScaleY;
572
+ if (oldViewProps.animateRotate != newViewProps.animateRotate)
573
+ changedTransformMask |= kMaskRotate;
574
+ if (oldViewProps.animateRotateX != newViewProps.animateRotateX)
575
+ changedTransformMask |= kMaskRotateX;
576
+ if (oldViewProps.animateRotateY != newViewProps.animateRotateY)
577
+ changedTransformMask |= kMaskRotateY;
578
+
579
+ std::string transformName =
580
+ lowestTransformPropertyName(changedTransformMask);
581
+ EaseTransitionConfig transformConfig =
582
+ transitionConfigForProperty(transformName, newViewProps);
583
+
584
+ if (transformConfig.type == "none") {
585
+ self.layer.transform = [self targetTransformFromProps:newViewProps];
586
+ [self.layer removeAnimationForKey:kAnimKeyTransform];
587
+ } else {
588
+ CATransform3D fromT = [self presentationTransform];
589
+ CATransform3D toT = [self targetTransformFromProps:newViewProps];
590
+ self.layer.transform = toT;
591
+ [self applyAnimationForKeyPath:@"transform"
592
+ animationKey:kAnimKeyTransform
593
+ fromValue:[NSValue valueWithCATransform3D:fromT]
594
+ toValue:[NSValue valueWithCATransform3D:toT]
595
+ config:transformConfig
596
+ loop:NO];
597
+ }
421
598
  }
422
599
  }
423
600
 
424
601
  if ((mask & kMaskBorderRadius) &&
425
602
  oldViewProps.animateBorderRadius != newViewProps.animateBorderRadius) {
603
+ anyPropertyChanged = YES;
604
+ EaseTransitionConfig brConfig =
605
+ transitionConfigForProperty("borderRadius", newViewProps);
426
606
  self.layer.cornerRadius = newViewProps.animateBorderRadius;
427
607
  self.layer.masksToBounds = newViewProps.animateBorderRadius > 0;
428
- [self applyAnimationForKeyPath:@"cornerRadius"
429
- animationKey:kAnimKeyCornerRadius
430
- fromValue:[self presentationValueForKeyPath:
431
- @"cornerRadius"]
432
- toValue:@(newViewProps.animateBorderRadius)
433
- props:newViewProps
434
- loop:NO];
608
+ if (brConfig.type == "none") {
609
+ [self.layer removeAnimationForKey:kAnimKeyCornerRadius];
610
+ } else {
611
+ [self applyAnimationForKeyPath:@"cornerRadius"
612
+ animationKey:kAnimKeyCornerRadius
613
+ fromValue:[self presentationValueForKeyPath:
614
+ @"cornerRadius"]
615
+ toValue:@(newViewProps.animateBorderRadius)
616
+ config:brConfig
617
+ loop:NO];
618
+ }
435
619
  }
436
620
 
437
621
  if ((mask & kMaskBackgroundColor) &&
438
622
  oldViewProps.animateBackgroundColor !=
439
623
  newViewProps.animateBackgroundColor) {
440
- CGColorRef fromColor = (__bridge CGColorRef)
441
- [self presentationValueForKeyPath:@"backgroundColor"];
624
+ anyPropertyChanged = YES;
625
+ EaseTransitionConfig bgConfig =
626
+ transitionConfigForProperty("backgroundColor", newViewProps);
442
627
  CGColorRef toColor =
443
628
  RCTUIColorFromSharedColor(newViewProps.animateBackgroundColor)
444
629
  .CGColor;
445
630
  self.layer.backgroundColor = toColor;
446
- [self applyAnimationForKeyPath:@"backgroundColor"
447
- animationKey:kAnimKeyBackgroundColor
448
- fromValue:(__bridge id)fromColor
449
- toValue:(__bridge id)toColor
450
- props:newViewProps
451
- loop:NO];
631
+ if (bgConfig.type == "none") {
632
+ [self.layer removeAnimationForKey:kAnimKeyBackgroundColor];
633
+ } else {
634
+ CGColorRef fromColor = (__bridge CGColorRef)
635
+ [self presentationValueForKeyPath:@"backgroundColor"];
636
+ [self applyAnimationForKeyPath:@"backgroundColor"
637
+ animationKey:kAnimKeyBackgroundColor
638
+ fromValue:(__bridge id)fromColor
639
+ toValue:(__bridge id)toColor
640
+ config:bgConfig
641
+ loop:NO];
642
+ }
643
+ }
644
+
645
+ // If all changed properties resolved to 'none', no animations were queued.
646
+ // Fire onTransitionEnd immediately.
647
+ if (anyPropertyChanged && _pendingAnimationCount == 0 && _eventEmitter) {
648
+ auto emitter =
649
+ std::static_pointer_cast<const EaseViewEventEmitter>(_eventEmitter);
650
+ emitter->onTransitionEnd(EaseViewEventEmitter::OnTransitionEnd{
651
+ .finished = true,
652
+ });
452
653
  }
453
654
  }
454
655
 
@@ -52,6 +52,88 @@ const EASING_PRESETS = {
52
52
  easeOut: [0, 0, 0.58, 1],
53
53
  easeInOut: [0.42, 0, 0.58, 1]
54
54
  };
55
+
56
+ /** Returns true if the transition is a SingleTransition (has a `type` field). */
57
+ function isSingleTransition(t) {
58
+ return 'type' in t;
59
+ }
60
+ /** Default config: timing 300ms easeInOut. */
61
+ const DEFAULT_CONFIG = {
62
+ type: 'timing',
63
+ duration: 300,
64
+ easingBezier: [0.42, 0, 0.58, 1],
65
+ damping: 15,
66
+ stiffness: 120,
67
+ mass: 1,
68
+ loop: 'none',
69
+ delay: 0
70
+ };
71
+
72
+ /** Resolve a SingleTransition into a native config object. */
73
+ function resolveSingleConfig(config) {
74
+ const type = config.type;
75
+ const duration = config.type === 'timing' ? config.duration ?? 300 : 300;
76
+ const rawEasing = config.type === 'timing' ? config.easing ?? 'easeInOut' : 'easeInOut';
77
+ if (__DEV__) {
78
+ if (Array.isArray(rawEasing)) {
79
+ if (rawEasing.length !== 4) {
80
+ console.warn('react-native-ease: Custom easing must be a [x1, y1, x2, y2] tuple (got length ' + rawEasing.length + ').');
81
+ }
82
+ if (rawEasing[0] < 0 || rawEasing[0] > 1 || rawEasing[2] < 0 || rawEasing[2] > 1) {
83
+ console.warn('react-native-ease: Easing x-values (x1, x2) must be between 0 and 1.');
84
+ }
85
+ }
86
+ }
87
+ const easingBezier = Array.isArray(rawEasing) ? rawEasing : EASING_PRESETS[rawEasing];
88
+ const damping = config.type === 'spring' ? config.damping ?? 15 : 15;
89
+ const stiffness = config.type === 'spring' ? config.stiffness ?? 120 : 120;
90
+ const mass = config.type === 'spring' ? config.mass ?? 1 : 1;
91
+ const loop = config.type === 'timing' ? config.loop ?? 'none' : 'none';
92
+ const delay = config.type === 'timing' || config.type === 'spring' ? config.delay ?? 0 : 0;
93
+ return {
94
+ type,
95
+ duration,
96
+ easingBezier,
97
+ damping,
98
+ stiffness,
99
+ mass,
100
+ loop,
101
+ delay
102
+ };
103
+ }
104
+
105
+ /** Category keys that map to optional NativeTransitions fields. */
106
+ const CATEGORY_KEYS = ['transform', 'opacity', 'borderRadius', 'backgroundColor'];
107
+
108
+ /** Resolve the transition prop into a NativeTransitions struct. */
109
+ function resolveTransitions(transition) {
110
+ // No transition: timing default for all properties
111
+ if (transition == null) {
112
+ return {
113
+ defaultConfig: DEFAULT_CONFIG
114
+ };
115
+ }
116
+
117
+ // Single transition: set as defaultConfig only
118
+ if (isSingleTransition(transition)) {
119
+ return {
120
+ defaultConfig: resolveSingleConfig(transition)
121
+ };
122
+ }
123
+
124
+ // TransitionMap: resolve defaultConfig + only specified category keys
125
+ const defaultConfig = transition.default ? resolveSingleConfig(transition.default) : DEFAULT_CONFIG;
126
+ const result = {
127
+ defaultConfig
128
+ };
129
+ for (const key of CATEGORY_KEYS) {
130
+ const specific = transition[key];
131
+ if (specific != null) {
132
+ result[key] = resolveSingleConfig(specific);
133
+ }
134
+ }
135
+ return result;
136
+ }
55
137
  export function EaseView({
56
138
  animate,
57
139
  initialAnimate,
@@ -135,25 +217,8 @@ export function EaseView({
135
217
  }
136
218
  }
137
219
 
138
- // Resolve transition config
139
- const transitionType = transition?.type ?? 'timing';
140
- const transitionDuration = transition?.type === 'timing' ? transition.duration ?? 300 : 300;
141
- const rawEasing = transition?.type === 'timing' ? transition.easing ?? 'easeInOut' : 'easeInOut';
142
- if (__DEV__) {
143
- if (Array.isArray(rawEasing)) {
144
- if (rawEasing.length !== 4) {
145
- console.warn('react-native-ease: Custom easing must be a [x1, y1, x2, y2] tuple (got length ' + rawEasing.length + ').');
146
- }
147
- if (rawEasing[0] < 0 || rawEasing[0] > 1 || rawEasing[2] < 0 || rawEasing[2] > 1) {
148
- console.warn('react-native-ease: Easing x-values (x1, x2) must be between 0 and 1.');
149
- }
150
- }
151
- }
152
- const bezier = Array.isArray(rawEasing) ? rawEasing : EASING_PRESETS[rawEasing];
153
- const transitionDamping = transition?.type === 'spring' ? transition.damping ?? 15 : 15;
154
- const transitionStiffness = transition?.type === 'spring' ? transition.stiffness ?? 120 : 120;
155
- const transitionMass = transition?.type === 'spring' ? transition.mass ?? 1 : 1;
156
- const transitionLoop = transition?.type === 'timing' ? transition.loop ?? 'none' : 'none';
220
+ // Resolve transition config into a fully-populated struct
221
+ const transitions = resolveTransitions(transition);
157
222
  const handleTransitionEnd = onTransitionEnd ? event => onTransitionEnd(event.nativeEvent) : undefined;
158
223
  return /*#__PURE__*/_jsx(NativeEaseView, {
159
224
  style: cleanStyle,
@@ -179,13 +244,7 @@ export function EaseView({
179
244
  initialAnimateRotateY: resolvedInitial.rotateY,
180
245
  initialAnimateBorderRadius: resolvedInitial.borderRadius,
181
246
  initialAnimateBackgroundColor: initialBgColor,
182
- transitionType: transitionType,
183
- transitionDuration: transitionDuration,
184
- transitionEasingBezier: bezier,
185
- transitionDamping: transitionDamping,
186
- transitionStiffness: transitionStiffness,
187
- transitionMass: transitionMass,
188
- transitionLoop: transitionLoop,
247
+ transitions: transitions,
189
248
  useHardwareLayer: useHardwareLayer,
190
249
  transformOriginX: transformOrigin?.x ?? 0.5,
191
250
  transformOriginY: transformOrigin?.y ?? 0.5,
@@ -1 +1 @@
1
- {"version":3,"names":["StyleSheet","NativeEaseView","jsx","_jsx","IDENTITY","opacity","translateX","translateY","scaleX","scaleY","rotate","rotateX","rotateY","borderRadius","MASK_OPACITY","MASK_TRANSLATE_X","MASK_TRANSLATE_Y","MASK_SCALE_X","MASK_SCALE_Y","MASK_ROTATE","MASK_ROTATE_X","MASK_ROTATE_Y","MASK_BORDER_RADIUS","MASK_BACKGROUND_COLOR","ANIMATE_TO_STYLE_KEYS","scale","backgroundColor","EASING_PRESETS","linear","easeIn","easeOut","easeInOut","EaseView","animate","initialAnimate","transition","onTransitionEnd","useHardwareLayer","transformOrigin","style","rest","animatedProperties","resolved","initial","resolvedInitial","animBgColor","initialBgColor","cleanStyle","flat","flatten","conflicting","Set","key","Object","keys","styleKey","add","size","__DEV__","console","warn","join","cleaned","k","v","entries","has","transitionType","type","transitionDuration","duration","rawEasing","easing","Array","isArray","length","bezier","transitionDamping","damping","transitionStiffness","stiffness","transitionMass","mass","transitionLoop","loop","handleTransitionEnd","event","nativeEvent","undefined","animateOpacity","animateTranslateX","animateTranslateY","animateScaleX","animateScaleY","animateRotate","animateRotateX","animateRotateY","animateBorderRadius","animateBackgroundColor","initialAnimateOpacity","initialAnimateTranslateX","initialAnimateTranslateY","initialAnimateScaleX","initialAnimateScaleY","initialAnimateRotate","initialAnimateRotateX","initialAnimateRotateY","initialAnimateBorderRadius","initialAnimateBackgroundColor","transitionEasingBezier","transformOriginX","x","transformOriginY","y"],"sourceRoot":"../../src","sources":["EaseView.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAwC,cAAc;AACzE,OAAOC,cAAc,MAAM,2BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AASvD;AACA,MAAMC,QAAQ,GAAG;EACfC,OAAO,EAAE,CAAC;EACVC,UAAU,EAAE,CAAC;EACbC,UAAU,EAAE,CAAC;EACbC,MAAM,EAAE,CAAC;EACTC,MAAM,EAAE,CAAC;EACTC,MAAM,EAAE,CAAC;EACTC,OAAO,EAAE,CAAC;EACVC,OAAO,EAAE,CAAC;EACVC,YAAY,EAAE;AAChB,CAAC;;AAED;AACA;AACA,MAAMC,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAMC,gBAAgB,GAAG,CAAC,IAAI,CAAC;AAC/B,MAAMC,gBAAgB,GAAG,CAAC,IAAI,CAAC;AAC/B,MAAMC,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAMC,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAMC,WAAW,GAAG,CAAC,IAAI,CAAC;AAC1B,MAAMC,aAAa,GAAG,CAAC,IAAI,CAAC;AAC5B,MAAMC,aAAa,GAAG,CAAC,IAAI,CAAC;AAC5B,MAAMC,kBAAkB,GAAG,CAAC,IAAI,CAAC;AACjC,MAAMC,qBAAqB,GAAG,CAAC,IAAI,CAAC;AACpC;;AAEA;AACA,MAAMC,qBAAyD,GAAG;EAChEnB,OAAO,EAAE,SAAS;EAClBC,UAAU,EAAE,WAAW;EACvBC,UAAU,EAAE,WAAW;EACvBkB,KAAK,EAAE,WAAW;EAClBjB,MAAM,EAAE,WAAW;EACnBC,MAAM,EAAE,WAAW;EACnBC,MAAM,EAAE,WAAW;EACnBC,OAAO,EAAE,WAAW;EACpBC,OAAO,EAAE,WAAW;EACpBC,YAAY,EAAE,cAAc;EAC5Ba,eAAe,EAAE;AACnB,CAAC;;AAED;AACA,MAAMC,cAA2C,GAAG;EAClDC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EACpBC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EACvBC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EACxBC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAgCD,OAAO,SAASC,QAAQA,CAAC;EACvBC,OAAO;EACPC,cAAc;EACdC,UAAU;EACVC,eAAe;EACfC,gBAAgB,GAAG,KAAK;EACxBC,eAAe;EACfC,KAAK;EACL,GAAGC;AACU,CAAC,EAAE;EAChB;EACA;EACA;EACA,IAAIC,kBAAkB,GAAG,CAAC;EAC1B,IAAIR,OAAO,EAAE5B,OAAO,IAAI,IAAI,EAAEoC,kBAAkB,IAAI3B,YAAY;EAChE,IAAImB,OAAO,EAAE3B,UAAU,IAAI,IAAI,EAAEmC,kBAAkB,IAAI1B,gBAAgB;EACvE,IAAIkB,OAAO,EAAE1B,UAAU,IAAI,IAAI,EAAEkC,kBAAkB,IAAIzB,gBAAgB;EACvE,IAAIiB,OAAO,EAAEzB,MAAM,IAAI,IAAI,IAAIyB,OAAO,EAAER,KAAK,IAAI,IAAI,EACnDgB,kBAAkB,IAAIxB,YAAY;EACpC,IAAIgB,OAAO,EAAExB,MAAM,IAAI,IAAI,IAAIwB,OAAO,EAAER,KAAK,IAAI,IAAI,EACnDgB,kBAAkB,IAAIvB,YAAY;EACpC,IAAIe,OAAO,EAAEvB,MAAM,IAAI,IAAI,EAAE+B,kBAAkB,IAAItB,WAAW;EAC9D,IAAIc,OAAO,EAAEtB,OAAO,IAAI,IAAI,EAAE8B,kBAAkB,IAAIrB,aAAa;EACjE,IAAIa,OAAO,EAAErB,OAAO,IAAI,IAAI,EAAE6B,kBAAkB,IAAIpB,aAAa;EACjE,IAAIY,OAAO,EAAEpB,YAAY,IAAI,IAAI,EAAE4B,kBAAkB,IAAInB,kBAAkB;EAC3E,IAAIW,OAAO,EAAEP,eAAe,IAAI,IAAI,EAClCe,kBAAkB,IAAIlB,qBAAqB;EAC7C;;EAEA;EACA,MAAMmB,QAAQ,GAAG;IACf,GAAGtC,QAAQ;IACX,GAAG6B,OAAO;IACVzB,MAAM,EAAEyB,OAAO,EAAEzB,MAAM,IAAIyB,OAAO,EAAER,KAAK,IAAIrB,QAAQ,CAACI,MAAM;IAC5DC,MAAM,EAAEwB,OAAO,EAAExB,MAAM,IAAIwB,OAAO,EAAER,KAAK,IAAIrB,QAAQ,CAACK,MAAM;IAC5DE,OAAO,EAAEsB,OAAO,EAAEtB,OAAO,IAAIP,QAAQ,CAACO,OAAO;IAC7CC,OAAO,EAAEqB,OAAO,EAAErB,OAAO,IAAIR,QAAQ,CAACQ;EACxC,CAAC;;EAED;EACA;EACA;EACA;EACA,MAAM+B,OAAO,GAAGT,cAAc,IAAID,OAAO;EACzC,MAAMW,eAAe,GAAG;IACtB,GAAGxC,QAAQ;IACX,GAAGuC,OAAO;IACVnC,MAAM,EAAEmC,OAAO,EAAEnC,MAAM,IAAImC,OAAO,EAAElB,KAAK,IAAIrB,QAAQ,CAACI,MAAM;IAC5DC,MAAM,EAAEkC,OAAO,EAAElC,MAAM,IAAIkC,OAAO,EAAElB,KAAK,IAAIrB,QAAQ,CAACK,MAAM;IAC5DE,OAAO,EAAEgC,OAAO,EAAEhC,OAAO,IAAIP,QAAQ,CAACO,OAAO;IAC7CC,OAAO,EAAE+B,OAAO,EAAE/B,OAAO,IAAIR,QAAQ,CAACQ;EACxC,CAAC;;EAED;EACA,MAAMiC,WAAW,GAAGZ,OAAO,EAAEP,eAAe,IAAI,aAAa;EAC7D,MAAMoB,cAAc,GAAGZ,cAAc,EAAER,eAAe,IAAImB,WAAW;;EAErE;EACA,IAAIE,UAA8B,GAAGR,KAAK;EAC1C,IAAIN,OAAO,IAAIM,KAAK,EAAE;IACpB,MAAMS,IAAI,GAAGhD,UAAU,CAACiD,OAAO,CAACV,KAAK,CAA4B;IACjE,IAAIS,IAAI,EAAE;MACR,MAAME,WAAW,GAAG,IAAIC,GAAG,CAAS,CAAC;MACrC,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACrB,OAAO,CAAC,EAA4B;QAChE,IAAIA,OAAO,CAACmB,GAAG,CAAC,IAAI,IAAI,EAAE;UACxB,MAAMG,QAAQ,GAAG/B,qBAAqB,CAAC4B,GAAG,CAAC;UAC3C,IAAIG,QAAQ,IAAIA,QAAQ,IAAIP,IAAI,EAAE;YAChCE,WAAW,CAACM,GAAG,CAACD,QAAQ,CAAC;UAC3B;QACF;MACF;MACA,IAAIL,WAAW,CAACO,IAAI,GAAG,CAAC,EAAE;QACxB,IAAIC,OAAO,EAAE;UACXC,OAAO,CAACC,IAAI,CACV,sBAAsB,CAAC,GAAGV,WAAW,CAAC,CAACW,IAAI,CACzC,IACF,CAAC,oCAAoC,GACnC,qEACJ,CAAC;QACH;QACA,MAAMC,OAAgC,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,CAACC,CAAC,EAAEC,CAAC,CAAC,IAAIX,MAAM,CAACY,OAAO,CAACjB,IAAI,CAAC,EAAE;UACzC,IAAI,CAACE,WAAW,CAACgB,GAAG,CAACH,CAAC,CAAC,EAAE;YACvBD,OAAO,CAACC,CAAC,CAAC,GAAGC,CAAC;UAChB;QACF;QACAjB,UAAU,GAAGe,OAAoB;MACnC;IACF;EACF;;EAEA;EACA,MAAMK,cAAc,GAAGhC,UAAU,EAAEiC,IAAI,IAAI,QAAQ;EACnD,MAAMC,kBAAkB,GACtBlC,UAAU,EAAEiC,IAAI,KAAK,QAAQ,GAAGjC,UAAU,CAACmC,QAAQ,IAAI,GAAG,GAAG,GAAG;EAClE,MAAMC,SAAS,GACbpC,UAAU,EAAEiC,IAAI,KAAK,QAAQ,GACzBjC,UAAU,CAACqC,MAAM,IAAI,WAAW,GAChC,WAAW;EACjB,IAAId,OAAO,EAAE;IACX,IAAIe,KAAK,CAACC,OAAO,CAACH,SAAS,CAAC,EAAE;MAC5B,IAAKA,SAAS,CAAcI,MAAM,KAAK,CAAC,EAAE;QACxChB,OAAO,CAACC,IAAI,CACV,gFAAgF,GAC7EW,SAAS,CAAcI,MAAM,GAC9B,IACJ,CAAC;MACH;MACA,IACEJ,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAChBA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAChBA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAChBA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAChB;QACAZ,OAAO,CAACC,IAAI,CACV,sEACF,CAAC;MACH;IACF;EACF;EACA,MAAMgB,MAAmB,GAAGH,KAAK,CAACC,OAAO,CAACH,SAAS,CAAC,GAChDA,SAAS,GACT5C,cAAc,CAAC4C,SAAS,CAAE;EAC9B,MAAMM,iBAAiB,GACrB1C,UAAU,EAAEiC,IAAI,KAAK,QAAQ,GAAGjC,UAAU,CAAC2C,OAAO,IAAI,EAAE,GAAG,EAAE;EAC/D,MAAMC,mBAAmB,GACvB5C,UAAU,EAAEiC,IAAI,KAAK,QAAQ,GAAGjC,UAAU,CAAC6C,SAAS,IAAI,GAAG,GAAG,GAAG;EACnE,MAAMC,cAAc,GAClB9C,UAAU,EAAEiC,IAAI,KAAK,QAAQ,GAAGjC,UAAU,CAAC+C,IAAI,IAAI,CAAC,GAAG,CAAC;EAC1D,MAAMC,cAAc,GAClBhD,UAAU,EAAEiC,IAAI,KAAK,QAAQ,GAAGjC,UAAU,CAACiD,IAAI,IAAI,MAAM,GAAG,MAAM;EAEpE,MAAMC,mBAAmB,GAAGjD,eAAe,GACtCkD,KAA6C,IAC5ClD,eAAe,CAACkD,KAAK,CAACC,WAAW,CAAC,GACpCC,SAAS;EAEb,oBACErF,IAAA,CAACF,cAAc;IACbsC,KAAK,EAAEQ,UAAW;IAClBX,eAAe,EAAEiD,mBAAoB;IACrC5C,kBAAkB,EAAEA,kBAAmB;IACvCgD,cAAc,EAAE/C,QAAQ,CAACrC,OAAQ;IACjCqF,iBAAiB,EAAEhD,QAAQ,CAACpC,UAAW;IACvCqF,iBAAiB,EAAEjD,QAAQ,CAACnC,UAAW;IACvCqF,aAAa,EAAElD,QAAQ,CAAClC,MAAO;IAC/BqF,aAAa,EAAEnD,QAAQ,CAACjC,MAAO;IAC/BqF,aAAa,EAAEpD,QAAQ,CAAChC,MAAO;IAC/BqF,cAAc,EAAErD,QAAQ,CAAC/B,OAAQ;IACjCqF,cAAc,EAAEtD,QAAQ,CAAC9B,OAAQ;IACjCqF,mBAAmB,EAAEvD,QAAQ,CAAC7B,YAAa;IAC3CqF,sBAAsB,EAAErD,WAAY;IACpCsD,qBAAqB,EAAEvD,eAAe,CAACvC,OAAQ;IAC/C+F,wBAAwB,EAAExD,eAAe,CAACtC,UAAW;IACrD+F,wBAAwB,EAAEzD,eAAe,CAACrC,UAAW;IACrD+F,oBAAoB,EAAE1D,eAAe,CAACpC,MAAO;IAC7C+F,oBAAoB,EAAE3D,eAAe,CAACnC,MAAO;IAC7C+F,oBAAoB,EAAE5D,eAAe,CAAClC,MAAO;IAC7C+F,qBAAqB,EAAE7D,eAAe,CAACjC,OAAQ;IAC/C+F,qBAAqB,EAAE9D,eAAe,CAAChC,OAAQ;IAC/C+F,0BAA0B,EAAE/D,eAAe,CAAC/B,YAAa;IACzD+F,6BAA6B,EAAE9D,cAAe;IAC9CqB,cAAc,EAAEA,cAAe;IAC/BE,kBAAkB,EAAEA,kBAAmB;IACvCwC,sBAAsB,EAAEjC,MAAO;IAC/BC,iBAAiB,EAAEA,iBAAkB;IACrCE,mBAAmB,EAAEA,mBAAoB;IACzCE,cAAc,EAAEA,cAAe;IAC/BE,cAAc,EAAEA,cAAe;IAC/B9C,gBAAgB,EAAEA,gBAAiB;IACnCyE,gBAAgB,EAAExE,eAAe,EAAEyE,CAAC,IAAI,GAAI;IAC5CC,gBAAgB,EAAE1E,eAAe,EAAE2E,CAAC,IAAI,GAAI;IAAA,GACxCzE;EAAI,CACT,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"names":["StyleSheet","NativeEaseView","jsx","_jsx","IDENTITY","opacity","translateX","translateY","scaleX","scaleY","rotate","rotateX","rotateY","borderRadius","MASK_OPACITY","MASK_TRANSLATE_X","MASK_TRANSLATE_Y","MASK_SCALE_X","MASK_SCALE_Y","MASK_ROTATE","MASK_ROTATE_X","MASK_ROTATE_Y","MASK_BORDER_RADIUS","MASK_BACKGROUND_COLOR","ANIMATE_TO_STYLE_KEYS","scale","backgroundColor","EASING_PRESETS","linear","easeIn","easeOut","easeInOut","isSingleTransition","t","DEFAULT_CONFIG","type","duration","easingBezier","damping","stiffness","mass","loop","delay","resolveSingleConfig","config","rawEasing","easing","__DEV__","Array","isArray","length","console","warn","CATEGORY_KEYS","resolveTransitions","transition","defaultConfig","default","result","key","specific","EaseView","animate","initialAnimate","onTransitionEnd","useHardwareLayer","transformOrigin","style","rest","animatedProperties","resolved","initial","resolvedInitial","animBgColor","initialBgColor","cleanStyle","flat","flatten","conflicting","Set","Object","keys","styleKey","add","size","join","cleaned","k","v","entries","has","transitions","handleTransitionEnd","event","nativeEvent","undefined","animateOpacity","animateTranslateX","animateTranslateY","animateScaleX","animateScaleY","animateRotate","animateRotateX","animateRotateY","animateBorderRadius","animateBackgroundColor","initialAnimateOpacity","initialAnimateTranslateX","initialAnimateTranslateY","initialAnimateScaleX","initialAnimateScaleY","initialAnimateRotate","initialAnimateRotateX","initialAnimateRotateY","initialAnimateBorderRadius","initialAnimateBackgroundColor","transformOriginX","x","transformOriginY","y"],"sourceRoot":"../../src","sources":["EaseView.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAwC,cAAc;AACzE,OAAOC,cAAc,MAA4B,2BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAU7E;AACA,MAAMC,QAAQ,GAAG;EACfC,OAAO,EAAE,CAAC;EACVC,UAAU,EAAE,CAAC;EACbC,UAAU,EAAE,CAAC;EACbC,MAAM,EAAE,CAAC;EACTC,MAAM,EAAE,CAAC;EACTC,MAAM,EAAE,CAAC;EACTC,OAAO,EAAE,CAAC;EACVC,OAAO,EAAE,CAAC;EACVC,YAAY,EAAE;AAChB,CAAC;;AAED;AACA;AACA,MAAMC,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAMC,gBAAgB,GAAG,CAAC,IAAI,CAAC;AAC/B,MAAMC,gBAAgB,GAAG,CAAC,IAAI,CAAC;AAC/B,MAAMC,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAMC,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAMC,WAAW,GAAG,CAAC,IAAI,CAAC;AAC1B,MAAMC,aAAa,GAAG,CAAC,IAAI,CAAC;AAC5B,MAAMC,aAAa,GAAG,CAAC,IAAI,CAAC;AAC5B,MAAMC,kBAAkB,GAAG,CAAC,IAAI,CAAC;AACjC,MAAMC,qBAAqB,GAAG,CAAC,IAAI,CAAC;AACpC;;AAEA;AACA,MAAMC,qBAAyD,GAAG;EAChEnB,OAAO,EAAE,SAAS;EAClBC,UAAU,EAAE,WAAW;EACvBC,UAAU,EAAE,WAAW;EACvBkB,KAAK,EAAE,WAAW;EAClBjB,MAAM,EAAE,WAAW;EACnBC,MAAM,EAAE,WAAW;EACnBC,MAAM,EAAE,WAAW;EACnBC,OAAO,EAAE,WAAW;EACpBC,OAAO,EAAE,WAAW;EACpBC,YAAY,EAAE,cAAc;EAC5Ba,eAAe,EAAE;AACnB,CAAC;;AAED;AACA,MAAMC,cAA2C,GAAG;EAClDC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EACpBC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EACvBC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EACxBC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;;AAED;AACA,SAASC,kBAAkBA,CAACC,CAAa,EAAyB;EAChE,OAAO,MAAM,IAAIA,CAAC;AACpB;AAKA;AACA,MAAMC,cAAsC,GAAG;EAC7CC,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,GAAG;EACbC,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EAChCC,OAAO,EAAE,EAAE;EACXC,SAAS,EAAE,GAAG;EACdC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE;AACT,CAAC;;AAED;AACA,SAASC,mBAAmBA,CAACC,MAAwB,EAA0B;EAC7E,MAAMT,IAAI,GAAGS,MAAM,CAACT,IAAc;EAClC,MAAMC,QAAQ,GAAGQ,MAAM,CAACT,IAAI,KAAK,QAAQ,GAAGS,MAAM,CAACR,QAAQ,IAAI,GAAG,GAAG,GAAG;EACxE,MAAMS,SAAS,GACbD,MAAM,CAACT,IAAI,KAAK,QAAQ,GAAGS,MAAM,CAACE,MAAM,IAAI,WAAW,GAAG,WAAW;EACvE,IAAIC,OAAO,EAAE;IACX,IAAIC,KAAK,CAACC,OAAO,CAACJ,SAAS,CAAC,EAAE;MAC5B,IAAKA,SAAS,CAAcK,MAAM,KAAK,CAAC,EAAE;QACxCC,OAAO,CAACC,IAAI,CACV,gFAAgF,GAC7EP,SAAS,CAAcK,MAAM,GAC9B,IACJ,CAAC;MACH;MACA,IACEL,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAChBA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAChBA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAChBA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAChB;QACAM,OAAO,CAACC,IAAI,CACV,sEACF,CAAC;MACH;IACF;EACF;EACA,MAAMf,YAAsB,GAAGW,KAAK,CAACC,OAAO,CAACJ,SAAS,CAAC,GACnDA,SAAS,GACTlB,cAAc,CAACkB,SAAS,CAAE;EAC9B,MAAMP,OAAO,GAAGM,MAAM,CAACT,IAAI,KAAK,QAAQ,GAAGS,MAAM,CAACN,OAAO,IAAI,EAAE,GAAG,EAAE;EACpE,MAAMC,SAAS,GAAGK,MAAM,CAACT,IAAI,KAAK,QAAQ,GAAGS,MAAM,CAACL,SAAS,IAAI,GAAG,GAAG,GAAG;EAC1E,MAAMC,IAAI,GAAGI,MAAM,CAACT,IAAI,KAAK,QAAQ,GAAGS,MAAM,CAACJ,IAAI,IAAI,CAAC,GAAG,CAAC;EAC5D,MAAMC,IAAY,GAChBG,MAAM,CAACT,IAAI,KAAK,QAAQ,GAAGS,MAAM,CAACH,IAAI,IAAI,MAAM,GAAG,MAAM;EAC3D,MAAMC,KAAK,GACTE,MAAM,CAACT,IAAI,KAAK,QAAQ,IAAIS,MAAM,CAACT,IAAI,KAAK,QAAQ,GAChDS,MAAM,CAACF,KAAK,IAAI,CAAC,GACjB,CAAC;EACP,OAAO;IACLP,IAAI;IACJC,QAAQ;IACRC,YAAY;IACZC,OAAO;IACPC,SAAS;IACTC,IAAI;IACJC,IAAI;IACJC;EACF,CAAC;AACH;;AAEA;AACA,MAAMW,aAAa,GAAG,CACpB,WAAW,EACX,SAAS,EACT,cAAc,EACd,iBAAiB,CACT;;AAEV;AACA,SAASC,kBAAkBA,CAACC,UAAuB,EAAqB;EACtE;EACA,IAAIA,UAAU,IAAI,IAAI,EAAE;IACtB,OAAO;MAAEC,aAAa,EAAEtB;IAAe,CAAC;EAC1C;;EAEA;EACA,IAAIF,kBAAkB,CAACuB,UAAU,CAAC,EAAE;IAClC,OAAO;MAAEC,aAAa,EAAEb,mBAAmB,CAACY,UAAU;IAAE,CAAC;EAC3D;;EAEA;EACA,MAAMC,aAAa,GAAGD,UAAU,CAACE,OAAO,GACpCd,mBAAmB,CAACY,UAAU,CAACE,OAAO,CAAC,GACvCvB,cAAc;EAElB,MAAMwB,MAAyB,GAAG;IAAEF;EAAc,CAAC;EAEnD,KAAK,MAAMG,GAAG,IAAIN,aAAa,EAAE;IAC/B,MAAMO,QAAQ,GAAGL,UAAU,CAACI,GAAG,CAAC;IAChC,IAAIC,QAAQ,IAAI,IAAI,EAAE;MACnBF,MAAM,CAA4CC,GAAG,CAAC,GACrDhB,mBAAmB,CAACiB,QAAQ,CAAC;IACjC;EACF;EAEA,OAAOF,MAAM;AACf;AAkCA,OAAO,SAASG,QAAQA,CAAC;EACvBC,OAAO;EACPC,cAAc;EACdR,UAAU;EACVS,eAAe;EACfC,gBAAgB,GAAG,KAAK;EACxBC,eAAe;EACfC,KAAK;EACL,GAAGC;AACU,CAAC,EAAE;EAChB;EACA;EACA;EACA,IAAIC,kBAAkB,GAAG,CAAC;EAC1B,IAAIP,OAAO,EAAEzD,OAAO,IAAI,IAAI,EAAEgE,kBAAkB,IAAIvD,YAAY;EAChE,IAAIgD,OAAO,EAAExD,UAAU,IAAI,IAAI,EAAE+D,kBAAkB,IAAItD,gBAAgB;EACvE,IAAI+C,OAAO,EAAEvD,UAAU,IAAI,IAAI,EAAE8D,kBAAkB,IAAIrD,gBAAgB;EACvE,IAAI8C,OAAO,EAAEtD,MAAM,IAAI,IAAI,IAAIsD,OAAO,EAAErC,KAAK,IAAI,IAAI,EACnD4C,kBAAkB,IAAIpD,YAAY;EACpC,IAAI6C,OAAO,EAAErD,MAAM,IAAI,IAAI,IAAIqD,OAAO,EAAErC,KAAK,IAAI,IAAI,EACnD4C,kBAAkB,IAAInD,YAAY;EACpC,IAAI4C,OAAO,EAAEpD,MAAM,IAAI,IAAI,EAAE2D,kBAAkB,IAAIlD,WAAW;EAC9D,IAAI2C,OAAO,EAAEnD,OAAO,IAAI,IAAI,EAAE0D,kBAAkB,IAAIjD,aAAa;EACjE,IAAI0C,OAAO,EAAElD,OAAO,IAAI,IAAI,EAAEyD,kBAAkB,IAAIhD,aAAa;EACjE,IAAIyC,OAAO,EAAEjD,YAAY,IAAI,IAAI,EAAEwD,kBAAkB,IAAI/C,kBAAkB;EAC3E,IAAIwC,OAAO,EAAEpC,eAAe,IAAI,IAAI,EAClC2C,kBAAkB,IAAI9C,qBAAqB;EAC7C;;EAEA;EACA,MAAM+C,QAAQ,GAAG;IACf,GAAGlE,QAAQ;IACX,GAAG0D,OAAO;IACVtD,MAAM,EAAEsD,OAAO,EAAEtD,MAAM,IAAIsD,OAAO,EAAErC,KAAK,IAAIrB,QAAQ,CAACI,MAAM;IAC5DC,MAAM,EAAEqD,OAAO,EAAErD,MAAM,IAAIqD,OAAO,EAAErC,KAAK,IAAIrB,QAAQ,CAACK,MAAM;IAC5DE,OAAO,EAAEmD,OAAO,EAAEnD,OAAO,IAAIP,QAAQ,CAACO,OAAO;IAC7CC,OAAO,EAAEkD,OAAO,EAAElD,OAAO,IAAIR,QAAQ,CAACQ;EACxC,CAAC;;EAED;EACA;EACA;EACA;EACA,MAAM2D,OAAO,GAAGR,cAAc,IAAID,OAAO;EACzC,MAAMU,eAAe,GAAG;IACtB,GAAGpE,QAAQ;IACX,GAAGmE,OAAO;IACV/D,MAAM,EAAE+D,OAAO,EAAE/D,MAAM,IAAI+D,OAAO,EAAE9C,KAAK,IAAIrB,QAAQ,CAACI,MAAM;IAC5DC,MAAM,EAAE8D,OAAO,EAAE9D,MAAM,IAAI8D,OAAO,EAAE9C,KAAK,IAAIrB,QAAQ,CAACK,MAAM;IAC5DE,OAAO,EAAE4D,OAAO,EAAE5D,OAAO,IAAIP,QAAQ,CAACO,OAAO;IAC7CC,OAAO,EAAE2D,OAAO,EAAE3D,OAAO,IAAIR,QAAQ,CAACQ;EACxC,CAAC;;EAED;EACA,MAAM6D,WAAW,GAAGX,OAAO,EAAEpC,eAAe,IAAI,aAAa;EAC7D,MAAMgD,cAAc,GAAGX,cAAc,EAAErC,eAAe,IAAI+C,WAAW;;EAErE;EACA,IAAIE,UAA8B,GAAGR,KAAK;EAC1C,IAAIL,OAAO,IAAIK,KAAK,EAAE;IACpB,MAAMS,IAAI,GAAG5E,UAAU,CAAC6E,OAAO,CAACV,KAAK,CAA4B;IACjE,IAAIS,IAAI,EAAE;MACR,MAAME,WAAW,GAAG,IAAIC,GAAG,CAAS,CAAC;MACrC,KAAK,MAAMpB,GAAG,IAAIqB,MAAM,CAACC,IAAI,CAACnB,OAAO,CAAC,EAA4B;QAChE,IAAIA,OAAO,CAACH,GAAG,CAAC,IAAI,IAAI,EAAE;UACxB,MAAMuB,QAAQ,GAAG1D,qBAAqB,CAACmC,GAAG,CAAC;UAC3C,IAAIuB,QAAQ,IAAIA,QAAQ,IAAIN,IAAI,EAAE;YAChCE,WAAW,CAACK,GAAG,CAACD,QAAQ,CAAC;UAC3B;QACF;MACF;MACA,IAAIJ,WAAW,CAACM,IAAI,GAAG,CAAC,EAAE;QACxB,IAAIrC,OAAO,EAAE;UACXI,OAAO,CAACC,IAAI,CACV,sBAAsB,CAAC,GAAG0B,WAAW,CAAC,CAACO,IAAI,CACzC,IACF,CAAC,oCAAoC,GACnC,qEACJ,CAAC;QACH;QACA,MAAMC,OAAgC,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,CAACC,CAAC,EAAEC,CAAC,CAAC,IAAIR,MAAM,CAACS,OAAO,CAACb,IAAI,CAAC,EAAE;UACzC,IAAI,CAACE,WAAW,CAACY,GAAG,CAACH,CAAC,CAAC,EAAE;YACvBD,OAAO,CAACC,CAAC,CAAC,GAAGC,CAAC;UAChB;QACF;QACAb,UAAU,GAAGW,OAAoB;MACnC;IACF;EACF;;EAEA;EACA,MAAMK,WAAW,GAAGrC,kBAAkB,CAACC,UAAU,CAAC;EAElD,MAAMqC,mBAAmB,GAAG5B,eAAe,GACtC6B,KAA6C,IAC5C7B,eAAe,CAAC6B,KAAK,CAACC,WAAW,CAAC,GACpCC,SAAS;EAEb,oBACE5F,IAAA,CAACF,cAAc;IACbkE,KAAK,EAAEQ,UAAW;IAClBX,eAAe,EAAE4B,mBAAoB;IACrCvB,kBAAkB,EAAEA,kBAAmB;IACvC2B,cAAc,EAAE1B,QAAQ,CAACjE,OAAQ;IACjC4F,iBAAiB,EAAE3B,QAAQ,CAAChE,UAAW;IACvC4F,iBAAiB,EAAE5B,QAAQ,CAAC/D,UAAW;IACvC4F,aAAa,EAAE7B,QAAQ,CAAC9D,MAAO;IAC/B4F,aAAa,EAAE9B,QAAQ,CAAC7D,MAAO;IAC/B4F,aAAa,EAAE/B,QAAQ,CAAC5D,MAAO;IAC/B4F,cAAc,EAAEhC,QAAQ,CAAC3D,OAAQ;IACjC4F,cAAc,EAAEjC,QAAQ,CAAC1D,OAAQ;IACjC4F,mBAAmB,EAAElC,QAAQ,CAACzD,YAAa;IAC3C4F,sBAAsB,EAAEhC,WAAY;IACpCiC,qBAAqB,EAAElC,eAAe,CAACnE,OAAQ;IAC/CsG,wBAAwB,EAAEnC,eAAe,CAAClE,UAAW;IACrDsG,wBAAwB,EAAEpC,eAAe,CAACjE,UAAW;IACrDsG,oBAAoB,EAAErC,eAAe,CAAChE,MAAO;IAC7CsG,oBAAoB,EAAEtC,eAAe,CAAC/D,MAAO;IAC7CsG,oBAAoB,EAAEvC,eAAe,CAAC9D,MAAO;IAC7CsG,qBAAqB,EAAExC,eAAe,CAAC7D,OAAQ;IAC/CsG,qBAAqB,EAAEzC,eAAe,CAAC5D,OAAQ;IAC/CsG,0BAA0B,EAAE1C,eAAe,CAAC3D,YAAa;IACzDsG,6BAA6B,EAAEzC,cAAe;IAC9CiB,WAAW,EAAEA,WAAY;IACzB1B,gBAAgB,EAAEA,gBAAiB;IACnCmD,gBAAgB,EAAElD,eAAe,EAAEmD,CAAC,IAAI,GAAI;IAC5CC,gBAAgB,EAAEpD,eAAe,EAAEqD,CAAC,IAAI,GAAI;IAAA,GACxCnD;EAAI,CACT,CAAC;AAEN","ignoreList":[]}