unframer 2.6.1 → 2.6.2

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/esm/framer.js CHANGED
@@ -18,7 +18,7 @@ var __rest = (this && this.__rest) || function (s, e) {
18
18
  }
19
19
  return t;
20
20
  };
21
- // https :https://app.framerstatic.com/chunk-DUHOOT7P.js
21
+ // https :https://app.framerstatic.com/chunk-VBDYROES.js
22
22
  import { createContext, } from 'react';
23
23
  import { useEffect, useLayoutEffect, } from 'react';
24
24
  import { jsx, jsxs, } from 'react/jsx-runtime';
@@ -153,8 +153,23 @@ var MotionGlobalConfig = {
153
153
  skipAnimations: false,
154
154
  useManualTiming: false,
155
155
  };
156
- var LayoutGroupContext = createContext({});
157
156
  var SwitchLayoutGroupContext = createContext({});
157
+ var LayoutGroupContext = createContext({});
158
+ var noop = (any) => any;
159
+ var warning = noop;
160
+ var invariant = noop;
161
+ if (false) {
162
+ warning = (check, message) => {
163
+ if (!check && typeof console !== 'undefined') {
164
+ console.warn(message);
165
+ }
166
+ };
167
+ invariant = (check, message) => {
168
+ if (!check) {
169
+ throw new Error(message);
170
+ }
171
+ };
172
+ }
158
173
  var LazyContext = createContext({
159
174
  strict: false,
160
175
  });
@@ -309,7 +324,11 @@ function createRenderBatcher(scheduleNextBatch, allowKeepAlive) {
309
324
  };
310
325
  }
311
326
  var { schedule: microtask, cancel: cancelMicrotask, } = createRenderBatcher(queueMicrotask, false);
312
- function useVisualElement(Component33, visualState, props, createVisualElement2) {
327
+ function isRefObject(ref) {
328
+ return ref && typeof ref === 'object' && Object.prototype.hasOwnProperty.call(ref, 'current');
329
+ }
330
+ var scheduleHandoffComplete = false;
331
+ function useVisualElement(Component33, visualState, props, createVisualElement2, ProjectionNodeConstructor) {
313
332
  const { visualElement: parent, } = useContext3(MotionContext);
314
333
  const lazyContext = useContext3(LazyContext);
315
334
  const presenceContext = useContext3(PresenceContext);
@@ -327,6 +346,11 @@ function useVisualElement(Component33, visualState, props, createVisualElement2)
327
346
  });
328
347
  }
329
348
  const visualElement = visualElementRef.current;
349
+ const initialLayoutGroupConfig = useContext3(SwitchLayoutGroupContext);
350
+ if (visualElement && !visualElement.projection && ProjectionNodeConstructor &&
351
+ (visualElement.type === 'html' || visualElement.type === 'svg')) {
352
+ createProjectionNode(visualElementRef.current, props, ProjectionNodeConstructor, initialLayoutGroupConfig);
353
+ }
330
354
  useInsertionEffect(() => {
331
355
  visualElement && visualElement.update(props, presenceContext);
332
356
  });
@@ -334,6 +358,7 @@ function useVisualElement(Component33, visualState, props, createVisualElement2)
334
358
  useIsomorphicLayoutEffect(() => {
335
359
  if (!visualElement)
336
360
  return;
361
+ visualElement.updateFeatures();
337
362
  microtask.render(visualElement.render);
338
363
  if (wantsHandoff.current && visualElement.animationState) {
339
364
  visualElement.animationState.animateChanges();
@@ -342,25 +367,58 @@ function useVisualElement(Component33, visualState, props, createVisualElement2)
342
367
  useEffect(() => {
343
368
  if (!visualElement)
344
369
  return;
345
- visualElement.updateFeatures();
346
370
  if (!wantsHandoff.current && visualElement.animationState) {
347
371
  visualElement.animationState.animateChanges();
348
372
  }
349
373
  if (wantsHandoff.current) {
350
374
  wantsHandoff.current = false;
351
- window.HandoffComplete = true;
375
+ if (!scheduleHandoffComplete) {
376
+ scheduleHandoffComplete = true;
377
+ queueMicrotask(completeHandoff);
378
+ }
352
379
  }
353
380
  });
354
381
  return visualElement;
355
382
  }
356
- function isRefObject(ref) {
357
- return ref && typeof ref === 'object' && Object.prototype.hasOwnProperty.call(ref, 'current');
383
+ function completeHandoff() {
384
+ window.HandoffComplete = true;
385
+ }
386
+ function createProjectionNode(visualElement, props, ProjectionNodeConstructor, initialPromotionConfig) {
387
+ const { layoutId, layout: layout2, drag: drag2, dragConstraints, layoutScroll, layoutRoot, } = props;
388
+ visualElement.projection = new ProjectionNodeConstructor(visualElement.latestValues, props['data-framer-portal-id'] ? void 0 : getClosestProjectingNode(visualElement.parent));
389
+ visualElement.projection.setOptions({
390
+ layoutId,
391
+ layout: layout2,
392
+ alwaysMeasureLayout: Boolean(drag2) || dragConstraints && isRefObject(dragConstraints),
393
+ visualElement,
394
+ scheduleRender: () => visualElement.scheduleRender(),
395
+ /**
396
+ * TODO: Update options in an effect. This could be tricky as it'll be too late
397
+ * to update by the time layout animations run.
398
+ * We also need to fix this safeToRemove by linking it up to the one returned by usePresence,
399
+ * ensuring it gets called if there's no potential layout animations.
400
+ */
401
+ animationType: typeof layout2 === 'string' ? layout2 : 'both',
402
+ initialPromotionConfig,
403
+ layoutScroll,
404
+ layoutRoot,
405
+ });
406
+ }
407
+ function getClosestProjectingNode(visualElement) {
408
+ if (!visualElement)
409
+ return void 0;
410
+ return visualElement.options.allowProjection !== false ? visualElement.projection : getClosestProjectingNode(visualElement.parent);
358
411
  }
359
412
  function useMotionRef(visualState, visualElement, externalRef) {
360
413
  return useCallback((instance) => {
361
414
  instance && visualState.mount && visualState.mount(instance);
362
415
  if (visualElement) {
363
- instance ? visualElement.mount(instance) : visualElement.unmount();
416
+ if (instance) {
417
+ visualElement.mount(instance);
418
+ }
419
+ else {
420
+ visualElement.unmount();
421
+ }
364
422
  }
365
423
  if (externalRef) {
366
424
  if (typeof externalRef === 'function') {
@@ -442,14 +500,10 @@ function createMotionComponent({ preloadedFeatures: preloadedFeatures2, createVi
442
500
  const context = useCreateMotionContext(props);
443
501
  const visualState = useVisualState2(props, isStatic);
444
502
  if (!isStatic && isBrowser) {
445
- context.visualElement = useVisualElement(Component33, visualState, configAndProps, createVisualElement2);
446
- const initialLayoutGroupConfig = useContext3(SwitchLayoutGroupContext);
447
- const isStrict = useContext3(LazyContext).strict;
448
- if (context.visualElement) {
449
- MeasureLayout2 = context.visualElement.loadFeatures(
450
- // Note: Pass the full new combined props to correctly re-render dynamic feature components.
451
- configAndProps, isStrict, preloadedFeatures2, initialLayoutGroupConfig);
452
- }
503
+ useStrictMode(configAndProps, preloadedFeatures2);
504
+ const layoutProjection = getProjectionFunctionality(configAndProps);
505
+ MeasureLayout2 = layoutProjection.MeasureLayout;
506
+ context.visualElement = useVisualElement(Component33, visualState, configAndProps, createVisualElement2, layoutProjection.ProjectionNode);
453
507
  }
454
508
  return jsxs(MotionContext.Provider, {
455
509
  value: context,
@@ -469,6 +523,26 @@ function useLayoutId({ layoutId, }) {
469
523
  const layoutGroupId = useContext3(LayoutGroupContext).id;
470
524
  return layoutGroupId && layoutId !== void 0 ? layoutGroupId + '-' + layoutId : layoutId;
471
525
  }
526
+ function useStrictMode(configAndProps, preloadedFeatures2) {
527
+ const isStrict = useContext3(LazyContext).strict;
528
+ if (false) {
529
+ const strictMessage = 'You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.';
530
+ configAndProps.ignoreStrict ? warning(false, strictMessage) : invariant(false, strictMessage);
531
+ }
532
+ }
533
+ function getProjectionFunctionality(props) {
534
+ const { drag: drag2, layout: layout2, } = featureDefinitions;
535
+ if (!drag2 && !layout2)
536
+ return {};
537
+ const combined = Object.assign(Object.assign({}, drag2), layout2);
538
+ return {
539
+ MeasureLayout: (drag2 === null || drag2 === void 0 ? void 0 : drag2.isEnabled(props)) ||
540
+ (layout2 === null || layout2 === void 0 ? void 0 : layout2.isEnabled(props))
541
+ ? combined.MeasureLayout
542
+ : void 0,
543
+ ProjectionNode: combined.ProjectionNode,
544
+ };
545
+ }
472
546
  var scaleCorrectors = {};
473
547
  function addScaleCorrector(correctors) {
474
548
  Object.assign(scaleCorrectors, correctors);
@@ -536,6 +610,9 @@ var singleColorRegex = /^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}
536
610
  function isString(v) {
537
611
  return typeof v === 'string';
538
612
  }
613
+ function isNullish(v) {
614
+ return v == null;
615
+ }
539
616
  var createUnitType = (unit) => ({
540
617
  test: (v) => isString(v) && v.endsWith(unit) && v.split(' ').length === 1,
541
618
  parse: parseFloat,
@@ -705,7 +782,6 @@ function makeLatestValues(props, context, presenceContext, scrapeMotionValues) {
705
782
  }
706
783
  return values;
707
784
  }
708
- var noop = (any) => any;
709
785
  var { schedule: frame, cancel: cancelFrame, state: frameData, steps, } = createRenderBatcher(typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : noop, true);
710
786
  var isPrimaryPointer = (event) => {
711
787
  if (event.pointerType === 'mouse') {
@@ -785,20 +861,6 @@ function isDragActive() {
785
861
  openGestureLock();
786
862
  return false;
787
863
  }
788
- var warning = noop;
789
- var invariant = noop;
790
- if (false) {
791
- warning = (check, message) => {
792
- if (!check && typeof console !== 'undefined') {
793
- console.warn(message);
794
- }
795
- };
796
- invariant = (check, message) => {
797
- if (!check) {
798
- throw new Error(message);
799
- }
800
- };
801
- }
802
864
  var number = {
803
865
  test: (v) => typeof v === 'number',
804
866
  parse: parseFloat,
@@ -807,7 +869,8 @@ var number = {
807
869
  var alpha = Object.assign(Object.assign({}, number), { transform: (v) => clamp(0, 1, v) });
808
870
  var scale = Object.assign(Object.assign({}, number), { default: 1 });
809
871
  var isColorString = (type, testProp) => (v) => {
810
- return Boolean(isString(v) && singleColorRegex.test(v) && v.startsWith(type) || testProp && Object.prototype.hasOwnProperty.call(v, testProp));
872
+ return Boolean(isString(v) && singleColorRegex.test(v) && v.startsWith(type) ||
873
+ testProp && !isNullish(v) && Object.prototype.hasOwnProperty.call(v, testProp));
811
874
  };
812
875
  var splitColor = (aName, bName, cName) => (v) => {
813
876
  if (!isString(v))
@@ -2704,7 +2767,7 @@ var MotionValue = class {
2704
2767
  * @internal
2705
2768
  */
2706
2769
  constructor(init, options = {}) {
2707
- this.version = '11.2.10';
2770
+ this.version = '11.2.13';
2708
2771
  this.canTrackVelocity = null;
2709
2772
  this.events = {};
2710
2773
  this.updateAndNotify = (v, render = true) => {
@@ -3297,7 +3360,7 @@ function animateList(visualElement) {
3297
3360
  }
3298
3361
  function createAnimationState(visualElement) {
3299
3362
  let animate22 = animateList(visualElement);
3300
- const state = createState();
3363
+ let state = createState();
3301
3364
  let isInitialRender = true;
3302
3365
  const buildResolvedTypeValues = (type) => (acc, definition) => {
3303
3366
  var _a;
@@ -3448,6 +3511,10 @@ function createAnimationState(visualElement) {
3448
3511
  setActive,
3449
3512
  setAnimateFunction,
3450
3513
  getState: () => state,
3514
+ reset: () => {
3515
+ state = createState();
3516
+ isInitialRender = true;
3517
+ },
3451
3518
  };
3452
3519
  }
3453
3520
  function checkVariantsDidChange(prev, next) {
@@ -3497,9 +3564,8 @@ var AnimationFeature = class extends Feature {
3497
3564
  }
3498
3565
  updateAnimationControlsSubscription() {
3499
3566
  const { animate: animate22, } = this.node.getProps();
3500
- this.unmount();
3501
3567
  if (isAnimationControls(animate22)) {
3502
- this.unmount = animate22.subscribe(this.node);
3568
+ this.unmountControls = animate22.subscribe(this.node);
3503
3569
  }
3504
3570
  }
3505
3571
  /**
@@ -3515,7 +3581,11 @@ var AnimationFeature = class extends Feature {
3515
3581
  this.updateAnimationControlsSubscription();
3516
3582
  }
3517
3583
  }
3518
- unmount() { }
3584
+ unmount() {
3585
+ var _a;
3586
+ this.node.animationState.reset();
3587
+ (_a = this.unmountControls) === null || _a === void 0 ? void 0 : _a.call(this);
3588
+ }
3519
3589
  };
3520
3590
  var id = 0;
3521
3591
  var ExitAnimationFeature = class extends Feature {
@@ -3692,7 +3762,7 @@ function updateMotionValuesFromProps(element, next, prev) {
3692
3762
  willChange.add(key7);
3693
3763
  }
3694
3764
  if (false) {
3695
- warnOnce(nextValue.version === '11.2.10', `Attempting to mix Framer Motion versions ${nextValue.version} with 11.2.10 may not work as expected.`);
3765
+ warnOnce(nextValue.version === '11.2.13', `Attempting to mix Framer Motion versions ${nextValue.version} with 11.2.13 may not work as expected.`);
3696
3766
  }
3697
3767
  }
3698
3768
  else if (isMotionValue(prevValue)) {
@@ -3729,8 +3799,6 @@ function updateMotionValuesFromProps(element, next, prev) {
3729
3799
  }
3730
3800
  var valueTypes = [...dimensionValueTypes, color, complex,];
3731
3801
  var findValueType = (v) => valueTypes.find(testValueType(v));
3732
- var featureNames = Object.keys(featureDefinitions);
3733
- var numFeatures = featureNames.length;
3734
3802
  var propEventHandlers = [
3735
3803
  'AnimationStart',
3736
3804
  'AnimationComplete',
@@ -3741,11 +3809,6 @@ var propEventHandlers = [
3741
3809
  'LayoutAnimationComplete',
3742
3810
  ];
3743
3811
  var numVariantProps = variantProps.length;
3744
- function getClosestProjectingNode(visualElement) {
3745
- if (!visualElement)
3746
- return void 0;
3747
- return visualElement.options.allowProjection !== false ? visualElement.projection : getClosestProjectingNode(visualElement.parent);
3748
- }
3749
3812
  var VisualElement = class {
3750
3813
  /**
3751
3814
  * This method takes React props and returns found MotionValues. For example, HTML
@@ -3837,7 +3900,6 @@ var VisualElement = class {
3837
3900
  this.update(this.props, this.presenceContext);
3838
3901
  }
3839
3902
  unmount() {
3840
- var _a;
3841
3903
  visualElementStore.delete(this.current);
3842
3904
  this.projection && this.projection.unmount();
3843
3905
  cancelFrame(this.notifyUpdate);
@@ -3849,7 +3911,11 @@ var VisualElement = class {
3849
3911
  this.events[key7].clear();
3850
3912
  }
3851
3913
  for (const key7 in this.features) {
3852
- (_a = this.features[key7]) === null || _a === void 0 ? void 0 : _a.unmount();
3914
+ const feature = this.features[key7];
3915
+ if (feature) {
3916
+ feature.unmount();
3917
+ feature.isMounted = false;
3918
+ }
3853
3919
  }
3854
3920
  this.current = null;
3855
3921
  }
@@ -3876,60 +3942,25 @@ var VisualElement = class {
3876
3942
  }
3877
3943
  return this.sortInstanceNodePosition(this.current, other.current);
3878
3944
  }
3879
- loadFeatures(_j, isStrict, preloadedFeatures2, initialLayoutGroupConfig) {
3880
- var { children } = _j, renderedProps = __rest(_j, ["children"]);
3881
- let ProjectionNodeConstructor;
3882
- let MeasureLayout2;
3883
- if (false) {
3884
- const strictMessage = 'You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.';
3885
- renderedProps.ignoreStrict ? warning(false, strictMessage) : invariant(false, strictMessage);
3886
- }
3887
- for (let i = 0; i < numFeatures; i++) {
3888
- const name = featureNames[i];
3889
- const { isEnabled, Feature: FeatureConstructor, ProjectionNode, MeasureLayout: MeasureLayoutComponent, } = featureDefinitions[name];
3890
- if (ProjectionNode)
3891
- ProjectionNodeConstructor = ProjectionNode;
3892
- if (isEnabled(renderedProps)) {
3893
- if (!this.features[name] && FeatureConstructor) {
3894
- this.features[name] = new FeatureConstructor(this);
3895
- }
3896
- if (MeasureLayoutComponent) {
3897
- MeasureLayout2 = MeasureLayoutComponent;
3898
- }
3899
- }
3900
- }
3901
- if ((this.type === 'html' || this.type === 'svg') && !this.projection && ProjectionNodeConstructor) {
3902
- const { layoutId, layout: layout2, drag: drag2, dragConstraints, layoutScroll, layoutRoot, } = renderedProps;
3903
- this.projection = new ProjectionNodeConstructor(this.latestValues, renderedProps['data-framer-portal-id'] ? void 0 : getClosestProjectingNode(this.parent));
3904
- this.projection.setOptions({
3905
- layoutId,
3906
- layout: layout2,
3907
- alwaysMeasureLayout: Boolean(drag2) || dragConstraints && isRefObject(dragConstraints),
3908
- visualElement: this,
3909
- scheduleRender: () => this.scheduleRender(),
3910
- /**
3911
- * TODO: Update options in an effect. This could be tricky as it'll be too late
3912
- * to update by the time layout animations run.
3913
- * We also need to fix this safeToRemove by linking it up to the one returned by usePresence,
3914
- * ensuring it gets called if there's no potential layout animations.
3915
- */
3916
- animationType: typeof layout2 === 'string' ? layout2 : 'both',
3917
- initialPromotionConfig: initialLayoutGroupConfig,
3918
- layoutScroll,
3919
- layoutRoot,
3920
- });
3921
- }
3922
- return MeasureLayout2;
3923
- }
3924
3945
  updateFeatures() {
3925
- for (const key7 in this.features) {
3926
- const feature = this.features[key7];
3927
- if (feature.isMounted) {
3928
- feature.update();
3946
+ let key7 = 'animation';
3947
+ for (key7 in featureDefinitions) {
3948
+ const featureDefinition = featureDefinitions[key7];
3949
+ if (!featureDefinition)
3950
+ continue;
3951
+ const { isEnabled, Feature: FeatureConstructor, } = featureDefinition;
3952
+ if (!this.features[key7] && FeatureConstructor && isEnabled(this.props)) {
3953
+ this.features[key7] = new FeatureConstructor(this);
3929
3954
  }
3930
- else {
3931
- feature.mount();
3932
- feature.isMounted = true;
3955
+ if (this.features[key7]) {
3956
+ const feature = this.features[key7];
3957
+ if (feature.isMounted) {
3958
+ feature.update();
3959
+ }
3960
+ else {
3961
+ feature.mount();
3962
+ feature.isMounted = true;
3963
+ }
3933
3964
  }
3934
3965
  }
3935
3966
  }
@@ -5430,7 +5461,7 @@ var VisualElementDragControls = class {
5430
5461
  });
5431
5462
  const measureDragConstraints = () => {
5432
5463
  const { dragConstraints, } = this.getProps();
5433
- if (isRefObject(dragConstraints)) {
5464
+ if (isRefObject(dragConstraints) && dragConstraints.current) {
5434
5465
  this.constraints = this.resolveRefConstraints();
5435
5466
  }
5436
5467
  };
@@ -5440,7 +5471,7 @@ var VisualElementDragControls = class {
5440
5471
  projection.root && projection.root.updateScroll();
5441
5472
  projection.updateLayout();
5442
5473
  }
5443
- measureDragConstraints();
5474
+ frame.read(measureDragConstraints);
5444
5475
  const stopResizeListener = addDomEvent(window, 'resize', () => this.scalePositionWithinConstraints());
5445
5476
  const stopLayoutUpdateListener = projection.addEventListener('didUpdate', ({ delta, hasLayoutChanged, }) => {
5446
5477
  if (this.isDragging && hasLayoutChanged) {
@@ -5975,7 +6006,7 @@ function isOptimisedAppearTree(projectionNode) {
5975
6006
  return false;
5976
6007
  }
5977
6008
  }
5978
- function createProjectionNode({ attachResizeListener, defaultParent, measureScroll, checkIsScrollRoot, resetTransform, }) {
6009
+ function createProjectionNode2({ attachResizeListener, defaultParent, measureScroll, checkIsScrollRoot, resetTransform, }) {
5979
6010
  return class ProjectionNode {
5980
6011
  constructor(latestValues = {}, parent = defaultParent === null || defaultParent === void 0 ? void 0 : defaultParent()) {
5981
6012
  this.id = id2++;
@@ -6002,6 +6033,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
6002
6033
  this.eventHandlers = /* @__PURE__ */ new Map();
6003
6034
  this.hasTreeAnimated = false;
6004
6035
  this.updateScheduled = false;
6036
+ this.scheduleUpdate = () => this.update();
6005
6037
  this.projectionUpdateScheduled = false;
6006
6038
  this.checkUpdateFailed = () => {
6007
6039
  if (this.isUpdating) {
@@ -6208,7 +6240,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
6208
6240
  didUpdate() {
6209
6241
  if (!this.updateScheduled) {
6210
6242
  this.updateScheduled = true;
6211
- microtask.read(() => this.update());
6243
+ microtask.read(this.scheduleUpdate);
6212
6244
  }
6213
6245
  }
6214
6246
  clearAllSnapshots() {
@@ -6278,7 +6310,7 @@ function createProjectionNode({ attachResizeListener, defaultParent, measureScro
6278
6310
  resetTransform() {
6279
6311
  if (!resetTransform)
6280
6312
  return;
6281
- const isResetRequested = this.isLayoutDirty || this.shouldResetTransform;
6313
+ const isResetRequested = this.isLayoutDirty || this.shouldResetTransform || this.options.alwaysMeasureLayout;
6282
6314
  const hasProjection = this.projectionDelta && !isDeltaZero(this.projectionDelta);
6283
6315
  const transformTemplate2 = this.getTransformTemplate();
6284
6316
  const transformTemplateValue = transformTemplate2 ? transformTemplate2(this.latestValues, '') : void 0;
@@ -6990,7 +7022,7 @@ function shouldAnimatePositionOnly(animationType, snapshot, layout2) {
6990
7022
  return animationType === 'position' ||
6991
7023
  animationType === 'preserve-aspect' && !isNear(aspectRatio(snapshot), aspectRatio(layout2), 0.2);
6992
7024
  }
6993
- var DocumentProjectionNode = createProjectionNode({
7025
+ var DocumentProjectionNode = createProjectionNode2({
6994
7026
  attachResizeListener: (ref, notify2) => addDomEvent(ref, 'resize', notify2),
6995
7027
  measureScroll: () => ({
6996
7028
  x: document.documentElement.scrollLeft || document.body.scrollLeft,
@@ -7001,7 +7033,7 @@ var DocumentProjectionNode = createProjectionNode({
7001
7033
  var rootProjectionNode = {
7002
7034
  current: void 0,
7003
7035
  };
7004
- var HTMLProjectionNode = createProjectionNode({
7036
+ var HTMLProjectionNode = createProjectionNode2({
7005
7037
  measureScroll: (instance) => ({
7006
7038
  x: instance.scrollLeft,
7007
7039
  y: instance.scrollTop,
@@ -8990,7 +9022,7 @@ var cancelSync = stepsOrder.reduce((acc, key7) => {
8990
9022
  acc[key7] = (process2) => cancelFrame(process2);
8991
9023
  return acc;
8992
9024
  }, {});
8993
- // https :https://app.framerstatic.com/framer.K4XHQ4DX.js
9025
+ // https :https://app.framerstatic.com/framer.E3XQPBSV.js
8994
9026
  import React4 from 'react';
8995
9027
  import { startTransition as startTransition2, } from 'react';
8996
9028
  import { Suspense as Suspense2, } from 'react';
@@ -9673,16 +9705,16 @@ var require_browser = __commonJS({
9673
9705
  process5.argv = [];
9674
9706
  process5.version = '';
9675
9707
  process5.versions = {};
9676
- function noop2() { }
9677
- process5.on = noop2;
9678
- process5.addListener = noop2;
9679
- process5.once = noop2;
9680
- process5.off = noop2;
9681
- process5.removeListener = noop2;
9682
- process5.removeAllListeners = noop2;
9683
- process5.emit = noop2;
9684
- process5.prependListener = noop2;
9685
- process5.prependOnceListener = noop2;
9708
+ function noop3() { }
9709
+ process5.on = noop3;
9710
+ process5.addListener = noop3;
9711
+ process5.once = noop3;
9712
+ process5.off = noop3;
9713
+ process5.removeListener = noop3;
9714
+ process5.removeAllListeners = noop3;
9715
+ process5.emit = noop3;
9716
+ process5.prependListener = noop3;
9717
+ process5.prependOnceListener = noop3;
9686
9718
  process5.listeners = function (name) {
9687
9719
  return [];
9688
9720
  };
@@ -10948,25 +10980,47 @@ function getRouteElementId(route, hash2) {
10948
10980
  return void 0;
10949
10981
  }
10950
10982
  function isBot(userAgent) {
10951
- return /bot|Mediapartners-Google|Google-PageRenderer|yandex|ia_archiver/iu.test(userAgent);
10983
+ return /bot|-google|google-|yandex|ia_archiver/iu.test(userAgent);
10952
10984
  }
10953
- function yieldToMain(isHighPriority) {
10985
+ function yieldToMain(options) {
10954
10986
  if ('scheduler' in window) {
10955
- const options = {
10956
- priority: isHighPriority ? 'user-blocking' : 'user-visible',
10957
- };
10958
10987
  if ('yield' in scheduler)
10959
10988
  return scheduler.yield(options);
10960
10989
  if ('postTask' in scheduler)
10961
10990
  return scheduler.postTask(() => { }, options);
10962
10991
  }
10963
- if (isHighPriority) {
10992
+ if ((options === null || options === void 0 ? void 0 : options.priority) === 'user-blocking') {
10964
10993
  return Promise.resolve();
10965
10994
  }
10966
10995
  return new Promise((resolve) => {
10967
- setTimeout(resolve, 0);
10996
+ setTimeout(resolve);
10997
+ });
10998
+ }
10999
+ function yieldBefore(fn, options) {
11000
+ return __awaiter(this, void 0, void 0, function* () {
11001
+ yield yieldToMain(options);
11002
+ return fn();
10968
11003
  });
10969
11004
  }
11005
+ function interactionResponse(options, fallback = true) {
11006
+ return new Promise((resolve) => {
11007
+ if (fallback)
11008
+ setTimeout(resolve, 100);
11009
+ requestAnimationFrame(() => {
11010
+ void yieldBefore(resolve, options);
11011
+ });
11012
+ });
11013
+ }
11014
+ function useAfterPaintEffect(fn, deps, options) {
11015
+ useLayoutEffect(() => {
11016
+ const runAfterPaint = () => __awaiter(this, void 0, void 0, function* () {
11017
+ yield interactionResponse(options, false);
11018
+ fn();
11019
+ });
11020
+ void runAfterPaint();
11021
+ }, deps);
11022
+ }
11023
+ var noop2 = () => { };
10970
11024
  function replacePathVariables(path, currentLocale, nextLocale, defaultLocale, collectionId, pathVariables, collectionUtils) {
10971
11025
  return __awaiter(this, void 0, void 0, function* () {
10972
11026
  var _a, _b, _c;
@@ -11357,24 +11411,52 @@ function createViewTransitionStylesheet({ exit = defaultPageTransition, enter, }
11357
11411
  document.head.appendChild(styleElement);
11358
11412
  }
11359
11413
  function removeViewTransitionStylesheet() {
11360
- frame.render(() => {
11361
- const element = document.getElementById(VIEW_TRANSITION_STYLES_ID);
11362
- if (element) {
11363
- document.head.removeChild(element);
11364
- }
11414
+ requestIdleCallback(() => {
11415
+ frame.render(() => {
11416
+ performance.mark('framer-vt-remove');
11417
+ const element = document.getElementById(VIEW_TRANSITION_STYLES_ID);
11418
+ if (element) {
11419
+ document.head.removeChild(element);
11420
+ }
11421
+ });
11365
11422
  });
11366
11423
  }
11367
11424
  function supportsViewTransitions() {
11368
11425
  return Boolean(document.startViewTransition);
11369
11426
  }
11370
- function startViewTransition(updateView, effect) {
11371
- if (!supportsViewTransitions()) {
11372
- return void updateView();
11373
- }
11374
- createViewTransitionStylesheet(effect);
11375
- const transition = document.startViewTransition(updateView);
11376
- Promise.all([transition.ready, transition.finished,]).then(removeViewTransitionStylesheet).catch(() => { });
11377
- return transition;
11427
+ function addVTStylesheetAfterInRender(effect) {
11428
+ return new Promise((resolve) => {
11429
+ frame.render(() => {
11430
+ performance.mark('framer-vt-style');
11431
+ createViewTransitionStylesheet(effect);
11432
+ resolve();
11433
+ });
11434
+ });
11435
+ }
11436
+ function startViewTransition(updateView, effect, signal) {
11437
+ return __awaiter(this, void 0, void 0, function* () {
11438
+ if (!supportsViewTransitions()) {
11439
+ void updateView();
11440
+ return;
11441
+ }
11442
+ yield addVTStylesheetAfterInRender(effect);
11443
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
11444
+ return;
11445
+ performance.mark('framer-vt');
11446
+ const transition = document.startViewTransition(() => {
11447
+ performance.mark('framer-vt-freeze');
11448
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
11449
+ return;
11450
+ else
11451
+ signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', () => transition.skipTransition());
11452
+ void updateView();
11453
+ });
11454
+ Promise.all([transition.ready, transition.finished,]).then(() => {
11455
+ performance.mark('framer-vt-unfreeze');
11456
+ removeViewTransitionStylesheet();
11457
+ }).catch(() => { });
11458
+ return transition;
11459
+ });
11378
11460
  }
11379
11461
  function useViewTransition() {
11380
11462
  const sitePageEffects = usePageEffects();
@@ -11385,7 +11467,7 @@ function useViewTransition() {
11385
11467
  resolveHasPainted.current = void 0;
11386
11468
  }
11387
11469
  });
11388
- return useCallback((currentRouteId, nextRouteId, update) => {
11470
+ return useCallback((currentRouteId, nextRouteId, update, yieldBeforeFreezePeriod, signal) => {
11389
11471
  const pageEffect = getPageEffectForRoute(currentRouteId, nextRouteId, sitePageEffects);
11390
11472
  if (pageEffect) {
11391
11473
  const hasPainted = new Promise((resolve) => {
@@ -11395,6 +11477,15 @@ function useViewTransition() {
11395
11477
  update();
11396
11478
  yield hasPainted;
11397
11479
  });
11480
+ const yieldBeforeViewTransition = () => __awaiter(this, void 0, void 0, function* () {
11481
+ yield interactionResponse({
11482
+ priority: 'user-blocking',
11483
+ signal,
11484
+ }, false).catch(noop2);
11485
+ return startViewTransition(asyncUpdate, pageEffect, signal);
11486
+ });
11487
+ if (yieldBeforeFreezePeriod)
11488
+ return yieldBeforeViewTransition();
11398
11489
  return startViewTransition(asyncUpdate, pageEffect);
11399
11490
  }
11400
11491
  else {
@@ -11402,47 +11493,62 @@ function useViewTransition() {
11402
11493
  }
11403
11494
  }, [sitePageEffects,]);
11404
11495
  }
11405
- function pushRouteState(routeId, route, { currentRoutePath, currentPathVariables, hash: hash2, pathVariables, localeId, preserveQueryParams, }) {
11406
- const { path, } = route;
11407
- if (!path)
11408
- return;
11409
- try {
11410
- const newPath = getPathForRoute(route, {
11411
- currentRoutePath,
11412
- currentPathVariables,
11413
- hash: hash2,
11414
- pathVariables,
11415
- preserveQueryParams,
11416
- });
11417
- pushHistoryState({
11418
- routeId,
11419
- hash: hash2,
11420
- pathVariables,
11421
- localeId,
11422
- }, newPath);
11423
- }
11424
- catch (_j) { }
11496
+ function pushRouteState(routeId_1, route_1, _j) {
11497
+ return __awaiter(this, arguments, void 0, function* (routeId, route, { currentRoutePath, currentPathVariables, hash: hash2, pathVariables, localeId, preserveQueryParams, }, enableAsyncURLUpdate = false, ignorePushStateWrapper = false) {
11498
+ const { path, } = route;
11499
+ if (!path)
11500
+ return;
11501
+ try {
11502
+ const newPath = getPathForRoute(route, {
11503
+ currentRoutePath,
11504
+ currentPathVariables,
11505
+ hash: hash2,
11506
+ pathVariables,
11507
+ preserveQueryParams,
11508
+ });
11509
+ const urlUpdatePromise = pushHistoryState({
11510
+ routeId,
11511
+ hash: hash2,
11512
+ pathVariables,
11513
+ localeId,
11514
+ }, newPath, enableAsyncURLUpdate, ignorePushStateWrapper);
11515
+ if (!enableAsyncURLUpdate)
11516
+ yield urlUpdatePromise;
11517
+ }
11518
+ catch (_k) { }
11519
+ });
11425
11520
  }
11426
11521
  function isHistoryState(data2) {
11427
11522
  const routeIdKey = 'routeId';
11428
11523
  return isObject(data2) && isString2(data2[routeIdKey]);
11429
11524
  }
11430
11525
  function replaceHistoryState(data2, url) {
11526
+ performance.mark('framer-history-replace');
11431
11527
  window.history.replaceState(data2,
11432
11528
  // Second arg is unused and exists for historical purposes only
11433
11529
  // https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState#unused
11434
11530
  '', url);
11435
11531
  }
11436
- function pushHistoryState(data2, url) {
11437
- window.history.pushState(data2,
11438
- // Second arg is unused and exists for historical purposes only
11439
- // https://developer.mozilla.org/en-US/docs/Web/API/History/pushState#unused
11440
- '', url);
11532
+ function pushHistoryState(data2_1, url_1) {
11533
+ return __awaiter(this, arguments, void 0, function* (data2, url, awaitPaintBeforeUpdate = false, ignorePushStateWrapper = false) {
11534
+ if (awaitPaintBeforeUpdate) {
11535
+ yield interactionResponse({
11536
+ priority: 'user-blocking',
11537
+ });
11538
+ }
11539
+ performance.mark('framer-history-push');
11540
+ const pushState = ignorePushStateWrapper ? window.history.__proto__.pushState : window.history.pushState;
11541
+ pushState.call(window.history, data2,
11542
+ // Second arg is unused and exists for historical purposes only
11543
+ // https://developer.mozilla.org/en-US/docs/Web/API/History/pushState#unused
11544
+ '', url);
11545
+ });
11441
11546
  }
11442
11547
  function useReplaceInitialState({ disabled, routeId, initialPathVariables, initialLocaleId, }) {
11443
- React4.useLayoutEffect(() => {
11548
+ useLayoutEffect(() => {
11444
11549
  if (disabled)
11445
11550
  return;
11551
+ performance.mark('framer-history-set-initial-state');
11446
11552
  replaceHistoryState({
11447
11553
  routeId,
11448
11554
  pathVariables: initialPathVariables,
@@ -11452,8 +11558,8 @@ function useReplaceInitialState({ disabled, routeId, initialPathVariables, initi
11452
11558
  }
11453
11559
  function usePopStateHandler(currentRouteId, setCurrentRouteId) {
11454
11560
  const startViewTransition2 = useViewTransition();
11455
- const viewTransitionReady = React4.useRef(void 0);
11456
- const popStateHandler = React4.useCallback(({ state, }) => {
11561
+ const viewTransitionReady = useRef(void 0);
11562
+ const popStateHandler = useCallback((_j) => __awaiter(this, [_j], void 0, function* ({ state, }) {
11457
11563
  var _a, _b, _c;
11458
11564
  if (!isObject(state))
11459
11565
  return;
@@ -11463,14 +11569,14 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId) {
11463
11569
  const changeRoute = () => {
11464
11570
  setCurrentRouteId(routeId, isString2(localeId) ? localeId : void 0, isString2(hash2) ? hash2 : void 0, isObject(pathVariables) ? pathVariables : void 0, false, true);
11465
11571
  };
11466
- const transition = startViewTransition2(currentRouteId.current, routeId, changeRoute);
11572
+ const transition = yield startViewTransition2(currentRouteId.current, routeId, changeRoute, false);
11467
11573
  if (transition) {
11468
11574
  void transition.updateCallbackDone.then((_a = viewTransitionReady.current) === null || _a === void 0 ? void 0 : _a.resolve).catch((_b = viewTransitionReady.current) === null || _b === void 0 ? void 0 : _b.reject);
11469
11575
  }
11470
11576
  else {
11471
11577
  (_c = viewTransitionReady.current) === null || _c === void 0 ? void 0 : _c.resolve();
11472
11578
  }
11473
- }, [currentRouteId, setCurrentRouteId, startViewTransition2,]);
11579
+ }), [currentRouteId, setCurrentRouteId, startViewTransition2,]);
11474
11580
  const traversalHandler = useCallback((event) => {
11475
11581
  if (event.navigationType !== 'traverse')
11476
11582
  return;
@@ -11488,7 +11594,7 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId) {
11488
11594
  scroll: 'after-transition',
11489
11595
  });
11490
11596
  }, []);
11491
- React4.useEffect(() => {
11597
+ useEffect(() => {
11492
11598
  var _a;
11493
11599
  window.addEventListener('popstate', popStateHandler);
11494
11600
  (_a = window.navigation) === null || _a === void 0 ? void 0 : _a.addEventListener('navigate', traversalHandler);
@@ -11561,9 +11667,9 @@ function switchLocale(options) {
11561
11667
  try {
11562
11668
  localStorage.setItem('preferredLocale', options.nextLocale.code);
11563
11669
  }
11564
- catch (error) { }
11670
+ catch (_j) { }
11565
11671
  try {
11566
- if (typeof result.path !== 'string') {
11672
+ if (!isString2(result.path)) {
11567
11673
  throw new Error('Expected result.path to be a string');
11568
11674
  }
11569
11675
  if (result.isMissingInLocale) {
@@ -11571,14 +11677,8 @@ function switchLocale(options) {
11571
11677
  if (hasRedirect)
11572
11678
  return;
11573
11679
  }
11574
- pushHistoryState({
11575
- routeId: options.routeId,
11576
- pathVariables: result.pathVariables,
11577
- localeId: options.nextLocale.id,
11578
- paginationInfo: window.history.state.paginationInfo,
11579
- }, result.path);
11580
11680
  }
11581
- catch (_j) { }
11681
+ catch (_k) { }
11582
11682
  return result;
11583
11683
  });
11584
11684
  }
@@ -11592,16 +11692,193 @@ function pushLoadMoreHistory(hash2, paginationInfo) {
11592
11692
  }
11593
11693
  catch (_j) { }
11594
11694
  }
11595
- function isSamePage(a, b) {
11596
- if (a.routeId !== b.routeId)
11597
- return false;
11598
- if (a.pathVariables === b.pathVariables)
11599
- return true;
11600
- const aPathVariables = a.pathVariables || {};
11601
- const bPathVariables = b.pathVariables || {};
11602
- return aPathVariables.length === bPathVariables.length &&
11603
- Object.keys(aPathVariables).every((key7) => aPathVariables[key7] === bPathVariables[key7]);
11695
+ function useNativeLoadingSpinner() {
11696
+ const navigationPromise = useRef(Promise.resolve());
11697
+ const navigationController = useRef();
11698
+ const navigateListener = useCallback((navigateEvent) => {
11699
+ if (
11700
+ // we want to intercept non-user triggered replaceState and pushState while the navigation is on-going
11701
+ // but we don't want to intercept e.g. 'traverse' (= browser back/forward) events, as we do this in the usePopStateHandler listener.
11702
+ navigateEvent.userInitiated)
11703
+ return;
11704
+ const controller = navigationController.current;
11705
+ controller === null || controller === void 0 ? void 0 : controller.signal.addEventListener('abort', () => {
11706
+ controller.abort('user aborted');
11707
+ });
11708
+ navigateEvent.intercept({
11709
+ handler: () => navigationPromise.current,
11710
+ });
11711
+ }, []);
11712
+ return useCallback((promise, updateURL, controller) => {
11713
+ if (!window.navigation) {
11714
+ void updateURL();
11715
+ return;
11716
+ }
11717
+ navigationPromise.current = promise;
11718
+ navigationController.current = controller;
11719
+ window.navigation.addEventListener('navigate', navigateListener);
11720
+ void updateURL(true);
11721
+ promise.catch(noop2).finally(() => {
11722
+ window.navigation.removeEventListener('navigate', navigateListener);
11723
+ });
11724
+ }, [navigateListener,]);
11725
+ }
11726
+ function measureSafe(name, start, end) {
11727
+ try {
11728
+ performance.measure(name, start, end);
11729
+ }
11730
+ catch (e) {
11731
+ console.warn(`Could not measure ${name}`, e);
11732
+ }
11604
11733
  }
11734
+ var shouldMark = false;
11735
+ function markHydrationStart() {
11736
+ shouldMark = true;
11737
+ performance.mark('framer-hydration-start');
11738
+ }
11739
+ var routerHydrationInsertionEffectStartHasRun = false;
11740
+ var routerHydrationLayoutEffectStartHasRun = false;
11741
+ var routerHydrationEffectStartHasRun = false;
11742
+ function useMarkRouterEffects() {
11743
+ const hydrationMarkPrefix = 'framer-hydration-router';
11744
+ useInsertionEffect(() => {
11745
+ if (routerHydrationInsertionEffectStartHasRun || !shouldMark)
11746
+ return;
11747
+ routerHydrationInsertionEffectStartHasRun = true;
11748
+ performance.mark(`${hydrationMarkPrefix}-insertion-effect`);
11749
+ }, []);
11750
+ useLayoutEffect(() => {
11751
+ if (routerHydrationLayoutEffectStartHasRun || !shouldMark)
11752
+ return;
11753
+ routerHydrationLayoutEffectStartHasRun = true;
11754
+ performance.mark(`${hydrationMarkPrefix}-layout-effect`);
11755
+ }, []);
11756
+ useEffect(() => {
11757
+ if (routerHydrationEffectStartHasRun || !shouldMark)
11758
+ return;
11759
+ routerHydrationEffectStartHasRun = true;
11760
+ performance.mark(`${hydrationMarkPrefix}-effect`);
11761
+ }, []);
11762
+ }
11763
+ var hydrationInsertionEffectStartHasRun = false;
11764
+ var hydrationLayoutEffectStartHasRun = false;
11765
+ var hydrationEffectStartHasRun = false;
11766
+ function useMarkSuspenseEffectsStart() {
11767
+ const hydrationMarkPrefix = 'framer-hydration-';
11768
+ const hydrationLayoutEffectsEnd = `${hydrationMarkPrefix}layout-effects-end`;
11769
+ const hydrationEffectsEnd = `${hydrationMarkPrefix}effects-end`;
11770
+ const hydrationBrowserRenderStart = `${hydrationMarkPrefix}browser-render-start`;
11771
+ const hydrationRenderEnd = `${hydrationMarkPrefix}render-end`;
11772
+ useInsertionEffect(() => {
11773
+ if (hydrationInsertionEffectStartHasRun || !shouldMark)
11774
+ return;
11775
+ hydrationInsertionEffectStartHasRun = true;
11776
+ performance.mark(hydrationRenderEnd);
11777
+ measureSafe(`${hydrationMarkPrefix}render`, `${hydrationMarkPrefix}start`, hydrationRenderEnd);
11778
+ performance.mark(`${hydrationMarkPrefix}insertion-effects-start`);
11779
+ }, []);
11780
+ useLayoutEffect(() => {
11781
+ if (hydrationLayoutEffectStartHasRun || !shouldMark)
11782
+ return;
11783
+ hydrationLayoutEffectStartHasRun = true;
11784
+ performance.mark(`${hydrationMarkPrefix}layout-effects-start`);
11785
+ requestAnimationFrame(() => {
11786
+ var _a, _b, _c;
11787
+ performance.mark(hydrationBrowserRenderStart);
11788
+ measureSafe(`${hydrationMarkPrefix}uho`, (_b = (_a = performance.getEntriesByName(hydrationEffectsEnd)[0]) === null || _a === void 0 ? void 0 : _a.name) !== null &&
11789
+ _b !== void 0
11790
+ ? _b
11791
+ : (_c = performance.getEntriesByName(hydrationLayoutEffectsEnd)[0]) === null || _c === void 0
11792
+ ? void 0
11793
+ : _c.name, hydrationBrowserRenderStart);
11794
+ });
11795
+ }, []);
11796
+ useEffect(() => {
11797
+ var _a;
11798
+ if (hydrationEffectStartHasRun || !shouldMark)
11799
+ return;
11800
+ hydrationEffectStartHasRun = true;
11801
+ const hydrationEffectsStart = `${hydrationMarkPrefix}effects-start`;
11802
+ performance.mark(hydrationEffectsStart);
11803
+ const hasPaintStarted = (_a = performance.getEntriesByName(hydrationBrowserRenderStart)[0]) === null || _a === void 0
11804
+ ? void 0
11805
+ : _a.name;
11806
+ if (!hasPaintStarted) {
11807
+ measureSafe(`${hydrationMarkPrefix}commit`, hydrationLayoutEffectsEnd, hydrationEffectsStart);
11808
+ performance.mark(`${hydrationMarkPrefix}effects-sync`);
11809
+ }
11810
+ }, []);
11811
+ return null;
11812
+ }
11813
+ var hydrationInsertionEffectHasRun = false;
11814
+ var hydrationLayoutEffectHasRun = false;
11815
+ var hydrationEffectHasRun = false;
11816
+ var hydrationPaintEffectHasRun = false;
11817
+ function useMarkSuspenseEffectEnd() {
11818
+ const hydrationMarkPrefix = 'framer-hydration-';
11819
+ const hydrationLayoutEffectsEnd = `${hydrationMarkPrefix}layout-effects-end`;
11820
+ const hydrationEffectsEnd = `${hydrationMarkPrefix}effects-end`;
11821
+ const hydrationBrowserRenderStart = `${hydrationMarkPrefix}browser-render-start`;
11822
+ const hydrationStart = `${hydrationMarkPrefix}start`;
11823
+ const hydrationInsertionEffectsEnd = `${hydrationMarkPrefix}insertion-effects-end`;
11824
+ const hydrationFP = `${hydrationMarkPrefix}first-paint`;
11825
+ const hydrationAnimationFrameEnd = `${hydrationMarkPrefix}browser-raf-end`;
11826
+ useInsertionEffect(() => {
11827
+ if (hydrationInsertionEffectHasRun || !shouldMark)
11828
+ return;
11829
+ hydrationInsertionEffectHasRun = true;
11830
+ performance.mark(hydrationInsertionEffectsEnd);
11831
+ measureSafe(`${hydrationMarkPrefix}insertion-effects`, `${hydrationMarkPrefix}insertion-effects-start`, hydrationInsertionEffectsEnd);
11832
+ }, []);
11833
+ useLayoutEffect(() => {
11834
+ if (hydrationLayoutEffectHasRun || !shouldMark)
11835
+ return;
11836
+ hydrationLayoutEffectHasRun = true;
11837
+ performance.mark(hydrationLayoutEffectsEnd);
11838
+ measureSafe(`${hydrationMarkPrefix}layout-effects`, `${hydrationMarkPrefix}layout-effects-start`, hydrationLayoutEffectsEnd);
11839
+ requestAnimationFrame(() => {
11840
+ performance.mark(hydrationAnimationFrameEnd);
11841
+ measureSafe(`${hydrationMarkPrefix}raf`, hydrationBrowserRenderStart, hydrationAnimationFrameEnd);
11842
+ });
11843
+ }, []);
11844
+ useEffect(() => {
11845
+ var _a, _b, _c;
11846
+ if (hydrationEffectHasRun || !shouldMark)
11847
+ return;
11848
+ hydrationEffectHasRun = true;
11849
+ performance.mark(hydrationEffectsEnd);
11850
+ measureSafe(`${hydrationMarkPrefix}effects`, (_b = (_a = performance.getEntriesByName(hydrationFP)[0]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0
11851
+ ? _b
11852
+ : (_c = performance.getEntriesByName(`${hydrationMarkPrefix}effects-start`)[0]) === null || _c === void 0
11853
+ ? void 0
11854
+ : _c.name, hydrationEffectsEnd);
11855
+ }, []);
11856
+ useAfterPaintEffect(() => {
11857
+ if (hydrationPaintEffectHasRun || !shouldMark)
11858
+ return;
11859
+ hydrationPaintEffectHasRun = true;
11860
+ performance.mark(hydrationFP);
11861
+ measureSafe(`${hydrationMarkPrefix}time-to-first-paint`, hydrationStart, hydrationFP);
11862
+ measureSafe(`${hydrationMarkPrefix}browser-render`, hydrationAnimationFrameEnd, hydrationFP);
11863
+ }, [],
11864
+ // user-blocking ensures we get the correct timings here. Other priorites might delay this effect a little bit.
11865
+ {
11866
+ priority: 'user-blocking',
11867
+ });
11868
+ return null;
11869
+ }
11870
+ function MarkSuspenseEffectsStart() {
11871
+ useMarkSuspenseEffectsStart();
11872
+ return null;
11873
+ }
11874
+ function MarkSuspenseEffectsEnd() {
11875
+ useMarkSuspenseEffectEnd();
11876
+ return null;
11877
+ }
11878
+ var MarkSuspenseEffects = {
11879
+ Start: MarkSuspenseEffectsStart,
11880
+ End: MarkSuspenseEffectsEnd,
11881
+ };
11605
11882
  var eventsToStop = [
11606
11883
  'mousedown',
11607
11884
  'mouseup',
@@ -11639,104 +11916,44 @@ var stopFn = (event) => {
11639
11916
  event.stopPropagation();
11640
11917
  performance.mark('framer-react-event-handling-prevented');
11641
11918
  };
11642
- if (typeof window !== 'undefined') {
11643
- window.__FRAMER_TURN_OFF_REACT_EVENT_HANDLING__ = function () {
11644
- if (!eventsToStop)
11645
- return;
11646
- const options = {
11647
- capture: true,
11648
- };
11649
- eventsToStop.forEach((event) => document.body.addEventListener(event, stopFn, options));
11650
- window.__FRAMER_TURN_OFF_REACT_EVENT_HANDLING__ = void 0;
11651
- };
11652
- }
11653
- function turnOnReactEventHandling() {
11919
+ var shouldTurnOnEventHandling = false;
11920
+ function turnOffReactEventHandling() {
11654
11921
  if (!eventsToStop)
11655
11922
  return;
11923
+ shouldTurnOnEventHandling = true;
11924
+ performance.mark('framer-react-event-handling-start');
11656
11925
  const options = {
11657
11926
  capture: true,
11658
11927
  };
11659
- eventsToStop.forEach((event) => document.body.removeEventListener(event, stopFn, options));
11660
- eventsToStop = void 0;
11661
- }
11662
- function measureSafe(name, start, end) {
11663
- try {
11664
- performance.measure(name, start, end);
11665
- }
11666
- catch (e) {
11667
- console.warn(`Could not measure ${name}`, e);
11668
- }
11928
+ eventsToStop.forEach((event) => document.body.addEventListener(event, stopFn, options));
11669
11929
  }
11670
- var hydrationEffectHasRun = false;
11671
- var hydrationInsertionEffectHasRun = false;
11672
- var hydrationLayoutEffectHasRun = false;
11673
- function OnHydrationEnd({ addHydrationMarkers, turnOffEventHandlerHack, }) {
11674
- const hydrationMarkPrefix = 'framer-hydration-';
11675
- const hydrationStart = `${hydrationMarkPrefix}start`;
11676
- const hydrationRenderEnd = `${hydrationMarkPrefix}render-end`;
11677
- const hydrationLayoutEffectsEnd = `${hydrationMarkPrefix}layout-effects-end`;
11678
- const hydrationEffectsEnd = `${hydrationMarkPrefix}effects-end`;
11679
- const hydrationFP = `${hydrationMarkPrefix}first-paint`;
11680
- useInsertionEffect(() => {
11681
- if (hydrationInsertionEffectHasRun)
11682
- return;
11683
- hydrationInsertionEffectHasRun = true;
11684
- if (addHydrationMarkers) {
11685
- performance.mark(hydrationRenderEnd);
11686
- measureSafe(`${hydrationMarkPrefix}render`, hydrationStart, hydrationRenderEnd);
11687
- }
11688
- }, []);
11689
- useLayoutEffect(() => {
11690
- if (hydrationLayoutEffectHasRun)
11691
- return;
11692
- hydrationLayoutEffectHasRun = true;
11693
- if (addHydrationMarkers) {
11694
- performance.mark(hydrationLayoutEffectsEnd);
11695
- measureSafe(`${hydrationMarkPrefix}layout-effects`, hydrationRenderEnd, hydrationLayoutEffectsEnd);
11696
- }
11697
- requestAnimationFrame(() => {
11698
- var _a, _b, _c;
11699
- const browserRenderStart = `${hydrationMarkPrefix}browser-render-start`;
11700
- if (addHydrationMarkers) {
11701
- performance.mark(browserRenderStart);
11702
- measureSafe(`${hydrationMarkPrefix}uho`, (_b = (_a = performance.getEntriesByName(hydrationEffectsEnd)[0]) === null || _a === void 0 ? void 0 : _a.name) !== null &&
11703
- _b !== void 0
11704
- ? _b
11705
- : (_c = performance.getEntriesByName(hydrationLayoutEffectsEnd)[0]) === null || _c === void 0
11706
- ? void 0
11707
- : _c.name, browserRenderStart);
11708
- }
11709
- setTimeout(() => {
11710
- if (turnOffEventHandlerHack) {
11711
- turnOnReactEventHandling();
11712
- }
11713
- if (addHydrationMarkers) {
11714
- performance.mark(hydrationFP);
11715
- measureSafe(`${hydrationMarkPrefix}time-to-first-paint`, hydrationStart, hydrationFP);
11716
- measureSafe(`${hydrationMarkPrefix}browser-render`, browserRenderStart, hydrationFP);
11717
- }
11718
- }, 0);
11719
- });
11720
- }, []);
11721
- useEffect(() => {
11722
- var _a, _b, _c;
11723
- if (hydrationEffectHasRun)
11930
+ function TurnOnReactEventHandling() {
11931
+ useAfterPaintEffect(() => {
11932
+ if (!shouldTurnOnEventHandling || !eventsToStop)
11724
11933
  return;
11725
- hydrationEffectHasRun = true;
11726
- if (turnOffEventHandlerHack) {
11727
- turnOnReactEventHandling();
11728
- }
11729
- if (addHydrationMarkers) {
11730
- performance.mark(hydrationEffectsEnd);
11731
- measureSafe(`${hydrationMarkPrefix}effects`, (_b = (_a = performance.getEntriesByName(hydrationFP)[0]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0
11732
- ? _b
11733
- : (_c = performance.getEntriesByName(hydrationLayoutEffectsEnd)[0]) === null || _c === void 0
11734
- ? void 0
11735
- : _c.name, hydrationEffectsEnd);
11736
- }
11737
- }, []);
11934
+ const options = {
11935
+ capture: true,
11936
+ };
11937
+ eventsToStop.forEach((event) => document.body.removeEventListener(event, stopFn, options));
11938
+ eventsToStop = void 0;
11939
+ performance.mark('framer-react-event-handling-end');
11940
+ }, [],
11941
+ // user-blocking ensures this runs right after the paint, so users can interact asap.
11942
+ {
11943
+ priority: 'user-blocking',
11944
+ });
11738
11945
  return null;
11739
11946
  }
11947
+ function isSamePage(a, b) {
11948
+ if (a.routeId !== b.routeId)
11949
+ return false;
11950
+ if (a.pathVariables === b.pathVariables)
11951
+ return true;
11952
+ const aPathVariables = a.pathVariables || {};
11953
+ const bPathVariables = b.pathVariables || {};
11954
+ return aPathVariables.length === bPathVariables.length &&
11955
+ Object.keys(aPathVariables).every((key7) => aPathVariables[key7] === bPathVariables[key7]);
11956
+ }
11740
11957
  function useGetRouteCallback(routes) {
11741
11958
  return React4.useCallback((routeId) => routes[routeId], [routes,]);
11742
11959
  }
@@ -11836,25 +12053,31 @@ function useLocaleCode() {
11836
12053
  function useLocale() {
11837
12054
  return useLocaleCode();
11838
12055
  }
11839
- function useMonitorNextRender(label) {
12056
+ function useMonitorNextPaintAfterRender(label) {
11840
12057
  const startLabel = `start-${label}`;
11841
12058
  const endLabel = `end-${label}`;
11842
12059
  const resolveHasPainted = useRef(void 0);
11843
- useEffect(() => {
12060
+ useAfterPaintEffect(() => {
11844
12061
  if (resolveHasPainted.current) {
11845
12062
  resolveHasPainted.current();
11846
12063
  resolveHasPainted.current = void 0;
11847
12064
  }
12065
+ }, void 0,
12066
+ // user-blocking ensures we get the correct timings here. Other priorites might delay this effect a little bit.
12067
+ {
12068
+ priority: 'user-blocking',
11848
12069
  });
11849
12070
  return useCallback(() => {
11850
12071
  const hasPainted = new Promise((resolve) => {
11851
12072
  resolveHasPainted.current = resolve;
11852
12073
  });
11853
12074
  performance.mark(startLabel);
11854
- hasPainted.then(() => {
12075
+ return hasPainted.finally(() => {
11855
12076
  performance.mark(endLabel);
11856
12077
  performance.measure(label, startLabel, endLabel);
11857
- }).catch(() => { });
12078
+ }).catch((e) => {
12079
+ console.error(e);
12080
+ });
11858
12081
  }, [label, startLabel, endLabel,]);
11859
12082
  }
11860
12083
  function updateScrollPosition(hash2, smoothScroll, isHistoryTransition) {
@@ -11868,19 +12091,67 @@ function updateScrollPosition(hash2, smoothScroll, isHistoryTransition) {
11868
12091
  window.scrollTo(0, 0);
11869
12092
  }
11870
12093
  function useScheduleRenderSideEffects(dep) {
11871
- const actions = React4.useRef([]);
11872
- React4.useLayoutEffect(() => {
12094
+ const actions = useRef([]);
12095
+ useLayoutEffect(() => {
11873
12096
  var _a;
11874
12097
  if (!((_a = actions.current) === null || _a === void 0 ? void 0 : _a.length))
11875
12098
  return;
11876
12099
  actions.current.forEach((action) => action());
11877
12100
  actions.current = [];
11878
12101
  }, [dep,]);
11879
- return React4.useCallback((cb) => {
12102
+ return useCallback((cb) => {
11880
12103
  actions.current.push(cb);
11881
12104
  }, []);
11882
12105
  }
11883
- function Router({ defaultPageStyle, disableHistory, initialPathVariables, initialRoute, notFoundPage, collectionUtils, routes, initialLocaleId, locales = [], preserveQueryParams = false, enableImproveInpDuringHydration = false, addHydrationMarkers = false, }) {
12106
+ function useNavigationTransition(enableAsyncURLUpdates) {
12107
+ const startNativeSpinner = useNativeLoadingSpinner();
12108
+ const monitorNextPaintAfterRender = useMonitorNextPaintAfterRender('route-change');
12109
+ const navigationController = useRef(void 0);
12110
+ return useCallback((transitionFn_1, updateURL_1, ...args_1) => __awaiter(this, [transitionFn_1, updateURL_1, ...args_1], void 0, function* (transitionFn, updateURL, isAbortable = true) {
12111
+ var _a;
12112
+ if (!enableAsyncURLUpdates) {
12113
+ yield (updateURL === null || updateURL === void 0 ? void 0 : updateURL());
12114
+ transitionFn();
12115
+ void monitorNextPaintAfterRender();
12116
+ return new Promise((resolve) => {
12117
+ resolve();
12118
+ });
12119
+ }
12120
+ (_a = navigationController.current) === null || _a === void 0 ? void 0 : _a.abort();
12121
+ const controller = isAbortable ? new AbortController() : void 0;
12122
+ navigationController.current = controller;
12123
+ const signal = controller === null || controller === void 0 ? void 0 : controller.signal;
12124
+ const nextRender = monitorNextPaintAfterRender();
12125
+ if (!updateURL) {
12126
+ navigationController.current = void 0;
12127
+ transitionFn(signal);
12128
+ return nextRender;
12129
+ }
12130
+ transitionFn(signal);
12131
+ yield interactionResponse({
12132
+ priority: 'user-visible',
12133
+ signal,
12134
+ }).catch(noop2);
12135
+ yield interactionResponse({
12136
+ priority: 'user-visible',
12137
+ signal,
12138
+ }).catch(noop2);
12139
+ let resolveNavigationPromise;
12140
+ const navigationPromise = new Promise((resolve, reject) => {
12141
+ resolveNavigationPromise = resolve;
12142
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
12143
+ reject();
12144
+ else
12145
+ signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', reject);
12146
+ });
12147
+ startNativeSpinner(navigationPromise, updateURL, controller);
12148
+ return nextRender.then(() => {
12149
+ resolveNavigationPromise();
12150
+ });
12151
+ }), [enableAsyncURLUpdates, monitorNextPaintAfterRender, startNativeSpinner,]);
12152
+ }
12153
+ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initialRoute, notFoundPage, collectionUtils, routes, initialLocaleId, locales = [], preserveQueryParams = false, enableAsyncURLUpdates = false, }) {
12154
+ useMarkRouterEffects();
11884
12155
  useReplaceInitialState({
11885
12156
  disabled: disableHistory,
11886
12157
  routeId: initialRoute,
@@ -11888,12 +12159,14 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
11888
12159
  initialLocaleId,
11889
12160
  });
11890
12161
  const startViewTransition2 = useViewTransition();
11891
- const monitorNextRender = useMonitorNextRender('route-change');
11892
- const currentRouteRef = React4.useRef(initialRoute);
11893
- const currentPathVariablesRef = React4.useRef(initialPathVariables);
11894
- const currentLocaleIdRef = React4.useRef(initialLocaleId);
12162
+ const [dep, forceUpdate,] = useForceUpdate2();
12163
+ const scheduleSideEffect = useScheduleRenderSideEffects(dep);
12164
+ const startNavigation = useNavigationTransition(enableAsyncURLUpdates);
12165
+ const currentRouteRef = useRef(initialRoute);
12166
+ const currentPathVariablesRef = useRef(initialPathVariables);
12167
+ const currentLocaleIdRef = useRef(initialLocaleId);
11895
12168
  const currentLocaleId = currentLocaleIdRef.current;
11896
- const activeLocale = React4.useMemo(() => {
12169
+ const activeLocale = useMemo(() => {
11897
12170
  var _a;
11898
12171
  return (_a = locales.find(({ id: id3, }) => {
11899
12172
  if (!currentLocaleId)
@@ -11903,8 +12176,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
11903
12176
  ? _a
11904
12177
  : null;
11905
12178
  }, [currentLocaleId, locales,]);
11906
- const [dep, forceUpdate,] = useForceUpdate2();
11907
- const localeInfo = React4.useMemo(() => {
12179
+ const localeInfo = useMemo(() => {
11908
12180
  return {
11909
12181
  activeLocale,
11910
12182
  locales,
@@ -11937,28 +12209,55 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
11937
12209
  });
11938
12210
  if (!localeResult)
11939
12211
  return;
12212
+ const currentPathVariables2 = currentPathVariablesRef.current;
12213
+ const currentStatePaginationInfo = window.history.state.paginationInfo;
12214
+ const currentPath = localeResult.path;
11940
12215
  currentPathVariablesRef.current = localeResult.pathVariables;
11941
12216
  currentLocaleIdRef.current = nextLocale.id;
11942
- startViewTransition2(currentRouteRef.current, currentRouteId2, () => startTransition2(forceUpdate));
11943
- monitorNextRender();
12217
+ const updateURL = (...args_1) => __awaiter(this, [...args_1], void 0, function* (ignorePushStateWrapper = false) {
12218
+ if (!currentPath)
12219
+ return;
12220
+ return pushHistoryState({
12221
+ routeId: currentRouteId2,
12222
+ pathVariables: currentPathVariables2,
12223
+ localeId: nextLocale.id,
12224
+ paginationInfo: currentStatePaginationInfo,
12225
+ }, currentPath,
12226
+ // we yield in startNavigation before updating the URL, so yielding again is not needed.
12227
+ false, ignorePushStateWrapper);
12228
+ });
12229
+ void startNavigation(() => {
12230
+ void startViewTransition2(currentRouteId2, currentRouteId2, () => startTransition2(forceUpdate), enableAsyncURLUpdates);
12231
+ }, updateURL, false);
11944
12232
  }
11945
12233
  catch (_j) { }
11946
12234
  }),
11947
12235
  };
11948
- }, [activeLocale, collectionUtils, forceUpdate, locales, monitorNextRender, preserveQueryParams, routes, startViewTransition2,]);
11949
- const scheduleSideEffect = useScheduleRenderSideEffects(dep);
11950
- const setCurrentRouteId = React4.useCallback((routeId, localeId, hash2, pathVariables, smoothScroll = false, isHistoryTransition = false) => {
12236
+ }, [
12237
+ activeLocale,
12238
+ collectionUtils,
12239
+ enableAsyncURLUpdates,
12240
+ forceUpdate,
12241
+ locales,
12242
+ preserveQueryParams,
12243
+ routes,
12244
+ startNavigation,
12245
+ startViewTransition2,
12246
+ ]);
12247
+ const setCurrentRouteId = useCallback((routeId, localeId, hash2, pathVariables, smoothScroll = false, isHistoryTransition = false, updateURL) => {
12248
+ const currentRouteId2 = currentRouteRef.current;
11951
12249
  currentRouteRef.current = routeId;
11952
12250
  currentPathVariablesRef.current = pathVariables;
11953
12251
  currentLocaleIdRef.current = localeId;
11954
12252
  scheduleSideEffect(() => {
11955
12253
  updateScrollPosition(hash2, smoothScroll, isHistoryTransition);
11956
12254
  });
11957
- startTransition2(forceUpdate);
11958
- monitorNextRender();
11959
- }, [forceUpdate, monitorNextRender, scheduleSideEffect,]);
12255
+ void startNavigation((signal) => {
12256
+ void startViewTransition2(currentRouteId2, routeId, () => startTransition2(forceUpdate), enableAsyncURLUpdates, signal);
12257
+ }, updateURL);
12258
+ }, [enableAsyncURLUpdates, forceUpdate, scheduleSideEffect, startNavigation, startViewTransition2,]);
11960
12259
  usePopStateHandler(currentRouteRef, setCurrentRouteId);
11961
- const navigate = React4.useCallback((routeId, hash2, pathVariables, smoothScroll) => {
12260
+ const navigate = useCallback((routeId, hash2, pathVariables, smoothScroll) => __awaiter(this, void 0, void 0, function* () {
11962
12261
  var _a, _b;
11963
12262
  const newRoute = routes[routeId];
11964
12263
  if (pathVariables) {
@@ -11974,51 +12273,54 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
11974
12273
  pathVariables = Object.fromEntries(Object.entries(pathVariables).filter(([key7,]) => inUse.has(key7)));
11975
12274
  }
11976
12275
  const routeElementId = getRouteElementId(newRoute, hash2);
12276
+ const currentPathVariables2 = currentPathVariablesRef.current;
12277
+ const currentRouteLocaleId = currentLocaleIdRef.current;
11977
12278
  if (isSamePage({
11978
12279
  routeId: currentRouteRef.current,
11979
- pathVariables: currentPathVariablesRef.current,
12280
+ pathVariables: currentPathVariables2,
11980
12281
  }, {
11981
12282
  routeId,
11982
12283
  pathVariables,
11983
12284
  })) {
11984
- if (((_b = window.history.state) === null || _b === void 0 ? void 0 : _b.hash) !== hash2) {
11985
- if (!disableHistory) {
11986
- const route = routes[routeId];
11987
- if (route) {
11988
- pushRouteState(routeId, route, {
11989
- currentRoutePath: route.path,
11990
- currentPathVariables: currentPathVariablesRef.current,
11991
- pathVariables,
11992
- hash: hash2,
11993
- localeId: currentLocaleIdRef.current,
11994
- preserveQueryParams,
11995
- });
11996
- }
11997
- }
11998
- }
11999
12285
  updateScrollPosition(routeElementId, smoothScroll, false);
12286
+ const route = routes[routeId];
12287
+ if (((_b = window.history.state) === null || _b === void 0 ? void 0 : _b.hash) === hash2 || disableHistory || !route)
12288
+ return;
12289
+ const updateURLPromise = pushRouteState(routeId, route, {
12290
+ currentRoutePath: route.path,
12291
+ currentPathVariables: currentPathVariables2,
12292
+ pathVariables,
12293
+ hash: hash2,
12294
+ localeId: currentRouteLocaleId,
12295
+ preserveQueryParams,
12296
+ },
12297
+ // we want to yield as this is called synchronusly from an user interaction.
12298
+ enableAsyncURLUpdates);
12299
+ if (!enableAsyncURLUpdates)
12300
+ return yield updateURLPromise;
12000
12301
  return;
12001
12302
  }
12002
12303
  if (!newRoute)
12003
12304
  return;
12004
- if (!disableHistory) {
12005
- const currentRoute = routes[currentRouteRef.current];
12006
- pushRouteState(routeId, newRoute, {
12305
+ const currentRoute = routes[currentRouteRef.current];
12306
+ const updateURL = (...args_1) => __awaiter(this, [...args_1], void 0, function* (ignorePushStateWrapper = false) {
12307
+ return pushRouteState(routeId, newRoute, {
12007
12308
  currentRoutePath: currentRoute === null || currentRoute === void 0 ? void 0 : currentRoute.path,
12008
- currentPathVariables: currentPathVariablesRef.current,
12309
+ currentPathVariables: currentPathVariables2,
12009
12310
  hash: hash2,
12010
12311
  pathVariables,
12011
- localeId: currentLocaleIdRef.current,
12312
+ localeId: currentRouteLocaleId,
12012
12313
  preserveQueryParams,
12013
- });
12014
- }
12015
- const changeRoute = () => setCurrentRouteId(routeId, currentLocaleIdRef.current, routeElementId, pathVariables, smoothScroll, false);
12016
- startViewTransition2(currentRouteRef.current, routeId, changeRoute);
12017
- }, [routes, disableHistory, setCurrentRouteId, startViewTransition2, preserveQueryParams,]);
12314
+ },
12315
+ // we yield in startNavigation before updating the URL, so yielding again is not needed.
12316
+ false, ignorePushStateWrapper);
12317
+ });
12318
+ setCurrentRouteId(routeId, currentRouteLocaleId, routeElementId, pathVariables, smoothScroll, false, disableHistory ? void 0 : updateURL);
12319
+ }), [routes, setCurrentRouteId, disableHistory, preserveQueryParams, enableAsyncURLUpdates,]);
12018
12320
  const getRoute = useGetRouteCallback(routes);
12019
12321
  const currentRouteId = currentRouteRef.current;
12020
12322
  const currentPathVariables = currentPathVariablesRef.current;
12021
- const api = React4.useMemo(() => ({
12323
+ const api = useMemo(() => ({
12022
12324
  navigate,
12023
12325
  getRoute,
12024
12326
  currentRouteId,
@@ -12046,16 +12348,17 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
12046
12348
  notFoundPage,
12047
12349
  defaultPageStyle,
12048
12350
  forceUpdateKey: dep,
12049
- children: jsx(React4.Fragment, {
12050
- children: pageExistsInCurrentLocale
12051
- ? renderPage(current.page, defaultPageStyle)
12052
- : notFoundPage && renderPage(notFoundPage, defaultPageStyle),
12351
+ children: jsxs(Fragment, {
12352
+ children: [
12353
+ jsx(MarkSuspenseEffects.Start, {}),
12354
+ pageExistsInCurrentLocale
12355
+ ? renderPage(current.page, defaultPageStyle)
12356
+ : notFoundPage && renderPage(notFoundPage, defaultPageStyle),
12357
+ ],
12053
12358
  }, remountKey),
12054
12359
  }),
12055
- jsx(OnHydrationEnd, {
12056
- addHydrationMarkers,
12057
- turnOffEventHandlerHack: enableImproveInpDuringHydration,
12058
- }),
12360
+ jsx(TurnOnReactEventHandling, {}),
12361
+ jsx(MarkSuspenseEffects.End, {}),
12059
12362
  ],
12060
12363
  }),
12061
12364
  }),
@@ -14226,8 +14529,8 @@ var ObjectInterpolation = (valueInterpolation) => {
14226
14529
  difference(from, to) {
14227
14530
  let sum = 0;
14228
14531
  for (const key7 in from) {
14229
- const difference = valueInterpolation.difference(from[key7], to[key7]);
14230
- sum += Math.pow(difference, 2);
14532
+ const difference2 = valueInterpolation.difference(from[key7], to[key7]);
14533
+ sum += Math.pow(difference2, 2);
14231
14534
  }
14232
14535
  return Math.sqrt(sum);
14233
14536
  },
@@ -17212,6 +17515,7 @@ var richTextCSSRules = [
17212
17515
  h6.framer-text:not(:first-child),
17213
17516
  ol.framer-text:not(:first-child),
17214
17517
  ul.framer-text:not(:first-child),
17518
+ blockquote.framer-text:not(:first-child),
17215
17519
  .framer-image.framer-text:not(:first-child) {
17216
17520
  margin-top: var(--framer-blockquote-paragraph-spacing, var(--framer-paragraph-spacing, 0));
17217
17521
  }
@@ -17249,13 +17553,13 @@ var richTextCSSRules = [
17249
17553
  `
17250
17554
  code.framer-text,
17251
17555
  code.framer-text span.framer-text:not([data-text-fill]) {
17252
- font-family: var(--framer-code-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif));
17253
- font-style: var(--framer-code-font-style, var(--framer-font-style, normal));
17254
- font-weight: var(--framer-code-font-weight, var(--framer-font-weight, 400));
17255
- color: var(--framer-code-text-color, var(--framer-text-color, #000));
17256
- font-size: calc(var(--framer-font-size, 16px) * var(--framer-font-size-scale, 1));
17257
- letter-spacing: var(--framer-letter-spacing, 0);
17258
- line-height: var(--framer-line-height, 1.2em);
17556
+ font-family: var(--framer-blockquote-font-family, var(--framer-code-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
17557
+ font-style: var(--framer-blockquote-font-style, var(--framer-code-font-style, var(--framer-font-style, normal)));
17558
+ font-weight: var(--framer-blockquote-font-weight, var(--framer-code-font-weight, var(--framer-font-weight, 400)));
17559
+ color: var(--framer-blockquote-text-color, var(--framer-code-text-color, var(--framer-text-color, #000)));
17560
+ font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
17561
+ letter-spacing: var(--framer-blockquote-letter-spacing, var(--framer-letter-spacing, 0));
17562
+ line-height: var(--framer-blockquote-line-height, var(--framer-line-height, 1.2em));
17259
17563
  }
17260
17564
  `, /* css */
17261
17565
  `
@@ -17270,13 +17574,13 @@ var richTextCSSRules = [
17270
17574
  `
17271
17575
  a.framer-text,
17272
17576
  a.framer-text span.framer-text:not([data-text-fill]) {
17273
- font-family: var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif));
17274
- font-style: var(--framer-link-font-style, var(--framer-font-style, normal));
17275
- font-weight: var(--framer-link-font-weight, var(--framer-font-weight, 400));
17276
- color: var(--framer-link-text-color, var(--framer-text-color, #000));
17277
- font-size: calc(var(--framer-link-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
17278
- text-transform: var(--framer-link-text-transform, var(--framer-text-transform, none));
17279
- text-decoration: var(--framer-link-text-decoration, var(--framer-text-decoration, none));
17577
+ font-family: var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
17578
+ font-style: var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)));
17579
+ font-weight: var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)));
17580
+ color: var(--framer-blockquote-text-color, var(--framer-link-text-color, var(--framer-text-color, #000)));
17581
+ font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
17582
+ text-transform: var(--framer-blockquote-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none)));
17583
+ text-decoration: var(--framer-blockquote-text-decoration, var(--framer-link-text-decoration, var(--framer-text-decoration, none)));
17280
17584
  /* Cursor inherit to overwrite the user agent stylesheet on rich text links. */
17281
17585
  cursor: var(--framer-custom-cursors, pointer);
17282
17586
  }
@@ -17284,33 +17588,33 @@ var richTextCSSRules = [
17284
17588
  `
17285
17589
  code.framer-text a.framer-text,
17286
17590
  code.framer-text a.framer-text span.framer-text:not([data-text-fill]) {
17287
- font-family: var(--framer-code-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif));
17288
- font-style: var(--framer-code-font-style, var(--framer-font-style, normal));
17289
- font-weight: var(--framer-code-font-weight, var(--framer-font-weight, 400));
17290
- color: var(--framer-link-text-color, var(--framer-code-text-color, var(--framer-text-color, #000)));
17291
- font-size: calc(var(--framer-link-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
17591
+ font-family: var(--framer-blockquote-font-family, var(--framer-code-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
17592
+ font-style: var(--framer-blockquote-font-style, var(--framer-code-font-style, var(--framer-font-style, normal)));
17593
+ font-weight: var(--framer-blockquote-font-weight, var(--framer-code-font-weight, var(--framer-font-weight, 400)));
17594
+ color: var(--framer-blockquote-text-color, var(--framer-link-text-color, var(--framer-code-text-color, var(--framer-text-color, #000))));
17595
+ font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
17292
17596
  }
17293
17597
  `, /* css */
17294
17598
  `
17295
17599
  a.framer-text:hover,
17296
17600
  a.framer-text:hover span.framer-text:not([data-text-fill]) {
17297
- font-family: var(--framer-link-hover-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
17298
- font-style: var(--framer-link-hover-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)));
17299
- font-weight: var(--framer-link-hover-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)));
17300
- color: var(--framer-link-hover-text-color, var(--framer-link-text-color, var(--framer-text-color, #000)));
17301
- font-size: calc(var(--framer-link-hover-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px))) * var(--framer-font-size-scale, 1));
17302
- text-transform: var(--framer-link-hover-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none)));
17303
- text-decoration: var(--framer-link-hover-text-decoration, var(--framer-link-text-decoration, var(--framer-text-decoration, none)));
17601
+ font-family: var(--framer-link-hover-font-family, var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
17602
+ font-style: var(--framer-link-hover-font-style, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
17603
+ font-weight: var(--framer-link-hover-font-weight, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
17604
+ color: var(--framer-link-hover-text-color, var(--framer-blockquote-text-color, var(--framer-link-text-color, var(--framer-text-color, #000))));
17605
+ font-size: calc(var(--framer-link-hover-font-size, var(--framer-blockquote-font-size, var(--framer-font-size, 16px))) * var(--framer-font-size-scale, 1));
17606
+ text-transform: var(--framer-link-hover-text-transform, var(--framer-blockquote-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none))));
17607
+ text-decoration: var(--framer-link-hover-text-decoration, var(--framer-blockquote-text-decoration, var(--framer-link-text-decoration, var(--framer-text-decoration, none))));
17304
17608
  }
17305
17609
  `, /* css */
17306
17610
  `
17307
17611
  code.framer-text a.framer-text:hover,
17308
17612
  code.framer-text a.framer-text:hover span.framer-text:not([data-text-fill]) {
17309
- font-family: var(--framer-code-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif));
17310
- font-style: var(--framer-code-font-style, var(--framer-font-style, normal));
17311
- font-weight: var(--framer-code-font-weight, var(--framer-font-weight, 400));
17312
- color: var(--framer-link-hover-text-color, var(--framer-link-text-color, var(--framer-code-text-color, var(--framer-text-color, #000))));
17313
- font-size: calc(var(--framer-link-hover-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px))) * var(--framer-font-size-scale, 1));
17613
+ font-family: var(--framer-blockquote-font-family, var(--framer-code-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
17614
+ font-style: var(--framer-blockquote-font-style, var(--framer-code-font-style, var(--framer-font-style, normal)));
17615
+ font-weight: var(--framer-blockquote-font-weight, var(--framer-code-font-weight, var(--framer-font-weight, 400)));
17616
+ color: var(--framer-link-hover-text-color, var(--framer-blockquote-text-color, var(--framer-link-text-color, var(--framer-code-text-color, var(--framer-text-color, #000)))));
17617
+ font-size: calc(var(--framer-link-hover-font-size, var(--framer-blockquote-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px)))) * var(--framer-font-size-scale, 1));
17314
17618
  }
17315
17619
  `, /* css */
17316
17620
  `
@@ -17802,8 +18106,8 @@ function isUndefined(value) {
17802
18106
  function isNull(value) {
17803
18107
  return value === null;
17804
18108
  }
17805
- function isNullish(value) {
17806
- return isUndefined(value) || isNull(value);
18109
+ function isNullish2(value) {
18110
+ return value == null;
17807
18111
  }
17808
18112
  function isValidDate(value) {
17809
18113
  return value instanceof Date && !isNaN(value.getTime());
@@ -19413,148 +19717,6 @@ var reactPropsRegex = /^(?:children|dangerouslySetInnerHTML|key|ref|autoFocus|de
19413
19717
  var isPropValid = /* @__PURE__ */ memoize((prop) => reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 && prop.charCodeAt(1) === 110 && prop.charCodeAt(2) < 91
19414
19718
  /* Z+1 */
19415
19719
  );
19416
- var LibraryFeaturesContext = /* @__PURE__ */ React4.createContext(void 0);
19417
- var LibraryFeaturesProvider = /* @__PURE__ */ (() => LibraryFeaturesContext.Provider)();
19418
- var useLibraryFeatures = () => {
19419
- const context = React4.useContext(LibraryFeaturesContext);
19420
- return context !== null && context !== void 0 ? context : {};
19421
- };
19422
- var import_process = __toESM(require_browser(), 1);
19423
- var safeNavigator = typeof navigator !== 'undefined' ? navigator : void 0;
19424
- var isBrowser2 = () => typeof document === 'object';
19425
- var isWebKit = () => {
19426
- var _a;
19427
- return ((_a = safeNavigator) == null ? void 0 : _a.userAgent.includes('AppleWebKit/')) && !isChrome() && !isEdge();
19428
- };
19429
- var webkitVersion = () => {
19430
- let version2 = -1;
19431
- const regexp = /AppleWebKit\/([\d.]+)/;
19432
- const result = safeNavigator && regexp.exec(safeNavigator.userAgent);
19433
- if (result && result[1]) {
19434
- version2 = parseFloat(result[1]);
19435
- }
19436
- return version2;
19437
- };
19438
- var safariVersion = () => {
19439
- let version2 = -1;
19440
- const regexp = /Version\/([\d.]+)/;
19441
- const result = safeNavigator && regexp.exec(safeNavigator.userAgent);
19442
- if (result && result[1]) {
19443
- version2 = parseFloat(result[1]);
19444
- }
19445
- return version2;
19446
- };
19447
- var isChrome = () => safeNavigator && /Chrome/.test(safeNavigator.userAgent) && /Google Inc/.test(safeNavigator.vendor) && !isEdge();
19448
- var isSafari = () => safeNavigator && /Safari/.test(safeNavigator.userAgent) && /Apple Computer/.test(safeNavigator.vendor);
19449
- var isFirefox = () => safeNavigator && /Firefox\/\d+\.\d+$/.test(safeNavigator.userAgent);
19450
- var isFramerX = () => safeNavigator && /FramerX/.test(safeNavigator.userAgent);
19451
- var isEdge = () => safeNavigator && /Edg\//.test(safeNavigator.userAgent);
19452
- var isAndroid = () => safeNavigator && /android/i.test(safeNavigator.userAgent);
19453
- var isIOS = () => safeNavigator && /iPhone|iPod|iPad/i.test(safeNavigator.platform);
19454
- var isMacOS = () => safeNavigator && /Mac/.test(safeNavigator.platform);
19455
- var isWindows = () => safeNavigator && /Win/.test(safeNavigator.platform);
19456
- var isTouch = () => safeWindow.ontouchstart === null && safeWindow.ontouchmove === null && safeWindow.ontouchend === null;
19457
- var isDesktop = () => deviceType() === 'desktop';
19458
- var isPhone = () => deviceType() === 'phone';
19459
- var isTablet = () => deviceType() === 'tablet';
19460
- var isMobile = () => isPhone() || isTablet();
19461
- var isFileUrl = (url) => url.startsWith('file://');
19462
- var isDataUrl = (url) => url.startsWith('data:');
19463
- var isTest = () => import_process.default.env.NODE_ENV === 'test';
19464
- var isRelativeUrl = (url) => !/^[a-z]{1,8}:\/\/.*$/i.test(url);
19465
- var isLocalServerUrl = (url) => /[a-z]{1,8}:\/\/127\.0\.0\.1/i.test(url) || /[a-zA-Z]{1,8}:\/\/localhost/.test(url);
19466
- var isLocalUrl = (url) => {
19467
- if (isFileUrl(url))
19468
- return true;
19469
- if (isLocalServerUrl(url))
19470
- return true;
19471
- return false;
19472
- };
19473
- var isLocalAssetUrl = (url, baseUrl) => {
19474
- if (baseUrl === null)
19475
- baseUrl = safeWindow.location.href;
19476
- if (isDataUrl(url))
19477
- return false;
19478
- if (isLocalUrl(url))
19479
- return true;
19480
- if (isRelativeUrl(url) && isLocalUrl(baseUrl))
19481
- return true;
19482
- return false;
19483
- };
19484
- var devicePixelRatio2 = () => safeWindow.devicePixelRatio;
19485
- var isJP2Supported = function () {
19486
- if (isFirefox())
19487
- return false;
19488
- return isWebKit();
19489
- };
19490
- var isWebPSupported = () => isChrome();
19491
- var deviceType = () => {
19492
- if (safeNavigator && /tablet|iPad|Nexus 9/i.test(safeNavigator.userAgent))
19493
- return 'tablet';
19494
- if (safeNavigator && /mobi/i.test(safeNavigator.userAgent))
19495
- return 'phone';
19496
- return 'desktop';
19497
- };
19498
- var deviceOS = () => {
19499
- if (isMacOS())
19500
- return 'macos';
19501
- if (isIOS())
19502
- return 'ios';
19503
- if (isAndroid())
19504
- return 'android';
19505
- if (isWindows())
19506
- return 'windows';
19507
- };
19508
- var deviceFont = (os) => {
19509
- if (!os) {
19510
- os = deviceOS();
19511
- }
19512
- const fonts = {
19513
- apple: '-apple-system, BlinkMacSystemFont, SF Pro Text, SF UI Text, Helvetica Neue',
19514
- google: 'Roboto, Helvetica Neue',
19515
- microsoft: 'Segoe UI, Helvetica Neue',
19516
- };
19517
- if (os === 'macos')
19518
- return fonts.apple;
19519
- if (os === 'ios')
19520
- return fonts.apple;
19521
- if (os === 'android')
19522
- return fonts.google;
19523
- if (os === 'windows')
19524
- return fonts.microsoft;
19525
- return fonts.apple;
19526
- };
19527
- var environment = {
19528
- isWebKit,
19529
- webkitVersion,
19530
- isChrome,
19531
- isSafari,
19532
- isFirefox,
19533
- isFramerX,
19534
- isEdge,
19535
- isAndroid,
19536
- isIOS,
19537
- isMacOS,
19538
- isWindows,
19539
- isTouch,
19540
- isDesktop,
19541
- isPhone,
19542
- isTablet,
19543
- isMobile,
19544
- isFileUrl,
19545
- isDataUrl,
19546
- isRelativeUrl,
19547
- isLocalServerUrl,
19548
- isLocalUrl,
19549
- isLocalAssetUrl,
19550
- devicePixelRatio: devicePixelRatio2,
19551
- isJP2Supported,
19552
- isWebPSupported,
19553
- deviceType,
19554
- deviceOS,
19555
- deviceFont,
19556
- safariVersion,
19557
- };
19558
19720
  var mockWithWarning = (message) => {
19559
19721
  return () => {
19560
19722
  warnOnce2(message);
@@ -19688,39 +19850,12 @@ function getImageStyle(image, containerSize) {
19688
19850
  function StaticImage({ image, containerSize, nodeId, alt, }) {
19689
19851
  const source = runtime.useImageSource(image, containerSize, nodeId);
19690
19852
  const imageStyle = getImageStyle(image, containerSize);
19691
- const [measuredSizes, setMeasuredSizes,] = React4.useState();
19692
19853
  const imageRef = React4.useRef(null);
19693
- const libraryFeatures = useLibraryFeatures();
19694
- React4.useEffect(() => {
19695
- if (!libraryFeatures.imgSizesWorkaroundEnabled)
19696
- return;
19697
- const imageElement = imageRef.current;
19698
- if (!imageElement)
19699
- return;
19700
- if (isTest())
19701
- return;
19702
- if (!image.sizes)
19703
- return;
19704
- const smartComponentParent = imageElement.closest('[data-framer-name]');
19705
- if (!smartComponentParent)
19706
- return;
19707
- const imageNodeWidth = imageElement.clientWidth;
19708
- const currentSizes = Number(image.sizes.replace('px', ''));
19709
- if (
19710
- // If we successfully parsed `sizes`, and...
19711
- !isNaN(currentSizes) &&
19712
- // ...if the image node is smaller than the currently set `sizes`
19713
- // attribute,..
19714
- imageNodeWidth < currentSizes) {
19715
- return;
19716
- }
19717
- setMeasuredSizes(imageNodeWidth + 'px');
19718
- }, [image.sizes,]);
19719
19854
  return /* @__PURE__ */ jsx('img', {
19720
19855
  ref: imageRef,
19721
19856
  decoding: 'async',
19722
19857
  loading: image.loading,
19723
- sizes: measuredSizes !== null && measuredSizes !== void 0 ? measuredSizes : image.sizes,
19858
+ sizes: image.sizes,
19724
19859
  srcSet: image.srcSet,
19725
19860
  src: source,
19726
19861
  alt: alt !== null && alt !== void 0 ? alt : image.alt,
@@ -19911,6 +20046,142 @@ function Border(props) {
19911
20046
  function htmlElementAsMotionComponent(asElem) {
19912
20047
  return asElem && asElem !== 'search' && asElem !== 'slot' && asElem !== 'template' ? motion[asElem] : motion['div'];
19913
20048
  }
20049
+ var import_process = __toESM(require_browser(), 1);
20050
+ var safeNavigator = typeof navigator !== 'undefined' ? navigator : void 0;
20051
+ var isBrowser2 = () => typeof document === 'object';
20052
+ var isWebKit = () => {
20053
+ var _a;
20054
+ return ((_a = safeNavigator) == null ? void 0 : _a.userAgent.includes('AppleWebKit/')) && !isChrome() && !isEdge();
20055
+ };
20056
+ var webkitVersion = () => {
20057
+ let version2 = -1;
20058
+ const regexp = /AppleWebKit\/([\d.]+)/;
20059
+ const result = safeNavigator && regexp.exec(safeNavigator.userAgent);
20060
+ if (result && result[1]) {
20061
+ version2 = parseFloat(result[1]);
20062
+ }
20063
+ return version2;
20064
+ };
20065
+ var safariVersion = () => {
20066
+ let version2 = -1;
20067
+ const regexp = /Version\/([\d.]+)/;
20068
+ const result = safeNavigator && regexp.exec(safeNavigator.userAgent);
20069
+ if (result && result[1]) {
20070
+ version2 = parseFloat(result[1]);
20071
+ }
20072
+ return version2;
20073
+ };
20074
+ var isChrome = () => safeNavigator && /Chrome/.test(safeNavigator.userAgent) && /Google Inc/.test(safeNavigator.vendor) && !isEdge();
20075
+ var isSafari = () => safeNavigator && /Safari/.test(safeNavigator.userAgent) && /Apple Computer/.test(safeNavigator.vendor);
20076
+ var isFirefox = () => safeNavigator && /Firefox\/\d+\.\d+$/.test(safeNavigator.userAgent);
20077
+ var isFramerX = () => safeNavigator && /FramerX/.test(safeNavigator.userAgent);
20078
+ var isEdge = () => safeNavigator && /Edg\//.test(safeNavigator.userAgent);
20079
+ var isAndroid = () => safeNavigator && /android/i.test(safeNavigator.userAgent);
20080
+ var isIOS = () => safeNavigator && /iPhone|iPod|iPad/i.test(safeNavigator.platform);
20081
+ var isMacOS = () => safeNavigator && /Mac/.test(safeNavigator.platform);
20082
+ var isWindows = () => safeNavigator && /Win/.test(safeNavigator.platform);
20083
+ var isTouch = () => safeWindow.ontouchstart === null && safeWindow.ontouchmove === null && safeWindow.ontouchend === null;
20084
+ var isDesktop = () => deviceType() === 'desktop';
20085
+ var isPhone = () => deviceType() === 'phone';
20086
+ var isTablet = () => deviceType() === 'tablet';
20087
+ var isMobile = () => isPhone() || isTablet();
20088
+ var isFileUrl = (url) => url.startsWith('file://');
20089
+ var isDataUrl = (url) => url.startsWith('data:');
20090
+ var isTest = () => import_process.default.env.NODE_ENV === 'test';
20091
+ var isRelativeUrl = (url) => !/^[a-z]{1,8}:\/\/.*$/i.test(url);
20092
+ var isLocalServerUrl = (url) => /[a-z]{1,8}:\/\/127\.0\.0\.1/i.test(url) || /[a-zA-Z]{1,8}:\/\/localhost/.test(url);
20093
+ var isLocalUrl = (url) => {
20094
+ if (isFileUrl(url))
20095
+ return true;
20096
+ if (isLocalServerUrl(url))
20097
+ return true;
20098
+ return false;
20099
+ };
20100
+ var isLocalAssetUrl = (url, baseUrl) => {
20101
+ if (baseUrl === null)
20102
+ baseUrl = safeWindow.location.href;
20103
+ if (isDataUrl(url))
20104
+ return false;
20105
+ if (isLocalUrl(url))
20106
+ return true;
20107
+ if (isRelativeUrl(url) && isLocalUrl(baseUrl))
20108
+ return true;
20109
+ return false;
20110
+ };
20111
+ var devicePixelRatio2 = () => safeWindow.devicePixelRatio;
20112
+ var isJP2Supported = function () {
20113
+ if (isFirefox())
20114
+ return false;
20115
+ return isWebKit();
20116
+ };
20117
+ var isWebPSupported = () => isChrome();
20118
+ var deviceType = () => {
20119
+ if (safeNavigator && /tablet|iPad|Nexus 9/i.test(safeNavigator.userAgent))
20120
+ return 'tablet';
20121
+ if (safeNavigator && /mobi/i.test(safeNavigator.userAgent))
20122
+ return 'phone';
20123
+ return 'desktop';
20124
+ };
20125
+ var deviceOS = () => {
20126
+ if (isMacOS())
20127
+ return 'macos';
20128
+ if (isIOS())
20129
+ return 'ios';
20130
+ if (isAndroid())
20131
+ return 'android';
20132
+ if (isWindows())
20133
+ return 'windows';
20134
+ };
20135
+ var deviceFont = (os) => {
20136
+ if (!os) {
20137
+ os = deviceOS();
20138
+ }
20139
+ const fonts = {
20140
+ apple: '-apple-system, BlinkMacSystemFont, SF Pro Text, SF UI Text, Helvetica Neue',
20141
+ google: 'Roboto, Helvetica Neue',
20142
+ microsoft: 'Segoe UI, Helvetica Neue',
20143
+ };
20144
+ if (os === 'macos')
20145
+ return fonts.apple;
20146
+ if (os === 'ios')
20147
+ return fonts.apple;
20148
+ if (os === 'android')
20149
+ return fonts.google;
20150
+ if (os === 'windows')
20151
+ return fonts.microsoft;
20152
+ return fonts.apple;
20153
+ };
20154
+ var environment = {
20155
+ isWebKit,
20156
+ webkitVersion,
20157
+ isChrome,
20158
+ isSafari,
20159
+ isFirefox,
20160
+ isFramerX,
20161
+ isEdge,
20162
+ isAndroid,
20163
+ isIOS,
20164
+ isMacOS,
20165
+ isWindows,
20166
+ isTouch,
20167
+ isDesktop,
20168
+ isPhone,
20169
+ isTablet,
20170
+ isMobile,
20171
+ isFileUrl,
20172
+ isDataUrl,
20173
+ isRelativeUrl,
20174
+ isLocalServerUrl,
20175
+ isLocalUrl,
20176
+ isLocalAssetUrl,
20177
+ devicePixelRatio: devicePixelRatio2,
20178
+ isJP2Supported,
20179
+ isWebPSupported,
20180
+ deviceType,
20181
+ deviceOS,
20182
+ deviceFont,
20183
+ safariVersion,
20184
+ };
19914
20185
  var isChrome2 = /* @__PURE__ */ isChrome();
19915
20186
  function layoutHintDataPropsForCenter(center) {
19916
20187
  const props = {};
@@ -29303,6 +29574,9 @@ var LazyValue = class {
29303
29574
  };
29304
29575
  return promise;
29305
29576
  }
29577
+ waitFor() {
29578
+ return this.resolver();
29579
+ }
29306
29580
  /** Synchronously read the value after calling preload() before. */
29307
29581
  read() {
29308
29582
  const status = this.status;
@@ -29321,6 +29595,12 @@ var LazyValue = class {
29321
29595
  }
29322
29596
  }
29323
29597
  };
29598
+ var LibraryFeaturesContext = /* @__PURE__ */ React4.createContext(void 0);
29599
+ var LibraryFeaturesProvider = /* @__PURE__ */ (() => LibraryFeaturesContext.Provider)();
29600
+ var useLibraryFeatures = () => {
29601
+ const context = React4.useContext(LibraryFeaturesContext);
29602
+ return context !== null && context !== void 0 ? context : {};
29603
+ };
29324
29604
  function findAnchorElement(target, withinElement) {
29325
29605
  if (target instanceof HTMLAnchorElement) {
29326
29606
  return target;
@@ -29661,7 +29941,7 @@ function createOnClickLinkHandler(router, routeId, elementId, combinedPathVariab
29661
29941
  event.preventDefault();
29662
29942
  const route = (_a = router.getRoute) == null ? void 0 : _a.call(router, routeId);
29663
29943
  if (route && isLazyComponentType(route == null ? void 0 : route.page)) {
29664
- yield route.page.preload();
29944
+ void route.page.preload();
29665
29945
  }
29666
29946
  (_b = router.navigate) == null ? void 0 : _b.call(router, routeId, elementId, combinedPathVariables, smoothScroll);
29667
29947
  });
@@ -30103,7 +30383,300 @@ function responseHasError(response) {
30103
30383
  return typeof response === 'object' && response !== null && 'error' in response && isObject2(response.error) &&
30104
30384
  'message' in response.error && typeof response.error.message === 'string';
30105
30385
  }
30106
- function PageRoot({ RootComponent, isWebsite, routeId, framerSiteId, pathVariables, routes, collectionUtils, notFoundPage, isReducedMotion = false, includeDataObserver = false, localeId, locales, preserveQueryParams, enableImproveInpDuringHydration, addHydrationMarkers = false, }) {
30386
+ var loadingFetchResult = {
30387
+ status: 'loading',
30388
+ data: void 0,
30389
+ };
30390
+ function isValidURL2(href) {
30391
+ try {
30392
+ const url = new URL(href);
30393
+ return Boolean(url.protocol);
30394
+ }
30395
+ catch (_j) { }
30396
+ }
30397
+ function isCacheExpired(insertionTimestamp, cacheDuration) {
30398
+ const cacheDurationMs = cacheDuration * 1e3;
30399
+ const currentTimestamp = Date.now();
30400
+ const expirationTimestamp = insertionTimestamp + cacheDurationMs;
30401
+ return currentTimestamp >= expirationTimestamp;
30402
+ }
30403
+ var noop22 = () => { };
30404
+ var _responseValues;
30405
+ var _subscribers;
30406
+ var _cacheDurations;
30407
+ var _cachedAt;
30408
+ var _staleQueriesInterval;
30409
+ var _FetchClient = class {
30410
+ constructor() {
30411
+ __privateAdd(this, _responseValues, /* @__PURE__ */ new Map());
30412
+ __privateAdd(this, _subscribers, /* @__PURE__ */ new Map());
30413
+ __privateAdd(this, _cacheDurations, /* @__PURE__ */ new Map());
30414
+ __privateAdd(this, _cachedAt, /* @__PURE__ */ new Map());
30415
+ __privateAdd(this, _staleQueriesInterval, void 0);
30416
+ __publicField(this, 'checkForStaleQueries', () => {
30417
+ const activeURLS = __privateGet(this, _subscribers).keys();
30418
+ for (const url of activeURLS) {
30419
+ const cachedAt = __privateGet(this, _cachedAt).get(url);
30420
+ const cacheDuration = __privateGet(this, _cacheDurations).get(url);
30421
+ if (!cacheDuration || !cachedAt)
30422
+ continue;
30423
+ void this.fetchWithCache(url, cacheDuration);
30424
+ }
30425
+ });
30426
+ __publicField(this, 'persistCache', debounce(() => {
30427
+ const data2 = {};
30428
+ for (const [url, responseValue,] of __privateGet(this, _responseValues)) {
30429
+ if (!responseValue)
30430
+ continue;
30431
+ if (responseValue.status !== 'success')
30432
+ continue;
30433
+ const cacheConfig = __privateGet(this, _cacheDurations).get(url);
30434
+ if (!cacheConfig || cacheConfig === 0)
30435
+ continue;
30436
+ const storedAt = __privateGet(this, _cachedAt).get(url);
30437
+ if (!storedAt)
30438
+ continue;
30439
+ if (storedAt && isCacheExpired(storedAt, cacheConfig)) {
30440
+ continue;
30441
+ }
30442
+ data2[url] = [storedAt, cacheConfig, responseValue.data,];
30443
+ }
30444
+ localStorage.setItem(_FetchClient.cacheKey, JSON.stringify(data2));
30445
+ }, 500));
30446
+ this.hydrateCache();
30447
+ }
30448
+ hydrateCache() {
30449
+ try {
30450
+ const rawData = localStorage.getItem(_FetchClient.cacheKey);
30451
+ if (!rawData)
30452
+ return;
30453
+ const data2 = JSON.parse(rawData);
30454
+ if (typeof data2 !== 'object')
30455
+ throw new Error('Invalid cache data');
30456
+ for (const url in data2) {
30457
+ const cached = data2[url];
30458
+ if (!Array.isArray(cached) || cached.length !== 3)
30459
+ throw new Error('Invalid cache data');
30460
+ const [storedAt, cacheDuration, cachedData,] = cached;
30461
+ if (isCacheExpired(storedAt, cacheDuration))
30462
+ continue;
30463
+ __privateGet(this, _cachedAt).set(url, storedAt);
30464
+ __privateGet(this, _cacheDurations).set(url, cacheDuration);
30465
+ __privateGet(this, _responseValues).set(url, {
30466
+ status: 'success',
30467
+ data: cachedData,
30468
+ });
30469
+ }
30470
+ }
30471
+ catch (error) {
30472
+ localStorage.removeItem(_FetchClient.cacheKey);
30473
+ }
30474
+ }
30475
+ setResponseValue(url, value) {
30476
+ __privateGet(this, _responseValues).set(url, value);
30477
+ this.persistCache();
30478
+ const subscribers = __privateGet(this, _subscribers).get(url);
30479
+ if (!subscribers)
30480
+ return;
30481
+ for (const subscriber of subscribers) {
30482
+ subscriber();
30483
+ }
30484
+ }
30485
+ prefetch(url, cacheDuration) {
30486
+ return __awaiter(this, void 0, void 0, function* () {
30487
+ if (!isValidURL2(url))
30488
+ return;
30489
+ return this.fetchWithCache(url, cacheDuration);
30490
+ });
30491
+ }
30492
+ fetchWithCache(url, cacheDuration) {
30493
+ return __awaiter(this, void 0, void 0, function* () {
30494
+ try {
30495
+ const cachedAt = __privateGet(this, _cachedAt).get(url);
30496
+ const hasExpiredCache = cachedAt && isCacheExpired(cachedAt, cacheDuration);
30497
+ if (__privateGet(this, _responseValues).has(url) && !hasExpiredCache) {
30498
+ return;
30499
+ }
30500
+ const currentValue = __privateGet(this, _responseValues).get(url);
30501
+ if (!currentValue) {
30502
+ this.setResponseValue(url, loadingFetchResult);
30503
+ }
30504
+ const response = yield fetch(url, {
30505
+ method: 'GET',
30506
+ headers: {
30507
+ // Default to JSON always or no?
30508
+ 'Content-Type': 'application/json',
30509
+ },
30510
+ });
30511
+ if (!response.ok) {
30512
+ this.setResponseValue(url, {
30513
+ status: 'error',
30514
+ error: new Error('Invalid Response Status'),
30515
+ data: void 0,
30516
+ });
30517
+ return;
30518
+ }
30519
+ const value = yield response.json();
30520
+ this.setResponseValue(url, {
30521
+ status: 'success',
30522
+ data: value,
30523
+ });
30524
+ __privateGet(this, _cachedAt).set(url, Date.now());
30525
+ }
30526
+ catch (error) {
30527
+ this.setResponseValue(url, {
30528
+ status: 'error',
30529
+ error,
30530
+ data: void 0,
30531
+ });
30532
+ }
30533
+ });
30534
+ }
30535
+ getValue(url) {
30536
+ return __privateGet(this, _responseValues).get(url);
30537
+ }
30538
+ subscribe(url, callback, cacheDuration) {
30539
+ var _j;
30540
+ if (!isValidURL2(url))
30541
+ return noop22;
30542
+ const cacheDurationForUrl = __privateGet(this, _cacheDurations).get(url);
30543
+ if (!cacheDurationForUrl || cacheDuration < cacheDurationForUrl) {
30544
+ __privateGet(this, _cacheDurations).set(url, cacheDuration);
30545
+ }
30546
+ if (!__privateGet(this, _staleQueriesInterval)) {
30547
+ __privateSet(this, _staleQueriesInterval, safeWindow.setInterval(this.checkForStaleQueries, 5e3));
30548
+ }
30549
+ void this.fetchWithCache(url, cacheDuration);
30550
+ const subscribers = (_j = __privateGet(this, _subscribers).get(url)) !== null && _j !== void 0 ? _j : new Set();
30551
+ subscribers.add(callback);
30552
+ __privateGet(this, _subscribers).set(url, subscribers);
30553
+ return () => {
30554
+ const nextSubscribers = __privateGet(this, _subscribers).get(url);
30555
+ if (!nextSubscribers)
30556
+ return;
30557
+ nextSubscribers.delete(callback);
30558
+ if (nextSubscribers.size === 0) {
30559
+ __privateGet(this, _subscribers).delete(url);
30560
+ }
30561
+ if (__privateGet(this, _subscribers).size === 0) {
30562
+ safeWindow.clearInterval(__privateGet(this, _staleQueriesInterval));
30563
+ __privateSet(this, _staleQueriesInterval, void 0);
30564
+ }
30565
+ };
30566
+ }
30567
+ };
30568
+ var FetchClient = _FetchClient;
30569
+ _responseValues = /* @__PURE__ */ new WeakMap();
30570
+ _subscribers = /* @__PURE__ */ new WeakMap();
30571
+ _cacheDurations = /* @__PURE__ */ new WeakMap();
30572
+ _cachedAt = /* @__PURE__ */ new WeakMap();
30573
+ _staleQueriesInterval = /* @__PURE__ */ new WeakMap();
30574
+ __publicField(FetchClient, 'cacheKey', 'framer-fetch-cache');
30575
+ var FetchClientContext = React2.createContext(void 0);
30576
+ var FetchClientProvider = ({ children, }) => {
30577
+ const [client,] = React2.useState(() => new FetchClient());
30578
+ return /* @__PURE__ */ jsx(FetchClientContext.Provider, {
30579
+ value: client,
30580
+ children,
30581
+ });
30582
+ };
30583
+ function difference(array1, array2) {
30584
+ return array1.filter((x) => !array2.includes(x));
30585
+ }
30586
+ var _subscriptions;
30587
+ var _subscribers2;
30588
+ var _cachedResults;
30589
+ var _queryResult;
30590
+ var RequestsObserver = class {
30591
+ constructor(client) {
30592
+ this.client = client;
30593
+ __privateAdd(this, _subscriptions, /* @__PURE__ */ new Map());
30594
+ __privateAdd(this, _subscribers2, /* @__PURE__ */ new Set());
30595
+ __privateAdd(this, _cachedResults, /* @__PURE__ */ new WeakSet());
30596
+ __privateAdd(this, _queryResult, /* @__PURE__ */ new Map());
30597
+ __publicField(this, 'onFetchResultUpdate', () => {
30598
+ const results = /* @__PURE__ */ new Map();
30599
+ let hasChange = false;
30600
+ const subscribedUrls = __privateGet(this, _subscriptions).keys();
30601
+ for (const url of subscribedUrls) {
30602
+ const result = this.client.getValue(url);
30603
+ if (!result)
30604
+ return;
30605
+ results.set(url, result);
30606
+ if (!__privateGet(this, _cachedResults).has(result)) {
30607
+ __privateGet(this, _cachedResults).add(result);
30608
+ hasChange = true;
30609
+ }
30610
+ }
30611
+ if (!hasChange) {
30612
+ return;
30613
+ }
30614
+ __privateSet(this, _queryResult, results);
30615
+ for (const subscriber of __privateGet(this, _subscribers2)) {
30616
+ subscriber();
30617
+ }
30618
+ });
30619
+ __publicField(this, 'subscribe', (callback) => {
30620
+ __privateGet(this, _subscribers2).add(callback);
30621
+ return () => {
30622
+ __privateGet(this, _subscribers2).delete(callback);
30623
+ };
30624
+ });
30625
+ __publicField(this, 'getResults', () => {
30626
+ return __privateGet(this, _queryResult);
30627
+ });
30628
+ }
30629
+ setRequests(requests) {
30630
+ var _j;
30631
+ var _a;
30632
+ const requestsByURL = new Map(requests.map((query) => [query.url, query,]));
30633
+ const nextSubscribedURLs = Array.from(requestsByURL.keys());
30634
+ const hasSubscriptionChange = nextSubscribedURLs.some((url) => !__privateGet(this, _subscriptions).has(url));
30635
+ if (nextSubscribedURLs.length !== __privateGet(this, _subscriptions).size && !hasSubscriptionChange) {
30636
+ return;
30637
+ }
30638
+ const currentSubscribedURLs = Array.from(__privateGet(this, _subscriptions).keys());
30639
+ const unsubscribeURLs = difference(currentSubscribedURLs, nextSubscribedURLs);
30640
+ for (const url of unsubscribeURLs) {
30641
+ (_a = __privateGet(this, _subscriptions).get(url)) == null ? void 0 : _a();
30642
+ __privateGet(this, _subscriptions).delete(url);
30643
+ }
30644
+ const toSubscribeURLs = difference(nextSubscribedURLs, currentSubscribedURLs);
30645
+ for (const url of toSubscribeURLs) {
30646
+ const requestConfig = requestsByURL.get(url);
30647
+ const unsubscribe = this.client.subscribe(url, this.onFetchResultUpdate, (_j = (requestConfig == null ? void 0 : requestConfig.cacheDuration)) !== null && _j !== void 0 ? _j : 0);
30648
+ __privateGet(this, _subscriptions).set(url, unsubscribe);
30649
+ }
30650
+ __privateSet(this, _cachedResults, /* @__PURE__ */ new WeakSet());
30651
+ this.onFetchResultUpdate();
30652
+ }
30653
+ };
30654
+ _subscriptions = /* @__PURE__ */ new WeakMap();
30655
+ _subscribers2 = /* @__PURE__ */ new WeakMap();
30656
+ _cachedResults = /* @__PURE__ */ new WeakMap();
30657
+ _queryResult = /* @__PURE__ */ new WeakMap();
30658
+ function useFetchRequests(requests, disabled) {
30659
+ const fetchClient = React2.useContext(FetchClientContext);
30660
+ if (!fetchClient) {
30661
+ throw new Error('useFetchRequest must be used within a FetchClientProvider');
30662
+ }
30663
+ const [observer2,] = React2.useState(() => new RequestsObserver(fetchClient));
30664
+ React2.useLayoutEffect(() => {
30665
+ if (disabled)
30666
+ return;
30667
+ observer2.setRequests(requests);
30668
+ }, [requests, observer2, disabled,]);
30669
+ return React2.useSyncExternalStore(observer2.subscribe, observer2.getResults, observer2.getResults);
30670
+ }
30671
+ function usePrefetch() {
30672
+ const fetchClient = React2.useContext(FetchClientContext);
30673
+ if (!fetchClient) {
30674
+ throw new Error('useFetchRequest must be used within a FetchClientProvider');
30675
+ }
30676
+ return React2.useCallback((url, cacheDuration) => fetchClient.prefetch(url, cacheDuration), [fetchClient,]);
30677
+ }
30678
+ function PageRoot({ RootComponent, isWebsite, routeId, framerSiteId, pathVariables, routes, collectionUtils, notFoundPage, isReducedMotion = false, includeDataObserver = false, localeId, locales, preserveQueryParams, }) {
30679
+ const { enableAsyncURLUpdates, } = useLibraryFeatures();
30107
30680
  React4.useEffect(() => {
30108
30681
  if (isWebsite)
30109
30682
  return;
@@ -30115,21 +30688,22 @@ function PageRoot({ RootComponent, isWebsite, routeId, framerSiteId, pathVariabl
30115
30688
  children: /* @__PURE__ */ jsx(CustomCursorHost, {
30116
30689
  children: /* @__PURE__ */ jsx(FormContext.Provider, {
30117
30690
  value: framerSiteId,
30118
- children: /* @__PURE__ */ jsx(Router, {
30119
- initialRoute: routeId,
30120
- initialPathVariables: pathVariables,
30121
- initialLocaleId: localeId,
30122
- routes,
30123
- collectionUtils,
30124
- notFoundPage,
30125
- locales,
30126
- defaultPageStyle: {
30127
- minHeight: '100vh',
30128
- width: 'auto',
30129
- },
30130
- preserveQueryParams,
30131
- enableImproveInpDuringHydration,
30132
- addHydrationMarkers,
30691
+ children: /* @__PURE__ */ jsx(FetchClientProvider, {
30692
+ children: /* @__PURE__ */ jsx(Router, {
30693
+ initialRoute: routeId,
30694
+ initialPathVariables: pathVariables,
30695
+ initialLocaleId: localeId,
30696
+ routes,
30697
+ collectionUtils,
30698
+ notFoundPage,
30699
+ locales,
30700
+ defaultPageStyle: {
30701
+ minHeight: '100vh',
30702
+ width: 'auto',
30703
+ },
30704
+ preserveQueryParams,
30705
+ enableAsyncURLUpdates,
30706
+ }),
30133
30707
  }),
30134
30708
  }),
30135
30709
  }),
@@ -30360,6 +30934,84 @@ var ResolveLinks = /* @__PURE__ */ React2.forwardRef(function ResolveLinksInner(
30360
30934
  const childrenWithLinks = children(resolvedLinks);
30361
30935
  return cloneWithPropsAndRef(childrenWithLinks, rest);
30362
30936
  });
30937
+ function isObjectOrArray(value) {
30938
+ return typeof value === 'object' && value !== null;
30939
+ }
30940
+ function getPropertyByPath(input, keyPath) {
30941
+ if (keyPath === '') {
30942
+ return input;
30943
+ }
30944
+ const keyParts = keyPath.split(/[.[\]]+/u).filter((part) => part.length > 0);
30945
+ let current = input;
30946
+ for (const part of keyParts) {
30947
+ if (!isObjectOrArray(current)) {
30948
+ return void 0;
30949
+ }
30950
+ current = current[part];
30951
+ }
30952
+ return current;
30953
+ }
30954
+ function isValidFetchDataValueResult(type, value) {
30955
+ switch (type) {
30956
+ case 'string':
30957
+ return isString22(value) || isNumber2(value);
30958
+ case 'boolean':
30959
+ return isBoolean(value);
30960
+ case 'number':
30961
+ return isNumber2(value);
30962
+ default: {
30963
+ const _ = type;
30964
+ return false;
30965
+ }
30966
+ }
30967
+ }
30968
+ function resolveFetchDataValue(result, request) {
30969
+ if (result.status === 'loading') {
30970
+ return request.fallbackValue;
30971
+ }
30972
+ if (result.status === 'error') {
30973
+ return request.fallbackValue;
30974
+ }
30975
+ const resolvedValue = getPropertyByPath(result.data, request.resultKeyPath);
30976
+ if (!isValidFetchDataValueResult(request.resultOutputType, resolvedValue)) {
30977
+ return request.fallbackValue;
30978
+ }
30979
+ return resolvedValue;
30980
+ }
30981
+ function useFetchDataValues(requests, disabled) {
30982
+ const fetchResults = useFetchRequests(requests, disabled);
30983
+ const data2 = React2.useMemo(() => {
30984
+ return requests.map((request) => {
30985
+ const fetchResult = fetchResults.get(request.url);
30986
+ if (!fetchResult) {
30987
+ return request.fallbackValue;
30988
+ }
30989
+ return resolveFetchDataValue(fetchResult, request);
30990
+ });
30991
+ }, [fetchResults, requests,]);
30992
+ const status = React2.useMemo(() => {
30993
+ const statuses = /* @__PURE__ */ new Set();
30994
+ for (const fetchResult of fetchResults.values()) {
30995
+ statuses.add(fetchResult.status);
30996
+ }
30997
+ if (statuses.has('error'))
30998
+ return 'error';
30999
+ if (statuses.has('loading'))
31000
+ return 'loading';
31001
+ return 'success';
31002
+ }, [fetchResults,]);
31003
+ return {
31004
+ status,
31005
+ data: data2,
31006
+ };
31007
+ }
31008
+ var Fetcher = /* @__PURE__ */ React2.forwardRef(function Fetcher2(_j, ref) {
31009
+ var { requests, disabled, children } = _j, rest = __rest(_j, ["requests", "disabled", "children"]);
31010
+ const cloneWithPropsAndRef = useCloneChildrenWithPropsAndRef(ref);
31011
+ const { data: data2, status, } = useFetchDataValues(requests, disabled);
31012
+ const childrenWithValues = children(data2, status);
31013
+ return cloneWithPropsAndRef(childrenWithValues, rest);
31014
+ });
30363
31015
  var callEach = (...fns) => fns.forEach((fn) => fn && fn());
30364
31016
  var import_archy = __toESM(require_archy(), 1);
30365
31017
  function getLogger(name) {
@@ -30439,7 +31091,7 @@ var CompatibilityDatabaseCollection = class {
30439
31091
  const data2 = {};
30440
31092
  for (const key7 in this.schema) {
30441
31093
  const value = item[key7];
30442
- if (isNullish(value))
31094
+ if (isNullish2(value))
30443
31095
  continue;
30444
31096
  const definition = this.schema[key7];
30445
31097
  if (isUndefined(definition))
@@ -31994,10 +32646,10 @@ var SortItemsPlan = class extends QueryPlan {
31994
32646
  if (DatabaseValue.equal(left, right, collation)) {
31995
32647
  continue;
31996
32648
  }
31997
- if (DatabaseValue.lessThan(left, right, collation) || isNullish(left)) {
32649
+ if (DatabaseValue.lessThan(left, right, collation) || isNullish2(left)) {
31998
32650
  return isAscending ? -1 : 1;
31999
32651
  }
32000
- if (DatabaseValue.greaterThan(left, right, collation) || isNullish(right)) {
32652
+ if (DatabaseValue.greaterThan(left, right, collation) || isNullish2(right)) {
32001
32653
  return isAscending ? 1 : -1;
32002
32654
  }
32003
32655
  throw new Error('Invalid comparison result.');
@@ -32032,14 +32684,14 @@ var SliceItemsPlan = class extends QueryPlan {
32032
32684
  getOffset() {
32033
32685
  var _a;
32034
32686
  const value = (_a = this.offsetExpression) == null ? void 0 : _a.evaluate();
32035
- if (isNullish(value) || value.type !== 'number')
32687
+ if (isNullish2(value) || value.type !== 'number')
32036
32688
  return;
32037
32689
  return value.value;
32038
32690
  }
32039
32691
  getLimit() {
32040
32692
  var _a;
32041
32693
  const value = (_a = this.limitExpression) == null ? void 0 : _a.evaluate();
32042
- if (isNullish(value) || value.type !== 'number')
32694
+ if (isNullish2(value) || value.type !== 'number')
32043
32695
  return;
32044
32696
  return value.value;
32045
32697
  }
@@ -32311,7 +32963,7 @@ function getSelectKey(expression) {
32311
32963
  }
32312
32964
  function resolveValue(richTextResolver, value) {
32313
32965
  return __awaiter(this, void 0, void 0, function* () {
32314
- if (isNullish(value)) {
32966
+ if (isNullish2(value)) {
32315
32967
  return null;
32316
32968
  }
32317
32969
  if (value.type === 'richtext') {
@@ -33148,6 +33800,12 @@ function useQueryCount(query) {
33148
33800
  const collection = useQueryData(countQuery);
33149
33801
  return collection.length;
33150
33802
  }
33803
+ function usePreloadQuery() {
33804
+ const { activeLocale, } = useLocaleInfo();
33805
+ return useCallback((query) => __awaiter(this, void 0, void 0, function* () {
33806
+ return queryCache.get(query, activeLocale).waitFor();
33807
+ }), [activeLocale,]);
33808
+ }
33151
33809
  function getWhereExpressionFromPathVariables(pathVariables) {
33152
33810
  const entries = Object.entries(pathVariables).filter(([, value,]) => {
33153
33811
  if (isUndefined(value))
@@ -33265,8 +33923,10 @@ var VariantSelector = /* @__PURE__ */ ((VariantSelector2) => {
33265
33923
  VariantSelector2['Variant'] = 'v';
33266
33924
  return VariantSelector2;
33267
33925
  })(VariantSelector || {});
33268
- function getGesture(enabledGestures, isHovered, isPressed) {
33269
- const { hover, pressed, } = enabledGestures || {};
33926
+ function getGesture(enabledGestures, isHovered, isPressed, isLoading) {
33927
+ const { hover, pressed, loading, } = enabledGestures || {};
33928
+ if (loading && isLoading)
33929
+ return 'loading';
33270
33930
  if (pressed && isPressed)
33271
33931
  return 'pressed';
33272
33932
  if (hover && isHovered)
@@ -33288,6 +33948,7 @@ function safeBaseVariant(targetVariant, fallbackVariant, validBaseVariants) {
33288
33948
  var CycleVariantState = /* @__PURE__ */ Symbol('cycle');
33289
33949
  function useVariantState({ variant, defaultVariant: externalDefaultVariant, transitions: externalTransitions, enabledGestures: externalEnabledGestures, cycleOrder: externalCycleOrder = [], variantProps: variantProps2 = {}, variantClassNames = {}, }) {
33290
33950
  const forceUpdate = useForceUpdate3();
33951
+ const isCanvas = useIsOnFramerCanvas();
33291
33952
  const validBaseVariants = useConstant2(() => new Set(externalCycleOrder));
33292
33953
  const internalState = React4.useRef({
33293
33954
  isHovered: false,
@@ -33296,6 +33957,7 @@ function useVariantState({ variant, defaultVariant: externalDefaultVariant, tran
33296
33957
  baseVariant: safeBaseVariant(variant, externalDefaultVariant, validBaseVariants),
33297
33958
  lastVariant: variant,
33298
33959
  gestureVariant: void 0,
33960
+ loadedBaseVariant: {},
33299
33961
  // When used in generated components, these are static values defined
33300
33962
  // outside of the component function that also need to not result in
33301
33963
  // memoized values being recalculated, so we dump them into the ref.
@@ -33307,11 +33969,11 @@ function useVariantState({ variant, defaultVariant: externalDefaultVariant, tran
33307
33969
  const resolveNextVariant = React4.useCallback((targetBaseVariant) => {
33308
33970
  const { isHovered: isHovered2, isPressed: isPressed2, enabledGestures: enabledGestures2, defaultVariant: defaultVariant2, } = internalState.current;
33309
33971
  const nextBaseVariant = safeBaseVariant(targetBaseVariant, defaultVariant2, validBaseVariants);
33310
- const gesture = getGesture(enabledGestures2 == null ? void 0 : enabledGestures2[nextBaseVariant], isHovered2, isPressed2);
33972
+ const gesture = getGesture(enabledGestures2 == null ? void 0 : enabledGestures2[nextBaseVariant], isHovered2, isPressed2, false);
33311
33973
  const nextGestureVariant = gesture ? createGestureVariant(nextBaseVariant, gesture) : void 0;
33312
33974
  return [nextBaseVariant, nextGestureVariant,];
33313
33975
  }, [validBaseVariants,]);
33314
- const setGestureState = React4.useCallback(({ isHovered: isHovered2, isPressed: isPressed2, }) => {
33976
+ const setGestureState = React4.useCallback(({ isHovered: isHovered2, isPressed: isPressed2, isLoading, }) => {
33315
33977
  if (isHovered2 !== void 0)
33316
33978
  internalState.current.isHovered = isHovered2;
33317
33979
  if (isPressed2 !== void 0)
@@ -33336,6 +33998,11 @@ function useVariantState({ variant, defaultVariant: externalDefaultVariant, tran
33336
33998
  forceUpdate();
33337
33999
  }
33338
34000
  }, [resolveNextVariant, forceUpdate,]);
34001
+ const clearLoadingGesture = React4.useCallback(() => {
34002
+ const { baseVariant: baseVariant2, } = internalState.current;
34003
+ internalState.current.loadedBaseVariant[baseVariant2] = true;
34004
+ forceUpdate();
34005
+ }, [forceUpdate,]);
33339
34006
  if (variant !== internalState.current.lastVariant) {
33340
34007
  const [nextBase, nextGesture,] = resolveNextVariant(variant);
33341
34008
  internalState.current.lastVariant = nextBase;
@@ -33344,14 +34011,18 @@ function useVariantState({ variant, defaultVariant: externalDefaultVariant, tran
33344
34011
  internalState.current.gestureVariant = nextGesture;
33345
34012
  }
33346
34013
  }
33347
- const { baseVariant, gestureVariant, defaultVariant, enabledGestures, isHovered, isPressed, } = internalState.current;
34014
+ const { baseVariant, gestureVariant, defaultVariant, enabledGestures, isHovered, isPressed, loadedBaseVariant, } = internalState.current;
33348
34015
  const addVariantProps = useAddVariantProps(internalState.current.baseVariant, internalState.current.gestureVariant, variantProps2);
33349
34016
  return React4.useMemo(() => {
34017
+ var _a;
33350
34018
  const variants = [];
33351
34019
  if (baseVariant !== defaultVariant)
33352
34020
  variants.push(baseVariant);
33353
- if (gestureVariant)
33354
- variants.push(gestureVariant);
34021
+ const hasLoadingVariant = (_a = enabledGestures == null ? void 0 : enabledGestures[baseVariant]) == null ? void 0 : _a.loading;
34022
+ const isLoading = !isCanvas && !!hasLoadingVariant && !loadedBaseVariant[baseVariant];
34023
+ const gesture = isLoading ? createGestureVariant(baseVariant, 'loading') : gestureVariant;
34024
+ if (gesture)
34025
+ variants.push(gesture);
33355
34026
  const gestures = enabledGestures == null ? void 0 : enabledGestures[baseVariant];
33356
34027
  const gestureHandlers = {
33357
34028
  onMouseEnter: () => setGestureState({
@@ -33377,24 +34048,28 @@ function useVariantState({ variant, defaultVariant: externalDefaultVariant, tran
33377
34048
  return {
33378
34049
  variants,
33379
34050
  baseVariant,
33380
- gestureVariant,
34051
+ gestureVariant: gesture,
34052
+ isLoading,
33381
34053
  transition: activeTransition(internalState.current.transitions, baseVariant),
33382
34054
  setVariant,
33383
34055
  setGestureState,
34056
+ clearLoadingGesture,
33384
34057
  addVariantProps,
33385
34058
  gestureHandlers,
33386
- classNames: cx(createVariantClassName(baseVariant, variantClassNames), getGesture(gestures, isHovered, isPressed)),
34059
+ classNames: cx(createVariantClassName(baseVariant, variantClassNames), getGesture(gestures, isHovered, isPressed, isLoading)),
33387
34060
  };
33388
34061
  }, [
33389
34062
  baseVariant,
33390
34063
  gestureVariant,
33391
34064
  isHovered,
33392
34065
  isPressed,
34066
+ loadedBaseVariant,
33393
34067
  addVariantProps,
33394
34068
  setVariant,
33395
34069
  defaultVariant,
33396
34070
  enabledGestures,
33397
34071
  setGestureState,
34072
+ clearLoadingGesture,
33398
34073
  variantClassNames,
33399
34074
  ]);
33400
34075
  }
@@ -38272,6 +38947,14 @@ function upgradeComponentFontV1(font) {
38272
38947
  }
38273
38948
  return Object.assign(Object.assign({}, font), { source });
38274
38949
  }
38950
+ function withPerformanceMarks(prefix2, callback) {
38951
+ const markStart = `${prefix2}-start`;
38952
+ performance.mark(markStart);
38953
+ callback();
38954
+ const markEnd = `${prefix2}-end`;
38955
+ performance.mark(markEnd);
38956
+ performance.measure(prefix2, markStart, markEnd);
38957
+ }
38275
38958
  function loadJSON(url) {
38276
38959
  return fetch(url, {
38277
38960
  mode: 'cors',
@@ -38446,7 +39129,7 @@ var package_default = {
38446
39129
  yargs: '^17.6.2',
38447
39130
  },
38448
39131
  peerDependencies: {
38449
- 'framer-motion': '11.2.10',
39132
+ 'framer-motion': '11.2.13',
38450
39133
  react: '^18.2.0',
38451
39134
  'react-dom': '^18.2.0',
38452
39135
  },
@@ -38477,7 +39160,7 @@ MotionValue.prototype.addChild = function ({ transformer = (v) => v, }) {
38477
39160
  if (false) {
38478
39161
  MainLoop.start();
38479
39162
  }
38480
- export { _injectRuntime, AcceleratedAnimation, addActionControls, addFonts, addPointerEvent, addPointerInfo, addPropertyControls, addScaleCorrector, AnchorLinkTarget, Animatable, animate2 as animate, AnimatePresence, AnimateSharedLayout, animateValue, animateVisualElement, animationControls, animations, annotateTypeOnStringify, anticipate, AnyInterpolation, AutomaticLayoutIds, BackgroundImage, backgroundImageFromProps, backIn, backInOut, backOut, BezierAnimator, BoxShadow, buildTransform, calcLength, calculateRect, callEach, cancelFrame, cancelSync, circIn, circInOut, circOut, clamp, collectVisualStyleFromProps, Color, color, ColorFormat, ColorMixModelType, combinedCSSRulesForPreview, complex, ComponentContainerContext, ComponentPresetsConsumer, ComponentPresetsProvider, ComponentViewportProvider, ConstraintMask, constraintsEnabled, ConstraintValues, Container, ControlType, ConvertColor, convertPresentationTree, convertPropsToDeviceOptions, createBox, createData, createDomMotionComponent, createFramerPageLink, createMotionComponent, createScopedAnimate, cssBackgroundSize, cubicBezier, CustomCursorHost, CustomProperties, cx, CycleVariantState, Data, DataContext, DataObserver, DataObserverContext, debounce, defaultDeviceProps, degreesToRadians, delay, DeprecatedComponentContainer, DeprecatedFrameWithEvents, DeprecatedLayoutGroupContext, DeprecatedLayoutGroupContext as LayoutGroupContext, Device, DeviceCodeComponent, devicePresets, DimensionType, disableInstantTransitions, dispatchKeyDownEvent, distance, distance2D, DOM, domAnimation, domMax, DragControls, Draggable, easeIn, easeInOut, easeOut, EmptyState, environment, ErrorPlaceholder, executeInRenderEnvironment, filterProps, finiteNumber, FlatTree, Floating, FontSourceNames, fontStore, forceLayerBackingWithCSSProperties, FormBooleanInput, FormContainer, FormPlainTextInput2 as FormPlainTextInput, FormSelect, fraction, Frame, frame, frameData, frameFromElement, frameFromElements, FramerAnimation, framerAppearAnimationScriptKey, framerAppearEffects, framerAppearIdKey, framerAppearTransformTemplateToken, framerCSSMarker, FramerEvent, FramerEventListener, FramerEventSession, FrameWithMotion, GamepadContext, GeneratedComponentContext, getComponentSize, getDevicePreset, getFonts, getFontsFromComponentPreset, getFontsFromSharedStyle, getMeasurableCodeComponentChildren, getMergedConstraintsProps, getPropertyControls, getWhereExpressionFromPathVariables, gradientForShape, Image2 as Image, imagePatternPropsForFill, imageUrlForAsset, inferInitialRouteFromPath, injectComponentCSSRules, installFlexboxGapWorkaroundIfNeeded, InternalID, interpolate, invariant, inView, isAnimatable2 as isAnimatable, isBrowser, isDesignDefinition, isDragActive, isEqual, isFiniteNumber, isFractionDimension, isFramerGamepadKeydownData, isFramerPageLink, isGapEnabled, isMotionComponent, isMotionValue2 as isMotionValue, isOfAnnotatedType, isOverride, isReactDefinition, isRelativeNumber, isShallowEqualArray, isStraightCurve, isValidMotionProp, Layer, LayoutGroup, LayoutIdContext, lazy, LazyMotion, LazyValue, LibraryFeaturesProvider, Line, LinearGradient, Link, loadFont, loadJSON, localPackageFallbackIdentifier, localShadowFrame, m, MainLoop, makePaddingString, makeUseVisualState, memoize2 as memoize, mirrorEasing, mix, modulate, motion, MotionConfig, MotionConfigContext, MotionContext, MotionGlobalConfig, MotionSetup, MotionValue, motionValue, NavigateTo, NavigationCallbackProvider, NavigationConsumer, NavigationTransitionType, NavigationWrapper as Navigation, NotFoundError, ObservableObject, optimizeAppear, optimizeAppearTransformTemplate, optimizedAppearDataAttribute, paddingFromProps, Page3 as Page, PageEffectsProvider, PageRoot, ParentSizeState, parseFramerPageLink, pathDefaults, PathSegment, PathVariablesContext, pipe, Point, Polygon, PresenceContext, print, progress, PropertyOverrides, PropertyStore, propsForLink, pushLoadMoreHistory, px, QueryEngine, RadialGradient, Rect, removeHiddenBreakpointLayers, removeHiddenBreakpointLayersV2, RenderTarget, Reorder, resolveLink, ResolveLinks, resolveMotionValue, resolvePageScope, reverseEasing, RichText, roundedNumber, roundedNumberString, roundWithOffset, Scroll, scroll, scrollInfo, setGlobalRenderEnvironment, Shadow, sharedSVGManager, shouldOpenLinkInNewTab, Size, spring, SpringAnimator, SSRVariants, Stack, stagger, startAnimation, startOptimizedAppearAnimation, steps, StyleSheetContext, SVG, SwitchLayoutGroupContext, sync, systemFontFamilyName, Text2 as Text, throttle, toFlexDirection, toJustifyOrAlignment, toSVGPath, transform, transformString, transformTemplate, unwrapMotionComponent, useActiveTargetCallback, useActiveVariantCallback, useAddVariantProps, useAnimate, useAnimatedState, useAnimatedState as useDeprecatedAnimatedState, useAnimation, useAnimationControls, useAnimationFrame, useBreakpointVariants, useComponentViewport, useConstant2 as useConstant, useCurrentPathVariables, useCurrentRouteId, useCustomCursors, useCycle, useDataRecord, useDomEvent, useDragControls, useDynamicRefs, useElementScroll, useForceUpdate, useGamepad, useHotkey, useHydratedBreakpointVariants, useInitialRouteComponent, useInstantLayoutTransition, useInstantTransition, useInvertedScale, useInvertedScale as useDeprecatedInvertedScale, useInView, useIsInCurrentNavigationTarget, useIsomorphicLayoutEffect, useIsOnFramerCanvas, useIsPresent, useLoadMorePaginatedQuery, useLocale, useLocaleCode, useLocaleInfo, useLocalizationInfo, useMeasureLayout, useMotionTemplate, useMotionValue, useMotionValueEvent, useNavigate, useNavigation, useObserveData, useOnAppear, useOnCurrentTargetChange, useOnVariantChange, useOverlayState, usePageEffects, usePresence, usePrototypeNavigate, useProvidedWindow, useQueryData, useReducedMotion, useReducedMotionConfig, useRenderEnvironment, useResetProjection, useRoute, useRouteAnchor, useRouteElementId, useRouteHandler, useRouter, useScroll, useSpring, useTime, useTransform, useUnmountEffect, useVariantState, useVelocity, useViewportScroll, useWillChange, ValueInterpolation, valueToDimensionType, VariantSelector, Vector, VectorGroup, version, VisualElement, visualElementStore, warning, WindowContext, withCSS, withFX, withGeneratedLayoutId, withInfiniteScroll, withMappedReactProps, withMeasuredSize, WithNavigator, withOpacity, WithOverride, withParallaxTransform, withPath, withShape, withStyleAppearEffect, withVariantAppearEffect, withVariantFX, wrap, };
39163
+ export { _injectRuntime, AcceleratedAnimation, addActionControls, addFonts, addPointerEvent, addPointerInfo, addPropertyControls, addScaleCorrector, AnchorLinkTarget, Animatable, animate2 as animate, AnimatePresence, AnimateSharedLayout, animateValue, animateVisualElement, animationControls, animations, annotateTypeOnStringify, anticipate, AnyInterpolation, AutomaticLayoutIds, BackgroundImage, backgroundImageFromProps, backIn, backInOut, backOut, BezierAnimator, BoxShadow, buildTransform, calcLength, calculateRect, callEach, cancelFrame, cancelSync, circIn, circInOut, circOut, clamp, collectVisualStyleFromProps, Color, color, ColorFormat, ColorMixModelType, combinedCSSRulesForPreview, complex, ComponentContainerContext, ComponentPresetsConsumer, ComponentPresetsProvider, ComponentViewportProvider, ConstraintMask, constraintsEnabled, ConstraintValues, Container, ControlType, ConvertColor, convertPresentationTree, convertPropsToDeviceOptions, createBox, createData, createDomMotionComponent, createFramerPageLink, createMotionComponent, createScopedAnimate, cssBackgroundSize, cubicBezier, CustomCursorHost, CustomProperties, cx, CycleVariantState, Data, DataContext, DataObserver, DataObserverContext, debounce, defaultDeviceProps, degreesToRadians, delay, DeprecatedComponentContainer, DeprecatedFrameWithEvents, DeprecatedLayoutGroupContext, DeprecatedLayoutGroupContext as LayoutGroupContext, Device, DeviceCodeComponent, devicePresets, DimensionType, disableInstantTransitions, dispatchKeyDownEvent, distance, distance2D, DOM, domAnimation, domMax, DragControls, Draggable, easeIn, easeInOut, easeOut, EmptyState, environment, ErrorPlaceholder, executeInRenderEnvironment, Fetcher, filterProps, finiteNumber, FlatTree, Floating, FontSourceNames, fontStore, forceLayerBackingWithCSSProperties, FormBooleanInput, FormContainer, FormPlainTextInput2 as FormPlainTextInput, FormSelect, fraction, Frame, frame, frameData, frameFromElement, frameFromElements, FramerAnimation, framerAppearAnimationScriptKey, framerAppearEffects, framerAppearIdKey, framerAppearTransformTemplateToken, framerCSSMarker, FramerEvent, FramerEventListener, FramerEventSession, FrameWithMotion, GamepadContext, GeneratedComponentContext, getComponentSize, getDevicePreset, getFonts, getFontsFromComponentPreset, getFontsFromSharedStyle, getMeasurableCodeComponentChildren, getMergedConstraintsProps, getPropertyControls, getWhereExpressionFromPathVariables, gradientForShape, Image2 as Image, imagePatternPropsForFill, imageUrlForAsset, inferInitialRouteFromPath, injectComponentCSSRules, installFlexboxGapWorkaroundIfNeeded, InternalID, interpolate, invariant, inView, isAnimatable2 as isAnimatable, isBrowser, isDesignDefinition, isDragActive, isEqual, isFiniteNumber, isFractionDimension, isFramerGamepadKeydownData, isFramerPageLink, isGapEnabled, isMotionComponent, isMotionValue2 as isMotionValue, isOfAnnotatedType, isOverride, isReactDefinition, isRelativeNumber, isShallowEqualArray, isStraightCurve, isValidMotionProp, Layer, LayoutGroup, LayoutIdContext, lazy, LazyMotion, LazyValue, LibraryFeaturesProvider, Line, LinearGradient, Link, loadFont, loadJSON, localPackageFallbackIdentifier, localShadowFrame, m, MainLoop, makePaddingString, makeUseVisualState, markHydrationStart, memoize2 as memoize, mirrorEasing, mix, modulate, motion, MotionConfig, MotionConfigContext, MotionContext, MotionGlobalConfig, MotionSetup, MotionValue, motionValue, NavigateTo, NavigationCallbackProvider, NavigationConsumer, NavigationTransitionType, NavigationWrapper as Navigation, NotFoundError, ObservableObject, optimizeAppear, optimizeAppearTransformTemplate, optimizedAppearDataAttribute, paddingFromProps, Page3 as Page, PageEffectsProvider, PageRoot, ParentSizeState, parseFramerPageLink, pathDefaults, PathSegment, PathVariablesContext, pipe, Point, Polygon, PresenceContext, print, progress, PropertyOverrides, PropertyStore, propsForLink, pushLoadMoreHistory, px, QueryEngine, RadialGradient, Rect, removeHiddenBreakpointLayers, removeHiddenBreakpointLayersV2, RenderTarget, Reorder, resolveLink, ResolveLinks, resolveMotionValue, resolvePageScope, reverseEasing, RichText, roundedNumber, roundedNumberString, roundWithOffset, Scroll, scroll, scrollInfo, setGlobalRenderEnvironment, Shadow, sharedSVGManager, shouldOpenLinkInNewTab, Size, spring, SpringAnimator, SSRVariants, Stack, stagger, startAnimation, startOptimizedAppearAnimation, steps, StyleSheetContext, SVG, SwitchLayoutGroupContext, sync, systemFontFamilyName, Text2 as Text, throttle, toFlexDirection, toJustifyOrAlignment, toSVGPath, transform, transformString, transformTemplate, turnOffReactEventHandling, unwrapMotionComponent, useActiveTargetCallback, useActiveVariantCallback, useAddVariantProps, useAnimate, useAnimatedState, useAnimatedState as useDeprecatedAnimatedState, useAnimation, useAnimationControls, useAnimationFrame, useBreakpointVariants, useComponentViewport, useConstant2 as useConstant, useCurrentPathVariables, useCurrentRouteId, useCustomCursors, useCycle, useDataRecord, useDomEvent, useDragControls, useDynamicRefs, useElementScroll, useForceUpdate, useGamepad, useHotkey, useHydratedBreakpointVariants, useInitialRouteComponent, useInstantLayoutTransition, useInstantTransition, useInvertedScale, useInvertedScale as useDeprecatedInvertedScale, useInView, useIsInCurrentNavigationTarget, useIsomorphicLayoutEffect, useIsOnFramerCanvas, useIsPresent, useLoadMorePaginatedQuery, useLocale, useLocaleCode, useLocaleInfo, useLocalizationInfo, useMeasureLayout, useMotionTemplate, useMotionValue, useMotionValueEvent, useNavigate, useNavigation, useObserveData, useOnAppear, useOnCurrentTargetChange, useOnVariantChange, useOverlayState, usePageEffects, usePrefetch, usePreloadQuery, usePresence, usePrototypeNavigate, useProvidedWindow, useQueryData, useReducedMotion, useReducedMotionConfig, useRenderEnvironment, useResetProjection, useRoute, useRouteAnchor, useRouteElementId, useRouteHandler, useRouter, useScroll, useSpring, useTime, useTransform, useUnmountEffect, useVariantState, useVelocity, useViewportScroll, useWillChange, ValueInterpolation, valueToDimensionType, VariantSelector, Vector, VectorGroup, version, VisualElement, visualElementStore, warning, WindowContext, withCSS, withFX, withGeneratedLayoutId, withInfiniteScroll, withMappedReactProps, withMeasuredSize, WithNavigator, withOpacity, WithOverride, withParallaxTransform, withPath, withPerformanceMarks, withShape, withStyleAppearEffect, withVariantAppearEffect, withVariantFX, wrap, };
38481
39164
  /**
38482
39165
  * @license Emotion v11.0.0
38483
39166
  * MIT License