unframer 4.0.3 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +3 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +51 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/framer-chunks/chunk-76VXR6QG.js +91 -0
  10. package/dist/framer-chunks/chunk-OAKBJJLO.js +105 -0
  11. package/dist/framer-chunks/fontshare-LJWOE5KG-36DNQHCT.js +27099 -0
  12. package/dist/framer-chunks/fontshare-LTYJMI6Q-XCFP3GWO.js +119 -0
  13. package/dist/framer-chunks/fontshare-MHXFPDHS-VQYPAYVC.js +825 -0
  14. package/dist/framer-chunks/fontshare-Q7VOJ3QT-LXRXXTSM.js +119 -0
  15. package/dist/framer-chunks/fontshare-X63NXWGB-NRPGYMPJ.js +825 -0
  16. package/dist/framer-chunks/fontshare-XMKN2FOD-D5TWBHNT.js +27099 -0
  17. package/dist/framer-chunks/framer-font-D6RMCRV4-XCFIRDL6.js +7 -0
  18. package/dist/framer-chunks/framer-font-G73BNA7N-B3OPPZB7.js +7 -0
  19. package/dist/framer-chunks/google-AG6EYFMK-QBWWKKVD.js +1612 -0
  20. package/dist/framer-chunks/google-CQFUID6E-C6DG6E7T.js +6792 -0
  21. package/dist/framer-chunks/google-EJBUPU3N-LSIK52DF.js +616382 -0
  22. package/dist/framer-chunks/google-LLNWFNMY-PWPZVCX5.js +6792 -0
  23. package/dist/framer-chunks/google-TRAPONMP-UUEFJ4ZF.js +616382 -0
  24. package/dist/framer-chunks/google-VQ4ZP4WR-C2T2J24Z.js +1612 -0
  25. package/dist/framer.js +827 -582
  26. package/dist/lib/config.d.ts +17 -0
  27. package/dist/lib/config.d.ts.map +1 -0
  28. package/dist/lib/config.js +26 -0
  29. package/dist/lib/config.js.map +1 -0
  30. package/dist/lib/mcp-to-cli.d.ts +25 -0
  31. package/dist/lib/mcp-to-cli.d.ts.map +1 -0
  32. package/dist/lib/mcp-to-cli.js +176 -0
  33. package/dist/lib/mcp-to-cli.js.map +1 -0
  34. package/dist/version.d.ts +1 -1
  35. package/dist/version.js +1 -1
  36. package/package.json +93 -92
  37. package/src/bin.ts +3 -0
  38. package/src/cli.ts +61 -2
  39. package/src/framer.js +827 -582
  40. package/src/lib/config.ts +43 -0
  41. package/src/lib/mcp-to-cli.ts +229 -0
  42. package/src/styles/framer.css +16 -16
  43. package/src/version.ts +1 -1
package/src/framer.js CHANGED
@@ -9,12 +9,11 @@ import {
9
9
  __privateMethod,
10
10
  __privateSet,
11
11
  __publicField,
12
- __require,
13
12
  __runInitializers,
14
13
  __toESM,
15
- } from './framer-chunks/chunk-DBJCHRFG.js';
14
+ } from './framer-chunks/chunk-76VXR6QG.js';
16
15
 
17
- // /:https://app.framerstatic.com/chunk-2J7GL3DQ.mjs
16
+ // /:https://app.framerstatic.com/chunk-G5LRCHUN.mjs
18
17
  import { createContext, } from 'react';
19
18
  import { useEffect, useLayoutEffect, } from 'react';
20
19
  import * as React from 'react';
@@ -29,9 +28,47 @@ import { jsxs, } from 'react/jsx-runtime';
29
28
  import { forwardRef, } from 'react';
30
29
  import { createElement, } from 'react';
31
30
  import { Component as Component2, } from 'react';
32
- var __unframerNavigator = typeof window !== 'undefined' ? navigator : void 0;
31
+ var __unframerWindow = typeof window !== 'undefined' ? window : void 0;
32
+ var __unframerNavigator = typeof __unframerWindow !== 'undefined' ? navigator : void 0;
33
+ var require_memoize_browser_cjs = __commonJS({
34
+ '../../../node_modules/@emotion/memoize/dist/memoize.browser.cjs.js'(exports,) {
35
+ 'use strict';
36
+
37
+ Object.defineProperty(exports, '__esModule', {
38
+ value: true,
39
+ },);
40
+ function memoize3(fn,) {
41
+ var cache2 = {};
42
+ return function (arg,) {
43
+ if (cache2[arg] === void 0) cache2[arg] = fn(arg,);
44
+ return cache2[arg];
45
+ };
46
+ }
47
+ exports.default = memoize3;
48
+ },
49
+ },);
50
+ var require_is_prop_valid_browser_cjs = __commonJS({
51
+ '../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.cjs.js'(exports,) {
52
+ 'use strict';
53
+
54
+ Object.defineProperty(exports, '__esModule', {
55
+ value: true,
56
+ },);
57
+ function _interopDefault(ex,) {
58
+ return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;
59
+ }
60
+ var memoize3 = _interopDefault(require_memoize_browser_cjs(),);
61
+ var reactPropsRegex2 =
62
+ /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/;
63
+ var index = memoize3(function (prop,) {
64
+ return reactPropsRegex2.test(prop,) || prop.charCodeAt(0,) === 111 && prop.charCodeAt(1,) === 110 && prop.charCodeAt(2,) < 91;
65
+ },/* Z+1 */
66
+ );
67
+ exports.default = index;
68
+ },
69
+ },);
33
70
  var LayoutGroupContext = createContext({},);
34
- var isBrowser = typeof window !== 'undefined';
71
+ var isBrowser = typeof __unframerWindow !== 'undefined';
35
72
  var useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;
36
73
  var PresenceContext = /* @__PURE__ */ createContext(null,);
37
74
  function addUniqueItem(arr, item,) {
@@ -1782,7 +1819,7 @@ function measureAllKeyframes() {
1782
1819
  resolversToMeasure.forEach((resolver) => resolver.measureEndState());
1783
1820
  resolversToMeasure.forEach((resolver) => {
1784
1821
  if (resolver.suspendedScrollY !== void 0) {
1785
- window.scrollTo(0, resolver.suspendedScrollY,);
1822
+ __unframerWindow.scrollTo(0, resolver.suspendedScrollY,);
1786
1823
  }
1787
1824
  },);
1788
1825
  }
@@ -1881,7 +1918,7 @@ var isCSSVar = (name) => name.startsWith('--',);
1881
1918
  function setStyle(element, name, value,) {
1882
1919
  isCSSVar(name,) ? element.style.setProperty(name, value,) : element.style[name] = value;
1883
1920
  }
1884
- var supportsScrollTimeline = /* @__PURE__ */ memo(() => window.ScrollTimeline !== void 0);
1921
+ var supportsScrollTimeline = /* @__PURE__ */ memo(() => __unframerWindow.ScrollTimeline !== void 0);
1885
1922
  var supportsFlags = {};
1886
1923
  function memoSupports(callback, supportsFlag,) {
1887
1924
  const memoized = /* @__PURE__ */ memo(callback,);
@@ -2523,7 +2560,7 @@ function getVariableValue(current2, element, depth = 1,) {
2523
2560
  );
2524
2561
  const [token, fallback,] = parseCSSVariable(current2,);
2525
2562
  if (!token) return;
2526
- const resolved = window.getComputedStyle(element,).getPropertyValue(token,);
2563
+ const resolved = __unframerWindow.getComputedStyle(element,).getPropertyValue(token,);
2527
2564
  if (resolved) {
2528
2565
  const trimmed = resolved.trim();
2529
2566
  return isNumericalString(trimmed,) ? parseFloat(trimmed,) : trimmed;
@@ -2751,9 +2788,9 @@ var DOMKeyframesResolver = class extends KeyframeResolver {
2751
2788
  } = this;
2752
2789
  if (!element || !element.current) return;
2753
2790
  if (name === 'height') {
2754
- this.suspendedScrollY = window.pageYOffset;
2791
+ this.suspendedScrollY = __unframerWindow.pageYOffset;
2755
2792
  }
2756
- this.measuredOrigin = positionalValues[name](element.measureViewportBox(), window.getComputedStyle(element.current,),);
2793
+ this.measuredOrigin = positionalValues[name](element.measureViewportBox(), __unframerWindow.getComputedStyle(element.current,),);
2757
2794
  unresolvedKeyframes[0] = this.measuredOrigin;
2758
2795
  const measureKeyframe = unresolvedKeyframes[unresolvedKeyframes.length - 1];
2759
2796
  if (measureKeyframe !== void 0) {
@@ -2773,7 +2810,7 @@ var DOMKeyframesResolver = class extends KeyframeResolver {
2773
2810
  const finalKeyframe = unresolvedKeyframes[finalKeyframeIndex];
2774
2811
  unresolvedKeyframes[finalKeyframeIndex] = positionalValues[name](
2775
2812
  element.measureViewportBox(),
2776
- window.getComputedStyle(element.current,),
2813
+ __unframerWindow.getComputedStyle(element.current,),
2777
2814
  );
2778
2815
  if (finalKeyframe !== null && this.finalKeyframe === void 0) {
2779
2816
  this.finalKeyframe = finalKeyframe;
@@ -3486,8 +3523,8 @@ function press(targetOrSelector, onPressStart, options = {},) {
3486
3523
  isPressing.add(target,);
3487
3524
  const onPressEnd = onPressStart(target, startEvent,);
3488
3525
  const onPointerEnd = (endEvent, success,) => {
3489
- window.removeEventListener('pointerup', onPointerUp,);
3490
- window.removeEventListener('pointercancel', onPointerCancel,);
3526
+ __unframerWindow.removeEventListener('pointerup', onPointerUp,);
3527
+ __unframerWindow.removeEventListener('pointercancel', onPointerCancel,);
3491
3528
  if (isPressing.has(target,)) {
3492
3529
  isPressing.delete(target,);
3493
3530
  }
@@ -3501,16 +3538,19 @@ function press(targetOrSelector, onPressStart, options = {},) {
3501
3538
  }
3502
3539
  };
3503
3540
  const onPointerUp = (upEvent) => {
3504
- onPointerEnd(upEvent, target === window || target === document || options.useGlobalTarget || isNodeOrChild(target, upEvent.target,),);
3541
+ onPointerEnd(
3542
+ upEvent,
3543
+ target === __unframerWindow || target === document || options.useGlobalTarget || isNodeOrChild(target, upEvent.target,),
3544
+ );
3505
3545
  };
3506
3546
  const onPointerCancel = (cancelEvent) => {
3507
3547
  onPointerEnd(cancelEvent, false,);
3508
3548
  };
3509
- window.addEventListener('pointerup', onPointerUp, eventOptions,);
3510
- window.addEventListener('pointercancel', onPointerCancel, eventOptions,);
3549
+ __unframerWindow.addEventListener('pointerup', onPointerUp, eventOptions,);
3550
+ __unframerWindow.addEventListener('pointercancel', onPointerCancel, eventOptions,);
3511
3551
  };
3512
3552
  targets.forEach((target) => {
3513
- const pointerDownTarget = options.useGlobalTarget ? window : target;
3553
+ const pointerDownTarget = options.useGlobalTarget ? __unframerWindow : target;
3514
3554
  pointerDownTarget.addEventListener('pointerdown', startPress, eventOptions,);
3515
3555
  if (isHTMLElement(target,)) {
3516
3556
  target.addEventListener('focus', (event) => enableKeyboardPress(event, eventOptions,),);
@@ -3522,7 +3562,7 @@ function press(targetOrSelector, onPressStart, options = {},) {
3522
3562
  return cancelEvents;
3523
3563
  }
3524
3564
  function getComputedStyle2(element, name,) {
3525
- const computedStyle = window.getComputedStyle(element,);
3565
+ const computedStyle = __unframerWindow.getComputedStyle(element,);
3526
3566
  return isCSSVar(name,) ? computedStyle.getPropertyValue(name,) : computedStyle[name];
3527
3567
  }
3528
3568
  function isSVGElement(element,) {
@@ -3591,15 +3631,15 @@ function createWindowResizeHandler() {
3591
3631
  windowResizeHandler = () => {
3592
3632
  const info = {
3593
3633
  get width() {
3594
- return window.innerWidth;
3634
+ return __unframerWindow.innerWidth;
3595
3635
  },
3596
3636
  get height() {
3597
- return window.innerHeight;
3637
+ return __unframerWindow.innerHeight;
3598
3638
  },
3599
3639
  };
3600
3640
  windowCallbacks.forEach((callback) => callback(info,));
3601
3641
  };
3602
- window.addEventListener('resize', windowResizeHandler,);
3642
+ __unframerWindow.addEventListener('resize', windowResizeHandler,);
3603
3643
  }
3604
3644
  function resizeWindow(callback,) {
3605
3645
  windowCallbacks.add(callback,);
@@ -3607,7 +3647,7 @@ function resizeWindow(callback,) {
3607
3647
  return () => {
3608
3648
  windowCallbacks.delete(callback,);
3609
3649
  if (!windowCallbacks.size && typeof windowResizeHandler === 'function') {
3610
- window.removeEventListener('resize', windowResizeHandler,);
3650
+ __unframerWindow.removeEventListener('resize', windowResizeHandler,);
3611
3651
  windowResizeHandler = void 0;
3612
3652
  }
3613
3653
  };
@@ -4637,7 +4677,7 @@ function loadExternalIsValidProp(isValidProp,) {
4637
4677
  shouldForward = (key7) => key7.startsWith('on',) ? !isValidMotionProp(key7,) : isValidProp(key7,);
4638
4678
  }
4639
4679
  try {
4640
- loadExternalIsValidProp(__require('@emotion/is-prop-valid',).default,);
4680
+ loadExternalIsValidProp(require_is_prop_valid_browser_cjs().default,);
4641
4681
  } catch {}
4642
4682
  function filterProps(props, isDom, forwardMotionProps,) {
4643
4683
  const filteredProps2 = {};
@@ -5268,13 +5308,13 @@ function useVisualElement(Component33, visualState, props, createVisualElement,
5268
5308
  },);
5269
5309
  const optimisedAppearId = props[optimizedAppearDataAttribute];
5270
5310
  const wantsHandoff = useRef(
5271
- Boolean(optimisedAppearId,) && !window.MotionHandoffIsComplete?.(optimisedAppearId,) &&
5272
- window.MotionHasOptimisedAnimation?.(optimisedAppearId,),
5311
+ Boolean(optimisedAppearId,) && !__unframerWindow.MotionHandoffIsComplete?.(optimisedAppearId,) &&
5312
+ __unframerWindow.MotionHasOptimisedAnimation?.(optimisedAppearId,),
5273
5313
  );
5274
5314
  useIsomorphicLayoutEffect(() => {
5275
5315
  if (!visualElement) return;
5276
5316
  isMounted.current = true;
5277
- window.MotionIsMounted = true;
5317
+ __unframerWindow.MotionIsMounted = true;
5278
5318
  visualElement.updateFeatures();
5279
5319
  visualElement.scheduleRenderMicrotask();
5280
5320
  if (wantsHandoff.current && visualElement.animationState) {
@@ -5288,7 +5328,7 @@ function useVisualElement(Component33, visualState, props, createVisualElement,
5288
5328
  }
5289
5329
  if (wantsHandoff.current) {
5290
5330
  queueMicrotask(() => {
5291
- window.MotionHandoffMarkAsComplete?.(optimisedAppearId,);
5331
+ __unframerWindow.MotionHandoffMarkAsComplete?.(optimisedAppearId,);
5292
5332
  },);
5293
5333
  wantsHandoff.current = false;
5294
5334
  }
@@ -5480,8 +5520,8 @@ var hasReducedMotionListener = {
5480
5520
  function initPrefersReducedMotion() {
5481
5521
  hasReducedMotionListener.current = true;
5482
5522
  if (!isBrowser) return;
5483
- if (window.matchMedia) {
5484
- const motionMediaQuery = window.matchMedia('(prefers-reduced-motion)',);
5523
+ if (__unframerWindow.matchMedia) {
5524
+ const motionMediaQuery = __unframerWindow.matchMedia('(prefers-reduced-motion)',);
5485
5525
  const setReducedMotionPreferences = () => prefersReducedMotion.current = motionMediaQuery.matches;
5486
5526
  motionMediaQuery.addEventListener('change', setReducedMotionPreferences,);
5487
5527
  setReducedMotionPreferences();
@@ -5692,8 +5732,8 @@ var VisualElement = class {
5692
5732
  this.scheduleRender();
5693
5733
  },);
5694
5734
  let removeSyncCheck;
5695
- if (window.MotionCheckAppearSync) {
5696
- removeSyncCheck = window.MotionCheckAppearSync(this, key7, value,);
5735
+ if (__unframerWindow.MotionCheckAppearSync) {
5736
+ removeSyncCheck = __unframerWindow.MotionCheckAppearSync(this, key7, value,);
5697
5737
  }
5698
5738
  this.valueSubscriptions.set(key7, () => {
5699
5739
  removeOnChange();
@@ -6119,10 +6159,10 @@ function animateTarget(visualElement, targetAndTransition, {
6119
6159
  continue;
6120
6160
  }
6121
6161
  let isHandoff = false;
6122
- if (window.MotionHandoffAnimation) {
6162
+ if (__unframerWindow.MotionHandoffAnimation) {
6123
6163
  const appearId = getOptimisedAppearId(visualElement,);
6124
6164
  if (appearId) {
6125
- const startTime = window.MotionHandoffAnimation(appearId, key7, frame,);
6165
+ const startTime = __unframerWindow.MotionHandoffAnimation(appearId, key7, frame,);
6126
6166
  if (startTime !== null) {
6127
6167
  valueTransition.startTime = startTime;
6128
6168
  isHandoff = true;
@@ -6866,7 +6906,7 @@ function renderHTML(
6866
6906
  }
6867
6907
  }
6868
6908
  function getComputedStyle3(element,) {
6869
- return window.getComputedStyle(element,);
6909
+ return __unframerWindow.getComputedStyle(element,);
6870
6910
  }
6871
6911
  var HTMLVisualElement = class extends DOMVisualElement {
6872
6912
  constructor() {
@@ -6974,7 +7014,7 @@ var getContextWindow = ({
6974
7014
  var PanSession = class {
6975
7015
  constructor(event, handlers, {
6976
7016
  transformPagePoint,
6977
- contextWindow = window,
7017
+ contextWindow = __unframerWindow,
6978
7018
  dragSnapToOrigin = false,
6979
7019
  distanceThreshold = 3,
6980
7020
  } = {},) {
@@ -6982,7 +7022,7 @@ var PanSession = class {
6982
7022
  this.lastMoveEvent = null;
6983
7023
  this.lastMoveEventInfo = null;
6984
7024
  this.handlers = {};
6985
- this.contextWindow = window;
7025
+ this.contextWindow = __unframerWindow;
6986
7026
  this.updatePoint = () => {
6987
7027
  if (!(this.lastMoveEvent && this.lastMoveEventInfo)) return;
6988
7028
  const info2 = getPanInfo(this.lastMoveEventInfo, this.history,);
@@ -7040,7 +7080,7 @@ var PanSession = class {
7040
7080
  this.handlers = handlers;
7041
7081
  this.transformPagePoint = transformPagePoint;
7042
7082
  this.distanceThreshold = distanceThreshold;
7043
- this.contextWindow = contextWindow || window;
7083
+ this.contextWindow = contextWindow || __unframerWindow;
7044
7084
  const info = extractEventInfo(event,);
7045
7085
  const initialInfo = transformPoint(info, this.transformPagePoint,);
7046
7086
  const {
@@ -7629,7 +7669,7 @@ var VisualElementDragControls = class {
7629
7669
  projection.updateLayout();
7630
7670
  }
7631
7671
  frame.read(measureDragConstraints,);
7632
- const stopResizeListener = addDomEvent(window, 'resize', () => this.scalePositionWithinConstraints(),);
7672
+ const stopResizeListener = addDomEvent(__unframerWindow, 'resize', () => this.scalePositionWithinConstraints(),);
7633
7673
  const stopLayoutUpdateListener = projection.addEventListener('didUpdate', ({
7634
7674
  delta,
7635
7675
  hasLayoutChanged,
@@ -8171,12 +8211,12 @@ function cancelTreeOptimisedTransformAnimations(projectionNode,) {
8171
8211
  } = projectionNode.options;
8172
8212
  if (!visualElement) return;
8173
8213
  const appearId = getOptimisedAppearId(visualElement,);
8174
- if (window.MotionHasOptimisedAnimation(appearId, 'transform',)) {
8214
+ if (__unframerWindow.MotionHasOptimisedAnimation(appearId, 'transform',)) {
8175
8215
  const {
8176
8216
  layout: layout2,
8177
8217
  layoutId,
8178
8218
  } = projectionNode.options;
8179
- window.MotionCancelOptimisedAnimation(appearId, 'transform', frame, !(layout2 || layoutId),);
8219
+ __unframerWindow.MotionCancelOptimisedAnimation(appearId, 'transform', frame, !(layout2 || layoutId),);
8180
8220
  }
8181
8221
  const {
8182
8222
  parent,
@@ -8295,10 +8335,10 @@ function createProjectionNode2({
8295
8335
  let innerWidth = 0;
8296
8336
  const resizeUnblockUpdate = () => this.root.updateBlockedByResize = false;
8297
8337
  frame.read(() => {
8298
- innerWidth = window.innerWidth;
8338
+ innerWidth = __unframerWindow.innerWidth;
8299
8339
  },);
8300
8340
  attachResizeListener(instance, () => {
8301
- const newInnerWidth = window.innerWidth;
8341
+ const newInnerWidth = __unframerWindow.innerWidth;
8302
8342
  if (newInnerWidth === innerWidth) return;
8303
8343
  innerWidth = newInnerWidth;
8304
8344
  this.root.updateBlockedByResize = true;
@@ -8405,7 +8445,7 @@ function createProjectionNode2({
8405
8445
  this.options.onExitComplete && this.options.onExitComplete();
8406
8446
  return;
8407
8447
  }
8408
- if (window.MotionCancelOptimisedAnimation && !this.hasCheckedOptimisedAppear) {
8448
+ if (__unframerWindow.MotionCancelOptimisedAnimation && !this.hasCheckedOptimisedAppear) {
8409
8449
  cancelTreeOptimisedTransformAnimations(this,);
8410
8450
  }
8411
8451
  !this.root.isUpdating && this.root.startUpdate();
@@ -9331,7 +9371,7 @@ var HTMLProjectionNode = createProjectionNode2({
9331
9371
  defaultParent: () => {
9332
9372
  if (!rootProjectionNode.current) {
9333
9373
  const documentNode = new DocumentProjectionNode({},);
9334
- documentNode.mount(window,);
9374
+ documentNode.mount(__unframerWindow,);
9335
9375
  documentNode.setOptions({
9336
9376
  layoutScroll: true,
9337
9377
  },);
@@ -9342,7 +9382,7 @@ var HTMLProjectionNode = createProjectionNode2({
9342
9382
  resetTransform: (instance, value,) => {
9343
9383
  instance.style.transform = value !== void 0 ? value : 'none';
9344
9384
  },
9345
- checkIsScrollRoot: (instance) => Boolean(window.getComputedStyle(instance,).position === 'fixed',),
9385
+ checkIsScrollRoot: (instance) => Boolean(__unframerWindow.getComputedStyle(instance,).position === 'fixed',),
9346
9386
  },);
9347
9387
  var drag = {
9348
9388
  pan: {
@@ -9825,7 +9865,7 @@ function createOnScrollHandler(element, onScroll, info, options = {},) {
9825
9865
  var scrollListeners = /* @__PURE__ */ new WeakMap();
9826
9866
  var resizeListeners = /* @__PURE__ */ new WeakMap();
9827
9867
  var onScrollHandlers = /* @__PURE__ */ new WeakMap();
9828
- var getEventTarget = (element) => element === document.scrollingElement ? window : element;
9868
+ var getEventTarget = (element) => element === document.scrollingElement ? __unframerWindow : element;
9829
9869
  function scrollInfo(onScroll, {
9830
9870
  container = document.scrollingElement,
9831
9871
  ...options
@@ -9854,7 +9894,7 @@ function scrollInfo(onScroll, {
9854
9894
  const listener2 = () => frame.read(measureAll,);
9855
9895
  scrollListeners.set(container, listener2,);
9856
9896
  const target = getEventTarget(container,);
9857
- window.addEventListener('resize', listener2, {
9897
+ __unframerWindow.addEventListener('resize', listener2, {
9858
9898
  passive: true,
9859
9899
  },);
9860
9900
  if (container !== document.documentElement) {
@@ -9878,7 +9918,7 @@ function scrollInfo(onScroll, {
9878
9918
  if (scrollListener) {
9879
9919
  getEventTarget(container,).removeEventListener('scroll', scrollListener,);
9880
9920
  resizeListeners.get(container,)?.();
9881
- window.removeEventListener('resize', scrollListener,);
9921
+ __unframerWindow.removeEventListener('resize', scrollListener,);
9882
9922
  }
9883
9923
  };
9884
9924
  }
@@ -11015,10 +11055,10 @@ function handoffOptimizedAppearAnimation(elementId, valueName, frame2,) {
11015
11055
  startTime,
11016
11056
  } = optimisedAnimation;
11017
11057
  function cancelAnimation() {
11018
- window.MotionCancelOptimisedAnimation?.(elementId, valueName, frame2,);
11058
+ __unframerWindow.MotionCancelOptimisedAnimation?.(elementId, valueName, frame2,);
11019
11059
  }
11020
11060
  animation.onfinish = cancelAnimation;
11021
- if (startTime === null || window.MotionHandoffIsComplete?.(elementId,)) {
11061
+ if (startTime === null || __unframerWindow.MotionHandoffIsComplete?.(elementId,)) {
11022
11062
  cancelAnimation();
11023
11063
  return null;
11024
11064
  } else {
@@ -11036,12 +11076,12 @@ function resumeSuspendedAnimations() {
11036
11076
  suspendedAnimations.clear();
11037
11077
  }
11038
11078
  function startOptimizedAppearAnimation(element, name, keyframes2, options, onReady,) {
11039
- if (window.MotionIsMounted) {
11079
+ if (__unframerWindow.MotionIsMounted) {
11040
11080
  return;
11041
11081
  }
11042
11082
  const id4 = element.dataset[optimizedAppearDataId];
11043
11083
  if (!id4) return;
11044
- window.MotionHandoffAnimation = handoffOptimizedAppearAnimation;
11084
+ __unframerWindow.MotionHandoffAnimation = handoffOptimizedAppearAnimation;
11045
11085
  const storeId = appearStoreId(id4, name,);
11046
11086
  if (!readyAnimation) {
11047
11087
  readyAnimation = startWaapiAnimation(element, name, [keyframes2[0], keyframes2[0],], /**
@@ -11056,8 +11096,8 @@ function startOptimizedAppearAnimation(element, name, keyframes2, options, onRea
11056
11096
  animation: readyAnimation,
11057
11097
  startTime: null,
11058
11098
  },);
11059
- window.MotionHandoffAnimation = handoffOptimizedAppearAnimation;
11060
- window.MotionHasOptimisedAnimation = (elementId, valueName,) => {
11099
+ __unframerWindow.MotionHandoffAnimation = handoffOptimizedAppearAnimation;
11100
+ __unframerWindow.MotionHasOptimisedAnimation = (elementId, valueName,) => {
11061
11101
  if (!elementId) return false;
11062
11102
  if (!valueName) {
11063
11103
  return appearComplete.has(elementId,);
@@ -11065,15 +11105,15 @@ function startOptimizedAppearAnimation(element, name, keyframes2, options, onRea
11065
11105
  const animationId = appearStoreId(elementId, valueName,);
11066
11106
  return Boolean(appearAnimationStore.get(animationId,),);
11067
11107
  };
11068
- window.MotionHandoffMarkAsComplete = (elementId) => {
11108
+ __unframerWindow.MotionHandoffMarkAsComplete = (elementId) => {
11069
11109
  if (appearComplete.has(elementId,)) {
11070
11110
  appearComplete.set(elementId, true,);
11071
11111
  }
11072
11112
  };
11073
- window.MotionHandoffIsComplete = (elementId) => {
11113
+ __unframerWindow.MotionHandoffIsComplete = (elementId) => {
11074
11114
  return appearComplete.get(elementId,) === true;
11075
11115
  };
11076
- window.MotionCancelOptimisedAnimation = (elementId, valueName, frame2, canResume,) => {
11116
+ __unframerWindow.MotionCancelOptimisedAnimation = (elementId, valueName, frame2, canResume,) => {
11077
11117
  const animationId = appearStoreId(elementId, valueName,);
11078
11118
  const data2 = appearAnimationStore.get(animationId,);
11079
11119
  if (!data2) return;
@@ -11092,19 +11132,19 @@ function startOptimizedAppearAnimation(element, name, keyframes2, options, onRea
11092
11132
  } else {
11093
11133
  appearAnimationStore.delete(animationId,);
11094
11134
  if (!appearAnimationStore.size) {
11095
- window.MotionCancelOptimisedAnimation = void 0;
11135
+ __unframerWindow.MotionCancelOptimisedAnimation = void 0;
11096
11136
  }
11097
11137
  }
11098
11138
  };
11099
- window.MotionCheckAppearSync = (visualElement, valueName, value,) => {
11139
+ __unframerWindow.MotionCheckAppearSync = (visualElement, valueName, value,) => {
11100
11140
  const appearId = getOptimisedAppearId(visualElement,);
11101
11141
  if (!appearId) return;
11102
- const valueIsOptimised = window.MotionHasOptimisedAnimation?.(appearId, valueName,);
11142
+ const valueIsOptimised = __unframerWindow.MotionHasOptimisedAnimation?.(appearId, valueName,);
11103
11143
  const externalAnimationValue = visualElement.props.values?.[valueName];
11104
11144
  if (!valueIsOptimised || !externalAnimationValue) return;
11105
11145
  const removeSyncCheck = value.on('change', (latestValue) => {
11106
11146
  if (externalAnimationValue.get() !== latestValue) {
11107
- window.MotionCancelOptimisedAnimation?.(appearId, valueName,);
11147
+ __unframerWindow.MotionCancelOptimisedAnimation?.(appearId, valueName,);
11108
11148
  removeSyncCheck();
11109
11149
  }
11110
11150
  },);
@@ -11342,7 +11382,7 @@ function ReorderItemComponent({
11342
11382
  }
11343
11383
  var ReorderItem = /* @__PURE__ */ forwardRef(ReorderItemComponent,);
11344
11384
 
11345
- // /:https://app.framerstatic.com/framer.HF6P2ATK.mjs
11385
+ // /:https://app.framerstatic.com/framer.UA53KO5V.mjs
11346
11386
 
11347
11387
  import React42 from 'react';
11348
11388
  import { useDeferredValue, useSyncExternalStore, } from 'react';
@@ -11354,7 +11394,8 @@ import { createRef, } from 'react';
11354
11394
  import { useTransition, } from 'react';
11355
11395
  import { createPortal, } from 'react-dom';
11356
11396
  import { cloneElement as cloneElement32, } from 'react';
11357
- var __unframerNavigator2 = typeof window !== 'undefined' ? navigator : void 0;
11397
+ var __unframerWindow2 = typeof window !== 'undefined' ? window : void 0;
11398
+ var __unframerNavigator2 = typeof __unframerWindow2 !== 'undefined' ? navigator : void 0;
11358
11399
  var require_hsluv = __commonJS({
11359
11400
  '../../../node_modules/hsluv/dist/hsluv.cjs'(exports,) {
11360
11401
  'use strict';
@@ -12147,7 +12188,7 @@ var require_fontfaceobserver_standalone = __commonJS({
12147
12188
 
12148
12189
  function D(a, c, b,) {
12149
12190
  c = c || {};
12150
- b = b || window;
12191
+ b = b || __unframerWindow2;
12151
12192
  this.family = a;
12152
12193
  this.style = c.style || 'normal';
12153
12194
  this.weight = c.weight || 'normal';
@@ -12160,8 +12201,8 @@ var require_fontfaceobserver_standalone = __commonJS({
12160
12201
  H = null;
12161
12202
  function I(a,) {
12162
12203
  null === F &&
12163
- (M(a,) && /Apple/.test(window.navigator.vendor,)
12164
- ? (a = /AppleWebKit\/([0-9]+)(?:\.([0-9]+))(?:\.([0-9]+))/.exec(window.navigator.userAgent,),
12204
+ (M(a,) && /Apple/.test(__unframerWindow2.navigator.vendor,)
12205
+ ? (a = /AppleWebKit\/([0-9]+)(?:\.([0-9]+))(?:\.([0-9]+))/.exec(__unframerWindow2.navigator.userAgent,),
12165
12206
  F = !!a && 603 > parseInt(a[1], 10,))
12166
12207
  : F = false);
12167
12208
  return F;
@@ -12215,7 +12256,7 @@ var require_fontfaceobserver_standalone = __commonJS({
12215
12256
  if (d = -1 != k && -1 != l2 || -1 != k && -1 != m2 || -1 != l2 && -1 != m2) {
12216
12257
  (d = k != l2 && k != m2 && l2 != m2) ||
12217
12258
  (null === E &&
12218
- (d = /AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent,),
12259
+ (d = /AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(__unframerWindow2.navigator.userAgent,),
12219
12260
  E = !!d && (536 > parseInt(d[1], 10,) || 536 === parseInt(d[1], 10,) && 11 >= parseInt(d[2], 10,))),
12220
12261
  d = E && (k == y && l2 == y && m2 == y || k == z && l2 == z && m2 == z || k == A && l2 == A && m2 == A)), d = !d;
12221
12262
  }
@@ -12272,7 +12313,7 @@ var require_fontfaceobserver_standalone = __commonJS({
12272
12313
  };
12273
12314
  'object' === typeof module
12274
12315
  ? module.exports = D
12275
- : (window.FontFaceObserver = D, window.FontFaceObserver.prototype.load = D.prototype.load);
12316
+ : (__unframerWindow2.FontFaceObserver = D, __unframerWindow2.FontFaceObserver.prototype.load = D.prototype.load);
12276
12317
  })();
12277
12318
  },
12278
12319
  },);
@@ -12323,15 +12364,15 @@ function isPromise(value,) {
12323
12364
  return value instanceof Promise;
12324
12365
  }
12325
12366
  var noop2 = () => {};
12326
- var isWindow = typeof window !== 'undefined';
12367
+ var isWindow = typeof __unframerWindow2 !== 'undefined';
12327
12368
  var isBot =
12328
12369
  /* @__PURE__ */ (() =>
12329
12370
  isWindow &&
12330
12371
  (__unframerNavigator2.webdriver || /bot|-google|google-|yandex|ia_archiver|crawl|spider/iu.test(__unframerNavigator2.userAgent,)))();
12331
- var supportsRequestIdleCallback = isWindow && typeof window.requestIdleCallback === 'function';
12372
+ var supportsRequestIdleCallback = isWindow && typeof __unframerWindow2.requestIdleCallback === 'function';
12332
12373
  var requestIdleCallback = /* @__PURE__ */ (() =>
12333
12374
  // eslint-disable-next-line compat/compat,framer-studio/tscompat
12334
- supportsRequestIdleCallback ? window.requestIdleCallback : setTimeout)();
12375
+ supportsRequestIdleCallback ? __unframerWindow2.requestIdleCallback : setTimeout)();
12335
12376
  function encodeSVGForCSS(svg,) {
12336
12377
  return `url('data:image/svg+xml,${svg.replaceAll('#', '%23',).replaceAll('\'', '%27',)}')`;
12337
12378
  }
@@ -12659,6 +12700,7 @@ function getRouteElementId(route, hash2,) {
12659
12700
  return void 0;
12660
12701
  }
12661
12702
  var EMPTY_ARRAY = [];
12703
+ var EMPTY_OBJECT = {};
12662
12704
  function monitorINPRelatedInputs(signal,) {
12663
12705
  const inpRelatedInputs = ['pointerdown', 'pointerup', 'keydown', 'keyup',];
12664
12706
  const inpRelatedInputHandler = (event) => {
@@ -12834,11 +12876,15 @@ var DevalueError = class extends Error {
12834
12876
  /**
12835
12877
  * @param {string} message
12836
12878
  * @param {string[]} keys
12879
+ * @param {any} [value] - The value that failed to be serialized
12880
+ * @param {any} [root] - The root value being serialized
12837
12881
  */
12838
- constructor(message, keys3,) {
12882
+ constructor(message, keys3, value, root,) {
12839
12883
  super(message,);
12840
12884
  this.name = 'DevalueError';
12841
12885
  this.path = keys3.join('',);
12886
+ this.value = value;
12887
+ this.root = root;
12842
12888
  }
12843
12889
  };
12844
12890
  function is_primitive(thing,) {
@@ -12987,6 +13033,7 @@ function unflatten(parsed, revivers,) {
12987
13033
  const values = /** @type {any[]} */
12988
13034
  parsed;
12989
13035
  const hydrated = Array(values.length,);
13036
+ let hydrating = null;
12990
13037
  function hydrate(index, standalone = false,) {
12991
13038
  if (index === UNDEFINED) return void 0;
12992
13039
  if (index === NAN) return NaN;
@@ -13003,13 +13050,20 @@ function unflatten(parsed, revivers,) {
13003
13050
  } else if (Array.isArray(value,)) {
13004
13051
  if (typeof value[0] === 'string') {
13005
13052
  const type = value[0];
13006
- const reviver = revivers?.[type];
13053
+ const reviver = revivers && Object.hasOwn(revivers, type,) ? revivers[type] : void 0;
13007
13054
  if (reviver) {
13008
13055
  let i = value[1];
13009
13056
  if (typeof i !== 'number') {
13010
13057
  i = values.push(value[1],) - 1;
13011
13058
  }
13012
- return hydrated[index] = reviver(hydrate(i,),);
13059
+ hydrating ??= /* @__PURE__ */ new Set();
13060
+ if (hydrating.has(i,)) {
13061
+ throw new Error('Invalid circular reference',);
13062
+ }
13063
+ hydrating.add(i,);
13064
+ hydrated[index] = reviver(hydrate(i,),);
13065
+ hydrating.delete(i,);
13066
+ return hydrated[index];
13013
13067
  }
13014
13068
  switch (type) {
13015
13069
  case 'Date':
@@ -13056,13 +13110,20 @@ function unflatten(parsed, revivers,) {
13056
13110
  case 'Float64Array':
13057
13111
  case 'BigInt64Array':
13058
13112
  case 'BigUint64Array': {
13113
+ if (values[value[1]][0] !== 'ArrayBuffer') {
13114
+ throw new Error('Invalid data',);
13115
+ }
13059
13116
  const TypedArrayConstructor = globalThis[type];
13060
- const typedArray = new TypedArrayConstructor(hydrate(value[1],),);
13117
+ const buffer = hydrate(value[1],);
13118
+ const typedArray = new TypedArrayConstructor(buffer,);
13061
13119
  hydrated[index] = value[2] !== void 0 ? typedArray.subarray(value[2], value[3],) : typedArray;
13062
13120
  break;
13063
13121
  }
13064
13122
  case 'ArrayBuffer': {
13065
13123
  const base64 = value[1];
13124
+ if (typeof base64 !== 'string') {
13125
+ throw new Error('Invalid ArrayBuffer encoding',);
13126
+ }
13066
13127
  const arraybuffer = decode64(base64,);
13067
13128
  hydrated[index] = arraybuffer;
13068
13129
  break;
@@ -13152,7 +13213,7 @@ function stringify(value, reducers,) {
13152
13213
  }
13153
13214
  }
13154
13215
  if (typeof thing === 'function') {
13155
- throw new DevalueError(`Cannot stringify a function`, keys3,);
13216
+ throw new DevalueError(`Cannot stringify a function`, keys3, thing, value,);
13156
13217
  }
13157
13218
  let str = '';
13158
13219
  if (is_primitive(thing,)) {
@@ -13255,10 +13316,10 @@ function stringify(value, reducers,) {
13255
13316
  break;
13256
13317
  default:
13257
13318
  if (!is_plain_object(thing,)) {
13258
- throw new DevalueError(`Cannot stringify arbitrary non-POJOs`, keys3,);
13319
+ throw new DevalueError(`Cannot stringify arbitrary non-POJOs`, keys3, thing, value,);
13259
13320
  }
13260
13321
  if (enumerable_symbols(thing,).length > 0) {
13261
- throw new DevalueError(`Cannot stringify POJOs with symbolic keys`, keys3,);
13322
+ throw new DevalueError(`Cannot stringify POJOs with symbolic keys`, keys3, thing, value,);
13262
13323
  }
13263
13324
  if (Object.getPrototypeOf(thing,) === null) {
13264
13325
  str = '["null"';
@@ -13355,7 +13416,7 @@ var mockWindow = {
13355
13416
  open: function (_url, _target, _features,) {},
13356
13417
  __framer_events: [],
13357
13418
  };
13358
- var safeWindow = !isWindow ? mockWindow : window;
13419
+ var safeWindow = !isWindow ? mockWindow : __unframerWindow2;
13359
13420
  var pageviewEventVersion = 2;
13360
13421
  function sendTrackingEvent(eventType, eventData, sendOn = 'lazy',) {
13361
13422
  safeWindow.__framer_events?.push([eventType, eventData, sendOn,],);
@@ -13693,144 +13754,8 @@ function yieldToMain(options,) {
13693
13754
  }
13694
13755
  return schedulerYield(schedulerOptions,);
13695
13756
  }
13696
- var pathVariablesRegExpRaw = ':([a-z]\\w*)';
13697
- var pathVariablesRegExp = /* @__PURE__ */ new RegExp(pathVariablesRegExpRaw, 'gi',);
13698
- async function getLocalesForCurrentRoute(activeLocale, locales, currentRoute, pathVariables, collectionUtils,) {
13699
- if (!currentRoute) return locales;
13700
- const slugByLocaleIfCollectionPage = await getSlugByLocaleIfCollectionPage(
13701
- activeLocale,
13702
- locales,
13703
- currentRoute,
13704
- pathVariables,
13705
- collectionUtils,
13706
- );
13707
- const includedLocalesForCurrentRoute = currentRoute.includedLocales;
13708
- const localesForCurrentRoute = [];
13709
- for (const locale of locales) {
13710
- if (includedLocalesForCurrentRoute) {
13711
- if (!includedLocalesForCurrentRoute.includes(locale.id,)) continue;
13712
- }
13713
- if (slugByLocaleIfCollectionPage) {
13714
- const hasSlug = slugByLocaleIfCollectionPage.has(locale.id,);
13715
- if (!hasSlug) continue;
13716
- }
13717
- localesForCurrentRoute.push(locale,);
13718
- }
13719
- return localesForCurrentRoute;
13720
- }
13721
- async function getSlugByLocaleIfCollectionPage(activeLocale, locales, currentRoute, pathVariables, collectionUtils,) {
13722
- const {
13723
- collectionId,
13724
- } = currentRoute;
13725
- if (!collectionId) return null;
13726
- if (!activeLocale) return null;
13727
- if (!pathVariables) return null;
13728
- const {
13729
- path,
13730
- } = currentRoute;
13731
- if (!path) return null;
13732
- const matches = Array.from(path.matchAll(pathVariablesRegExp,),);
13733
- const lastMatch = matches.pop();
13734
- if (!lastMatch) return null;
13735
- const pathVariableWithDelimiter = lastMatch?.[0];
13736
- const pathVariableValue = lastMatch?.[1];
13737
- if (!pathVariableWithDelimiter || !pathVariableValue) {
13738
- throw new Error('Failed to replace path variables: unexpected regex match group',);
13739
- }
13740
- const currentSlug = pathVariables[pathVariableValue];
13741
- if (!currentSlug || !isString(currentSlug,)) {
13742
- throw new Error(`No slug found for path variable ${pathVariableValue}`,);
13743
- }
13744
- const utils = collectionUtils?.get(collectionId,);
13745
- if (!utils) return null;
13746
- const maybeRecordId = utils.getRecordIdBySlug(currentSlug, activeLocale,);
13747
- const recordId = isPromise(maybeRecordId,) ? await maybeRecordId : maybeRecordId;
13748
- if (!recordId) return null;
13749
- const slugById = /* @__PURE__ */ new Map();
13750
- await Promise.all(locales.map(async (locale) => {
13751
- const maybeSlug = utils.getSlugByRecordId(recordId, locale,);
13752
- const slug = isPromise(maybeSlug,) ? await maybeSlug : maybeSlug;
13753
- if (!slug) return;
13754
- slugById.set(locale.id, slug,);
13755
- },),);
13756
- return slugById;
13757
- }
13758
- var noopAsync = async () => {};
13759
- var defaultLocaleInfo = {
13760
- activeLocale: null,
13761
- locales: [],
13762
- setLocale: noopAsync,
13763
- };
13764
- var LocaleInfoContext = /* @__PURE__ */ (() => {
13765
- const Context2 = React42.createContext(defaultLocaleInfo,);
13766
- Context2.displayName = 'LocaleInfoContext';
13767
- return Context2;
13768
- })();
13769
- function useLocaleInfo() {
13770
- return React42.useContext(LocaleInfoContext,);
13771
- }
13772
- function useLocalesForCurrentRoute() {
13773
- const {
13774
- currentRouteId,
13775
- routes,
13776
- currentPathVariables,
13777
- } = useRouter();
13778
- const {
13779
- activeLocale,
13780
- locales,
13781
- } = useLocaleInfo();
13782
- const [localesForCurrentRoute, setLocalesForCurrentRoute,] = React42.useState(() => activeLocale ? [activeLocale,] : []);
13783
- const currentRoute = currentRouteId ? routes?.[currentRouteId] : void 0;
13784
- const collectionUtils = useCollectionUtils();
13785
- React42.useEffect(() => {
13786
- let active = true;
13787
- getLocalesForCurrentRoute(activeLocale, locales, currentRoute, currentPathVariables, collectionUtils,).then((localesSubset) => {
13788
- if (!active) return;
13789
- React42.startTransition(() => {
13790
- if (localesSubset) {
13791
- setLocalesForCurrentRoute(localesSubset,);
13792
- } else {
13793
- setLocalesForCurrentRoute(activeLocale ? [activeLocale,] : [],);
13794
- }
13795
- },);
13796
- },).catch(() => {},);
13797
- return () => {
13798
- active = false;
13799
- };
13800
- }, [activeLocale, locales, collectionUtils, currentRoute, currentPathVariables,],);
13801
- return localesForCurrentRoute;
13802
- }
13803
- function useLocalizationInfo() {
13804
- const {
13805
- activeLocale,
13806
- locales,
13807
- setLocale,
13808
- } = useLocaleInfo();
13809
- return {
13810
- activeLocalization: activeLocale,
13811
- localizations: locales,
13812
- setLocalization: setLocale,
13813
- };
13814
- }
13815
- function useLocaleCode() {
13816
- return useLocaleInfo().activeLocale?.code ?? 'en-US';
13817
- }
13818
- function useLocale() {
13819
- return useLocaleCode();
13820
- }
13821
- var LayoutDirectionContext = /* @__PURE__ */ (() => {
13822
- const Context2 = React42.createContext('ltr',);
13823
- Context2.displayName = 'LayoutDirectionContext';
13824
- return Context2;
13825
- })();
13826
- function useLayoutDirection() {
13827
- return React42.useContext(LayoutDirectionContext,);
13828
- }
13829
13757
  var shouldPreloadBasedOnUA = !isBot;
13830
13758
  function usePreloadRoute() {
13831
- const {
13832
- activeLocale,
13833
- } = useLocaleInfo();
13834
13759
  const collectionUtils = useCollectionUtils();
13835
13760
  const {
13836
13761
  autobahnNavigation: autobahnNavigationEnabled,
@@ -13838,26 +13763,30 @@ function usePreloadRoute() {
13838
13763
  const {
13839
13764
  getRoute,
13840
13765
  } = useRouter();
13841
- return useCallback2((routeId, pathVariables, yieldBeforePreload = true,) => {
13766
+ return useCallback2((routeId, linkContext, yieldBeforePreload = true,) => {
13842
13767
  if (!routeId || !getRoute) return;
13843
13768
  const route = getRoute(routeId,);
13769
+ const {
13770
+ pathVariables,
13771
+ locale,
13772
+ } = linkContext;
13844
13773
  const context = routeId && autobahnNavigationEnabled
13845
13774
  ? {
13846
13775
  routeId,
13847
13776
  pathVariables,
13848
- locale: activeLocale ?? void 0,
13777
+ locale,
13849
13778
  collectionUtils,
13850
13779
  }
13851
13780
  : void 0;
13852
13781
  return preloadRoute(route, context, yieldBeforePreload,);
13853
- }, [getRoute, activeLocale, collectionUtils, autobahnNavigationEnabled,],);
13782
+ }, [getRoute, collectionUtils, autobahnNavigationEnabled,],);
13854
13783
  }
13855
13784
  function useRoutePreloader(routeIds, enabled = true,) {
13856
13785
  const preload = usePreloadRoute();
13857
13786
  useEffect(() => {
13858
13787
  if (!enabled || !shouldPreloadBasedOnUA) return;
13859
13788
  for (const routeId of routeIds) {
13860
- void preload(routeId,);
13789
+ void preload(routeId, EMPTY_OBJECT,);
13861
13790
  }
13862
13791
  }, [routeIds, enabled, preload,],);
13863
13792
  }
@@ -13888,7 +13817,7 @@ async function preloadRouteData(component, context,) {
13888
13817
  collectionUtils: context.collectionUtils,
13889
13818
  };
13890
13819
  try {
13891
- await loader.load({}, loaderContext,);
13820
+ await loader.load(EMPTY_OBJECT, loaderContext,);
13892
13821
  } catch (e) {
13893
13822
  if (false) console.warn('Route data preload failed', e,);
13894
13823
  }
@@ -14025,6 +13954,8 @@ function normalizeString(path,) {
14025
13954
  return res;
14026
13955
  }
14027
13956
  var customNotFoundPagePaths = /* @__PURE__ */ new Set([`/404.html`, `/404`, `/404/`,],);
13957
+ var pathVariablesRegExpRaw = ':([a-z]\\w*)';
13958
+ var pathVariablesRegExp = /* @__PURE__ */ new RegExp(pathVariablesRegExpRaw, 'gi',);
14028
13959
  function fillPathVariables(path, variables,) {
14029
13960
  return path.replace(pathVariablesRegExp, (match, name,) => {
14030
13961
  const value = variables[name];
@@ -14033,7 +13964,7 @@ function fillPathVariables(path, variables,) {
14033
13964
  },);
14034
13965
  }
14035
13966
  function forwardCurrentQueryParams(href,) {
14036
- const queryParamsString = typeof window !== 'undefined' ? window.location.search : '';
13967
+ const queryParamsString = typeof __unframerWindow2 !== 'undefined' ? __unframerWindow2.location.search : '';
14037
13968
  if (!queryParamsString) {
14038
13969
  return href;
14039
13970
  }
@@ -14170,7 +14101,7 @@ function getSitePrefix(siteCanonicalURL,) {
14170
14101
  } catch {
14171
14102
  return '';
14172
14103
  }
14173
- if (url.pathname === '/' || window.location.origin !== url.origin) return '';
14104
+ if (url.pathname === '/' || __unframerWindow2.location.origin !== url.origin) return '';
14174
14105
  return url.pathname.endsWith('/',) ? url.pathname.slice(0, -1,) : url.pathname;
14175
14106
  }
14176
14107
  var defaultSitePageEffects = {
@@ -14221,7 +14152,7 @@ function calcMaskPosition(mask,) {
14221
14152
  const {
14222
14153
  innerWidth,
14223
14154
  innerHeight,
14224
- } = window;
14155
+ } = __unframerWindow2;
14225
14156
  const [x, xUnit,] = parseUnit(mask.x,);
14226
14157
  const [y, yUnit,] = parseUnit(mask.y,);
14227
14158
  return {
@@ -14271,7 +14202,7 @@ var circle = {
14271
14202
  if (progress2 === 'start') {
14272
14203
  return `clip-path: circle(0 at ${x}px ${y}px);`;
14273
14204
  } else {
14274
- const endRadius = Math.hypot(Math.max(x, window.innerWidth - x,), Math.max(y, window.innerHeight - y,),);
14205
+ const endRadius = Math.hypot(Math.max(x, __unframerWindow2.innerWidth - x,), Math.max(y, __unframerWindow2.innerHeight - y,),);
14275
14206
  return `clip-path: circle(${endRadius}px at ${x}px ${y}px);`;
14276
14207
  }
14277
14208
  },
@@ -14282,8 +14213,8 @@ var inset = {
14282
14213
  x,
14283
14214
  y,
14284
14215
  } = calcMaskPosition(mask,);
14285
- const bottom = window.innerHeight - y;
14286
- const right = window.innerWidth - x;
14216
+ const bottom = __unframerWindow2.innerHeight - y;
14217
+ const right = __unframerWindow2.innerWidth - x;
14287
14218
  return progress2 === 'start'
14288
14219
  ? `clip-path: inset(${y}px ${right}px ${bottom}px ${x}px round ${mask.round}px);`
14289
14220
  : `clip-path: inset(0 round 0);`;
@@ -14718,8 +14649,10 @@ function isHistoryState(data2,) {
14718
14649
  }
14719
14650
  function replaceHistoryState(data2, url, ignoreReplaceStateWrapper = false,) {
14720
14651
  performance.mark('framer-history-replace',);
14721
- const replaceState = ignoreReplaceStateWrapper ? window.history.__proto__.replaceState : window.history.replaceState;
14722
- replaceState.call(window.history, data2, '', url,);
14652
+ const replaceState = ignoreReplaceStateWrapper
14653
+ ? __unframerWindow2.history.__proto__.replaceState
14654
+ : __unframerWindow2.history.replaceState;
14655
+ replaceState.call(__unframerWindow2.history, data2, '', url,);
14723
14656
  }
14724
14657
  var maybeHasPopstateBug = true;
14725
14658
  var isImpactedPopstateBugChromiumVersion = /* @__PURE__ */ (() => {
@@ -14731,9 +14664,9 @@ var isImpactedPopstateBugChromiumVersion = /* @__PURE__ */ (() => {
14731
14664
  })();
14732
14665
  async function pushHistoryState(data2, url, isNavigationTransition = false,) {
14733
14666
  performance.mark('framer-history-push',);
14734
- updateCanonicalURL(url, window.location.href,);
14667
+ updateCanonicalURL(url, __unframerWindow2.location.href,);
14735
14668
  if (!isNavigationTransition) {
14736
- window.history.pushState(data2, '', url,);
14669
+ __unframerWindow2.history.pushState(data2, '', url,);
14737
14670
  return;
14738
14671
  }
14739
14672
  let popstateCalled = false,
@@ -14748,20 +14681,20 @@ async function pushHistoryState(data2, url, isNavigationTransition = false,) {
14748
14681
  message: msg,
14749
14682
  },);
14750
14683
  };
14751
- window.addEventListener('popstate', popstateListener, {
14684
+ __unframerWindow2.addEventListener('popstate', popstateListener, {
14752
14685
  once: true,
14753
14686
  },);
14754
14687
  }
14755
14688
  if (isImpactedPopstateBugChromiumVersion && maybeHasPopstateBug) {
14756
- window.history.__proto__.pushState.call(window.history, data2, '', url,);
14689
+ __unframerWindow2.history.__proto__.pushState.call(__unframerWindow2.history, data2, '', url,);
14757
14690
  } else {
14758
- window.history.pushState(data2, '', url,);
14691
+ __unframerWindow2.history.pushState(data2, '', url,);
14759
14692
  }
14760
14693
  if (maybeHasPopstateBug) {
14761
14694
  queueMicrotask(() => {
14762
14695
  if (popstateCalled) return;
14763
14696
  maybeHasPopstateBug = false;
14764
- window.removeEventListener('popstate', popstateListener,);
14697
+ __unframerWindow2.removeEventListener('popstate', popstateListener,);
14765
14698
  return;
14766
14699
  },);
14767
14700
  }
@@ -14786,7 +14719,7 @@ function useReplaceInitialState({
14786
14719
  );
14787
14720
  }, [],);
14788
14721
  }
14789
- var supportsNavigationAPI = /* @__PURE__ */ (() => isWindow && typeof window.navigation?.back === 'function')();
14722
+ var supportsNavigationAPI = /* @__PURE__ */ (() => isWindow && typeof __unframerWindow2.navigation?.back === 'function')();
14790
14723
  function usePopStateHandler(currentRouteId, setCurrentRouteId,) {
14791
14724
  const startViewTransition2 = useViewTransition();
14792
14725
  const monitorNextPaintAfterRender = useMonitorNextPaintAfterRender('framer-route-change',);
@@ -14794,7 +14727,7 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId,) {
14794
14727
  const popStateHandler = useCallback2(async ({
14795
14728
  state,
14796
14729
  },) => {
14797
- if (window.navigation?.transition && window.navigation?.transition?.navigationType !== 'traverse') return;
14730
+ if (__unframerWindow2.navigation?.transition && __unframerWindow2.navigation?.transition?.navigationType !== 'traverse') return;
14798
14731
  if (!isObject2(state,)) return;
14799
14732
  const {
14800
14733
  routeId,
@@ -14813,7 +14746,7 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId,) {
14813
14746
  routeId,
14814
14747
  isString(localeId,) ? localeId : void 0,
14815
14748
  isString(hash2,) ? hash2 : void 0,
14816
- window.location.pathname + window.location.search + window.location.hash,
14749
+ __unframerWindow2.location.pathname + __unframerWindow2.location.search + __unframerWindow2.location.hash,
14817
14750
  isObject2(pathVariables,) ? pathVariables : void 0,
14818
14751
  true,
14819
14752
  nextRender,
@@ -14821,7 +14754,7 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId,) {
14821
14754
  );
14822
14755
  };
14823
14756
  const viewTransition = await startViewTransition2(currentRouteId.current, routeId, changeRoute,);
14824
- const navigationTransition = window.navigation?.transition;
14757
+ const navigationTransition = __unframerWindow2.navigation?.transition;
14825
14758
  await (viewTransition?.updateCallbackDone ?? Promise.resolve()).then(viewTransitionReady.current?.resolve,).catch(
14826
14759
  viewTransitionReady.current?.reject,
14827
14760
  );
@@ -14832,7 +14765,7 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId,) {
14832
14765
  console.warn('Popstate transition failed', error,);
14833
14766
  }
14834
14767
  announceNavigation();
14835
- updateCanonicalURL(window.location.href,);
14768
+ updateCanonicalURL(__unframerWindow2.location.href,);
14836
14769
  }, [currentRouteId, monitorNextPaintAfterRender, setCurrentRouteId, startViewTransition2,],);
14837
14770
  const traversalHandler = useCallback2((event) => {
14838
14771
  if (event.navigationType !== 'traverse' || !event.canIntercept) return;
@@ -14850,11 +14783,11 @@ function usePopStateHandler(currentRouteId, setCurrentRouteId,) {
14850
14783
  },);
14851
14784
  }, [],);
14852
14785
  useEffect(() => {
14853
- window.addEventListener('popstate', popStateHandler,);
14854
- if (supportsNavigationAPI) window.navigation.addEventListener('navigate', traversalHandler,);
14786
+ __unframerWindow2.addEventListener('popstate', popStateHandler,);
14787
+ if (supportsNavigationAPI) __unframerWindow2.navigation.addEventListener('navigate', traversalHandler,);
14855
14788
  return () => {
14856
- window.removeEventListener('popstate', popStateHandler,);
14857
- if (supportsNavigationAPI) window.navigation.removeEventListener('navigate', traversalHandler,);
14789
+ __unframerWindow2.removeEventListener('popstate', popStateHandler,);
14790
+ if (supportsNavigationAPI) __unframerWindow2.navigation.removeEventListener('navigate', traversalHandler,);
14858
14791
  };
14859
14792
  }, [popStateHandler, traversalHandler,],);
14860
14793
  }
@@ -14894,9 +14827,9 @@ function getPathForRoute(route, {
14894
14827
  }
14895
14828
  const isSamePageHashNavigation = currentPath === path && resolvedHash;
14896
14829
  if (relative2) {
14897
- if (customNotFoundPagePaths.has(currentPath,) && typeof window !== 'undefined') {
14830
+ if (customNotFoundPagePaths.has(currentPath,) && typeof __unframerWindow2 !== 'undefined') {
14898
14831
  const sitePrefix = getSitePrefix(siteCanonicalURL,);
14899
- path = computeRelativePath(window.location.pathname, sitePrefix + path,);
14832
+ path = computeRelativePath(__unframerWindow2.location.pathname, sitePrefix + path,);
14900
14833
  } else {
14901
14834
  path = computeRelativePath(currentPath, path,);
14902
14835
  }
@@ -14920,7 +14853,7 @@ async function handleRedirectForMissingSlugs(route, pathVariables, nextLocale,)
14920
14853
  },);
14921
14854
  const isRedirect = response.type === 'opaqueredirect';
14922
14855
  if (isRedirect) {
14923
- window.location.href = window.location.origin + nextLocaleWithDefaultSlugPath;
14856
+ __unframerWindow2.location.href = __unframerWindow2.location.origin + nextLocaleWithDefaultSlugPath;
14924
14857
  return true;
14925
14858
  }
14926
14859
  return false;
@@ -14953,7 +14886,7 @@ async function switchLocale(options,) {
14953
14886
  }
14954
14887
  function pushLoadMoreHistory(hash2, paginationInfo,) {
14955
14888
  try {
14956
- const currentHistoryState = window.history.state;
14889
+ const currentHistoryState = __unframerWindow2.history.state;
14957
14890
  if (!isHistoryState(currentHistoryState,)) return;
14958
14891
  const isInitialLoad = currentHistoryState?.paginationInfo === void 0 || currentHistoryState.paginationInfo[hash2] === void 0;
14959
14892
  const newPaginationInfo = {
@@ -14990,10 +14923,10 @@ function useNativeLoadingSpinner() {
14990
14923
  }
14991
14924
  navigationPromise.current = promise;
14992
14925
  navigationController.current = controller;
14993
- window.navigation.addEventListener('navigate', navigateListener,);
14926
+ __unframerWindow2.navigation.addEventListener('navigate', navigateListener,);
14994
14927
  void updateURL(true,);
14995
14928
  void promise.finally(() => {
14996
- window.navigation.removeEventListener('navigate', navigateListener,);
14929
+ __unframerWindow2.navigation.removeEventListener('navigate', navigateListener,);
14997
14930
  },);
14998
14931
  }, [navigateListener,],);
14999
14932
  }
@@ -15054,6 +14987,137 @@ function useMemoOne(factory, inputs,) {
15054
14987
  }, [cache2,],);
15055
14988
  return cache2.result;
15056
14989
  }
14990
+ async function getLocalesForCurrentRoute(activeLocale, locales, currentRoute, pathVariables, collectionUtils,) {
14991
+ if (!currentRoute) return locales;
14992
+ const slugByLocaleIfCollectionPage = await getSlugByLocaleIfCollectionPage(
14993
+ activeLocale,
14994
+ locales,
14995
+ currentRoute,
14996
+ pathVariables,
14997
+ collectionUtils,
14998
+ );
14999
+ const includedLocalesForCurrentRoute = currentRoute.includedLocales;
15000
+ const localesForCurrentRoute = [];
15001
+ for (const locale of locales) {
15002
+ if (includedLocalesForCurrentRoute) {
15003
+ if (!includedLocalesForCurrentRoute.includes(locale.id,)) continue;
15004
+ }
15005
+ if (slugByLocaleIfCollectionPage) {
15006
+ const hasSlug = slugByLocaleIfCollectionPage.has(locale.id,);
15007
+ if (!hasSlug) continue;
15008
+ }
15009
+ localesForCurrentRoute.push(locale,);
15010
+ }
15011
+ return localesForCurrentRoute;
15012
+ }
15013
+ async function getSlugByLocaleIfCollectionPage(activeLocale, locales, currentRoute, pathVariables, collectionUtils,) {
15014
+ const {
15015
+ collectionId,
15016
+ } = currentRoute;
15017
+ if (!collectionId) return null;
15018
+ if (!activeLocale) return null;
15019
+ if (!pathVariables) return null;
15020
+ const {
15021
+ path,
15022
+ } = currentRoute;
15023
+ if (!path) return null;
15024
+ const matches = Array.from(path.matchAll(pathVariablesRegExp,),);
15025
+ const lastMatch = matches.pop();
15026
+ if (!lastMatch) return null;
15027
+ const pathVariableWithDelimiter = lastMatch?.[0];
15028
+ const pathVariableValue = lastMatch?.[1];
15029
+ if (!pathVariableWithDelimiter || !pathVariableValue) {
15030
+ throw new Error('Failed to replace path variables: unexpected regex match group',);
15031
+ }
15032
+ const currentSlug = pathVariables[pathVariableValue];
15033
+ if (!currentSlug || !isString(currentSlug,)) {
15034
+ throw new Error(`No slug found for path variable ${pathVariableValue}`,);
15035
+ }
15036
+ const utils = collectionUtils?.get(collectionId,);
15037
+ if (!utils) return null;
15038
+ const maybeRecordId = utils.getRecordIdBySlug(currentSlug, activeLocale,);
15039
+ const recordId = isPromise(maybeRecordId,) ? await maybeRecordId : maybeRecordId;
15040
+ if (!recordId) return null;
15041
+ const slugById = /* @__PURE__ */ new Map();
15042
+ await Promise.all(locales.map(async (locale) => {
15043
+ const maybeSlug = utils.getSlugByRecordId(recordId, locale,);
15044
+ const slug = isPromise(maybeSlug,) ? await maybeSlug : maybeSlug;
15045
+ if (!slug) return;
15046
+ slugById.set(locale.id, slug,);
15047
+ },),);
15048
+ return slugById;
15049
+ }
15050
+ var noopAsync = async () => {};
15051
+ var defaultLocaleInfo = {
15052
+ activeLocale: null,
15053
+ locales: [],
15054
+ setLocale: noopAsync,
15055
+ };
15056
+ var LocaleInfoContext = /* @__PURE__ */ (() => {
15057
+ const Context2 = React42.createContext(defaultLocaleInfo,);
15058
+ Context2.displayName = 'LocaleInfoContext';
15059
+ return Context2;
15060
+ })();
15061
+ function useLocaleInfo() {
15062
+ return React42.useContext(LocaleInfoContext,);
15063
+ }
15064
+ function useLocalesForCurrentRoute() {
15065
+ const {
15066
+ currentRouteId,
15067
+ routes,
15068
+ currentPathVariables,
15069
+ } = useRouter();
15070
+ const {
15071
+ activeLocale,
15072
+ locales,
15073
+ } = useLocaleInfo();
15074
+ const [localesForCurrentRoute, setLocalesForCurrentRoute,] = React42.useState(() => activeLocale ? [activeLocale,] : []);
15075
+ const currentRoute = currentRouteId ? routes?.[currentRouteId] : void 0;
15076
+ const collectionUtils = useCollectionUtils();
15077
+ React42.useEffect(() => {
15078
+ let active = true;
15079
+ getLocalesForCurrentRoute(activeLocale, locales, currentRoute, currentPathVariables, collectionUtils,).then((localesSubset) => {
15080
+ if (!active) return;
15081
+ React42.startTransition(() => {
15082
+ if (localesSubset) {
15083
+ setLocalesForCurrentRoute(localesSubset,);
15084
+ } else {
15085
+ setLocalesForCurrentRoute(activeLocale ? [activeLocale,] : [],);
15086
+ }
15087
+ },);
15088
+ },).catch(() => {},);
15089
+ return () => {
15090
+ active = false;
15091
+ };
15092
+ }, [activeLocale, locales, collectionUtils, currentRoute, currentPathVariables,],);
15093
+ return localesForCurrentRoute;
15094
+ }
15095
+ function useLocalizationInfo() {
15096
+ const {
15097
+ activeLocale,
15098
+ locales,
15099
+ setLocale,
15100
+ } = useLocaleInfo();
15101
+ return {
15102
+ activeLocalization: activeLocale,
15103
+ localizations: locales,
15104
+ setLocalization: setLocale,
15105
+ };
15106
+ }
15107
+ function useLocaleCode() {
15108
+ return useLocaleInfo().activeLocale?.code ?? 'en-US';
15109
+ }
15110
+ function useLocale() {
15111
+ return useLocaleCode();
15112
+ }
15113
+ var LayoutDirectionContext = /* @__PURE__ */ (() => {
15114
+ const Context2 = React42.createContext('ltr',);
15115
+ Context2.displayName = 'LayoutDirectionContext';
15116
+ return Context2;
15117
+ })();
15118
+ function useLayoutDirection() {
15119
+ return React42.useContext(LayoutDirectionContext,);
15120
+ }
15057
15121
  var URLSearchParamsContext = /* @__PURE__ */ (() => {
15058
15122
  const Context2 = createContext({
15059
15123
  urlSearchParams: new URLSearchParams(),
@@ -15072,13 +15136,13 @@ function URLSearchParamsProvider({
15072
15136
  const handler = () => {
15073
15137
  onStoreChange();
15074
15138
  };
15075
- window.addEventListener('popstate', handler,);
15139
+ __unframerWindow2.addEventListener('popstate', handler,);
15076
15140
  return () => {
15077
15141
  onStoreChangeRef.current = null;
15078
- window.removeEventListener('popstate', handler,);
15142
+ __unframerWindow2.removeEventListener('popstate', handler,);
15079
15143
  };
15080
15144
  },
15081
- () => window.location.search,
15145
+ () => __unframerWindow2.location.search,
15082
15146
  () => '',
15083
15147
  );
15084
15148
  const deferredSearchString = useDeferredValue(searchString,);
@@ -15107,10 +15171,9 @@ function useStringArrayQueryParam({
15107
15171
  }, [urlSearchParams,],);
15108
15172
  const setValue = useCallback2(async (newValues) => {
15109
15173
  if (!isArray(newValues,)) return;
15110
- const currentHistoryState = window.history.state;
15111
- if (!isHistoryState(currentHistoryState,)) return;
15174
+ const currentHistoryState = __unframerWindow2.history.state;
15112
15175
  const name = parameterNameRef.current;
15113
- const url = new URL(window.location.href,);
15176
+ const url = new URL(__unframerWindow2.location.href,);
15114
15177
  const next2 = new URLSearchParams();
15115
15178
  let inserted = false;
15116
15179
  for (const [key7, originalValue,] of url.searchParams.entries()) {
@@ -16049,7 +16112,7 @@ function escapeStringRegExp(string,) {
16049
16112
  return string.replace(/[|\\{}()[\]^$+*?.]/gu, '\\$&',).replace(/-/gu, '\\x2d',);
16050
16113
  }
16051
16114
  function getVariantsFromServerTiming() {
16052
- if ('PerformanceServerTiming' in window) {
16115
+ if ('PerformanceServerTiming' in __unframerWindow2) {
16053
16116
  const serverTiming = performance.getEntriesByType('navigation',)[0]?.serverTiming;
16054
16117
  if (!serverTiming || serverTiming.length === 0) return new URLSearchParams();
16055
16118
  const entry = serverTiming.find((it) => it.name === 'abtests');
@@ -16113,7 +16176,7 @@ function patchInitialRoute(routes, routeId,) {
16113
16176
  };
16114
16177
  }
16115
16178
  function patchRoutesForABTesting(routes, initialRouteId,) {
16116
- if (typeof window === 'undefined') return initialRouteId;
16179
+ if (typeof __unframerWindow2 === 'undefined') return initialRouteId;
16117
16180
  let resolvedInitialRouteId = initialRouteId;
16118
16181
  if (initialRouteId) {
16119
16182
  patchInitialRoute(routes, initialRouteId,);
@@ -21292,6 +21355,149 @@ var ControlType = /* @__PURE__ */ ((ControlType2) => {
21292
21355
  ControlType2['LinkRelValues'] = 'linkrelvalues';
21293
21356
  return ControlType2;
21294
21357
  })(ControlType || {},);
21358
+ function getNavigator() {
21359
+ return typeof __unframerNavigator2 !== 'undefined' ? __unframerNavigator2 : void 0;
21360
+ }
21361
+ function getWindow() {
21362
+ return typeof __unframerWindow2 !== 'undefined' ? __unframerWindow2 : void 0;
21363
+ }
21364
+ var macRegex = /Mac/u;
21365
+ var winRegex = /Win/u;
21366
+ var iOSRegex = /iPhone|iPod|iPad/iu;
21367
+ var macIntelRegex = /MacIntel/iu;
21368
+ var androidRegex = /android/iu;
21369
+ function isMacOS() {
21370
+ const nav = getNavigator();
21371
+ return nav ? macRegex.test(nav.platform,) : false;
21372
+ }
21373
+ function isWindows() {
21374
+ const nav = getNavigator();
21375
+ return nav ? winRegex.test(nav.platform,) : false;
21376
+ }
21377
+ function isIOS() {
21378
+ const nav = getNavigator();
21379
+ if (!nav) return false;
21380
+ if (iOSRegex.test(nav.platform,)) return true;
21381
+ return macIntelRegex.test(nav.platform,) && nav.maxTouchPoints != null && nav.maxTouchPoints > 2;
21382
+ }
21383
+ function isAppleDevice() {
21384
+ return isMacOS() || isIOS();
21385
+ }
21386
+ function isAndroid() {
21387
+ const nav = getNavigator();
21388
+ return nav ? androidRegex.test(nav.userAgent,) : false;
21389
+ }
21390
+ var edgeRegex = /Edg\//u;
21391
+ function isEdge() {
21392
+ const nav = getNavigator();
21393
+ return nav ? edgeRegex.test(nav.userAgent,) : false;
21394
+ }
21395
+ var chromeRegex = /Chrome/u;
21396
+ var googleVendorRegex = /Google Inc/u;
21397
+ function isChrome() {
21398
+ const nav = getNavigator();
21399
+ return nav ? chromeRegex.test(nav.userAgent,) && googleVendorRegex.test(nav.vendor,) && !isEdge() : false;
21400
+ }
21401
+ var appleWebKitRegex = /AppleWebKit\//u;
21402
+ function isWebKit() {
21403
+ const nav = getNavigator();
21404
+ return nav ? appleWebKitRegex.test(nav.userAgent,) && !isChrome() && !isEdge() : false;
21405
+ }
21406
+ var safariRegex = /Safari/u;
21407
+ var appleComputerRegex = /Apple Computer/u;
21408
+ function isSafari() {
21409
+ const nav = getNavigator();
21410
+ return nav ? safariRegex.test(nav.userAgent,) && appleComputerRegex.test(nav.vendor,) : false;
21411
+ }
21412
+ var firefoxRegex = /Firefox\/\d+\.\d+$/u;
21413
+ function isFirefox() {
21414
+ const nav = getNavigator();
21415
+ return nav ? firefoxRegex.test(nav.userAgent,) : false;
21416
+ }
21417
+ function isBrowser2() {
21418
+ return typeof document === 'object';
21419
+ }
21420
+ var chromeVersionRegex = /Chrome\/(\d+)/u;
21421
+ function chromeMainVersion() {
21422
+ const nav = getNavigator();
21423
+ if (!nav) return -1;
21424
+ const result = chromeVersionRegex.exec(nav.userAgent,);
21425
+ if (!result || !result[1]) return -1;
21426
+ const version2 = parseInt(result[1],);
21427
+ return Number.isFinite(version2,) ? version2 : -1;
21428
+ }
21429
+ var safariVersionRegex = /Version\/([\d.]+)/u;
21430
+ function safariVersion() {
21431
+ const nav = getNavigator();
21432
+ if (!nav) return -1;
21433
+ const result = safariVersionRegex.exec(nav.userAgent,);
21434
+ if (result?.[1]) {
21435
+ return parseFloat(result[1],);
21436
+ }
21437
+ return -1;
21438
+ }
21439
+ var framerXRegex = /FramerX/u;
21440
+ function isFramerX() {
21441
+ const nav = getNavigator();
21442
+ return nav ? framerXRegex.test(nav.userAgent,) : false;
21443
+ }
21444
+ function isTest() {
21445
+ return false;
21446
+ }
21447
+ function isTouch() {
21448
+ const win = getWindow();
21449
+ const nav = getNavigator();
21450
+ if (!win || !nav) return false;
21451
+ return 'ontouchstart' in win || nav.maxTouchPoints > 0;
21452
+ }
21453
+ var tabletRegex = /tablet|iPad|Nexus 9/iu;
21454
+ var mobileRegex = /mobi/iu;
21455
+ function deviceType() {
21456
+ const nav = getNavigator();
21457
+ if (nav && tabletRegex.test(nav.userAgent,)) return 'tablet';
21458
+ if (nav && mobileRegex.test(nav.userAgent,)) return 'phone';
21459
+ return 'desktop';
21460
+ }
21461
+ function isDesktop() {
21462
+ return deviceType() === 'desktop';
21463
+ }
21464
+ function isPhone() {
21465
+ return deviceType() === 'phone';
21466
+ }
21467
+ function isTablet() {
21468
+ return deviceType() === 'tablet';
21469
+ }
21470
+ function isMobile() {
21471
+ return isPhone() || isTablet();
21472
+ }
21473
+ var embeddedRegex = /Instagram|FB_IAB\/FB4A|FBAN\/FBIOS|BytedanceWebview|Twitter|LinkedIn/iu;
21474
+ function isEmbedded() {
21475
+ const nav = getNavigator();
21476
+ return nav ? embeddedRegex.test(nav.userAgent,) : false;
21477
+ }
21478
+ var absoluteUrlRegex = /^[a-z]{1,8}:\/\/.*$/iu;
21479
+ function isRelativeUrl(url,) {
21480
+ return !absoluteUrlRegex.test(url,);
21481
+ }
21482
+ function isFileUrl(url,) {
21483
+ return url.startsWith('file://',);
21484
+ }
21485
+ function isDataUrl(url,) {
21486
+ return url.startsWith('data:',);
21487
+ }
21488
+ var localServerUrlRegex1 = /[a-z]{1,8}:\/\/127\.0\.0\.1/iu;
21489
+ var localServerUrlRegex2 = /[a-zA-Z]{1,8}:\/\/localhost/u;
21490
+ function isLocalServerUrl(url,) {
21491
+ return localServerUrlRegex1.test(url,) || localServerUrlRegex2.test(url,);
21492
+ }
21493
+ function isLocalUrl(url,) {
21494
+ if (isFileUrl(url,)) return true;
21495
+ if (isLocalServerUrl(url,)) return true;
21496
+ return false;
21497
+ }
21498
+ function isCommandKeyPressed(event,) {
21499
+ return isAppleDevice() ? event.metaKey : event.ctrlKey;
21500
+ }
21295
21501
  var StyleSheetContext = /* @__PURE__ */ React42.createContext(void 0,);
21296
21502
  var defaultCache = /* @__PURE__ */ new Set();
21297
21503
  var defaultSheet;
@@ -21321,127 +21527,6 @@ function injectCSSRule(cssRule, sheet, cache2 = defaultCache,) {
21321
21527
  sheet.insertRule(cssRule, sheet.cssRules.length,);
21322
21528
  } catch {}
21323
21529
  }
21324
- var safeNavigator = typeof __unframerNavigator2 !== 'undefined' ? __unframerNavigator2 : void 0;
21325
- var isBrowser2 = () => typeof document === 'object';
21326
- var isWebKit = () => safeNavigator?.userAgent.includes('AppleWebKit/',) && !isChrome() && !isEdge();
21327
- var webkitVersion = () => {
21328
- let version2 = -1;
21329
- const regexp = /AppleWebKit\/([\d.]+)/u;
21330
- const result = safeNavigator && regexp.exec(safeNavigator.userAgent,);
21331
- if (result && result[1]) {
21332
- version2 = parseFloat(result[1],);
21333
- }
21334
- return version2;
21335
- };
21336
- var safariVersion = () => {
21337
- let version2 = -1;
21338
- const regexp = /Version\/([\d.]+)/u;
21339
- const result = safeNavigator && regexp.exec(safeNavigator.userAgent,);
21340
- if (result && result[1]) {
21341
- version2 = parseFloat(result[1],);
21342
- }
21343
- return version2;
21344
- };
21345
- var isChrome = () => safeNavigator && /Chrome/u.test(safeNavigator.userAgent,) && /Google Inc/u.test(safeNavigator.vendor,) && !isEdge();
21346
- var isSafari = () => safeNavigator && /Safari/u.test(safeNavigator.userAgent,) && /Apple Computer/u.test(safeNavigator.vendor,);
21347
- var isFirefox = () => safeNavigator && /Firefox\/\d+\.\d+$/u.test(safeNavigator.userAgent,);
21348
- var isFramerX = () => safeNavigator && /FramerX/u.test(safeNavigator.userAgent,);
21349
- var isEdge = () => safeNavigator && /Edg\//u.test(safeNavigator.userAgent,);
21350
- var isAndroid = () => safeNavigator && /android/iu.test(safeNavigator.userAgent,);
21351
- var iOSRegex = /iPhone|iPod|iPad/iu;
21352
- var macIntelRegex = /MacIntel/iu;
21353
- var isIOS = () => {
21354
- if (!safeNavigator) return false;
21355
- if (iOSRegex.test(safeNavigator.platform,)) return true;
21356
- return macIntelRegex.test(safeNavigator.platform,) && safeNavigator.maxTouchPoints && safeNavigator.maxTouchPoints > 2;
21357
- };
21358
- var isMacOS = () => safeNavigator && /Mac/u.test(safeNavigator.platform,);
21359
- var isWindows = () => safeNavigator && /Win/u.test(safeNavigator.platform,);
21360
- var isTouch = () => safeWindow.ontouchstart === null && safeWindow.ontouchmove === null && safeWindow.ontouchend === null;
21361
- var isDesktop = () => deviceType() === 'desktop';
21362
- var isPhone = () => deviceType() === 'phone';
21363
- var isTablet = () => deviceType() === 'tablet';
21364
- var isMobile = () => isPhone() || isTablet();
21365
- var isFileUrl = (url) => url.startsWith('file://',);
21366
- var isDataUrl = (url) => url.startsWith('data:',);
21367
- var isTest = () => false;
21368
- var isRelativeUrl = (url) => !/^[a-z]{1,8}:\/\/.*$/i.test(url,);
21369
- var isLocalServerUrl = (url) => /[a-z]{1,8}:\/\/127\.0\.0\.1/i.test(url,) || /[a-zA-Z]{1,8}:\/\/localhost/u.test(url,);
21370
- var isLocalUrl = (url) => {
21371
- if (isFileUrl(url,)) return true;
21372
- if (isLocalServerUrl(url,)) return true;
21373
- return false;
21374
- };
21375
- var isLocalAssetUrl = (url, baseUrl,) => {
21376
- if (baseUrl === null) baseUrl = safeWindow.location.href;
21377
- if (isDataUrl(url,)) return false;
21378
- if (isLocalUrl(url,)) return true;
21379
- if (isRelativeUrl(url,) && isLocalUrl(baseUrl,)) return true;
21380
- return false;
21381
- };
21382
- var devicePixelRatio = () => safeWindow.devicePixelRatio;
21383
- var isJP2Supported = function () {
21384
- if (isFirefox()) return false;
21385
- return isWebKit();
21386
- };
21387
- var isWebPSupported = () => isChrome();
21388
- var deviceType = () => {
21389
- if (safeNavigator && /tablet|iPad|Nexus 9/i.test(safeNavigator.userAgent,)) return 'tablet';
21390
- if (safeNavigator && /mobi/iu.test(safeNavigator.userAgent,)) return 'phone';
21391
- return 'desktop';
21392
- };
21393
- var deviceOS = () => {
21394
- if (isMacOS()) return 'macos';
21395
- if (isIOS()) return 'ios';
21396
- if (isAndroid()) return 'android';
21397
- if (isWindows()) return 'windows';
21398
- };
21399
- var deviceFont = (os) => {
21400
- if (!os) {
21401
- os = deviceOS();
21402
- }
21403
- const fonts = {
21404
- apple: '-apple-system, BlinkMacSystemFont, SF Pro Text, SF UI Text, Helvetica Neue',
21405
- google: 'Roboto, Helvetica Neue',
21406
- microsoft: 'Segoe UI, Helvetica Neue',
21407
- };
21408
- if (os === 'macos') return fonts.apple;
21409
- if (os === 'ios') return fonts.apple;
21410
- if (os === 'android') return fonts.google;
21411
- if (os === 'windows') return fonts.microsoft;
21412
- return fonts.apple;
21413
- };
21414
- var environment = {
21415
- isWebKit,
21416
- webkitVersion,
21417
- isChrome,
21418
- isSafari,
21419
- isFirefox,
21420
- isFramerX,
21421
- isEdge,
21422
- isAndroid,
21423
- isIOS,
21424
- isMacOS,
21425
- isWindows,
21426
- isTouch,
21427
- isDesktop,
21428
- isPhone,
21429
- isTablet,
21430
- isMobile,
21431
- isFileUrl,
21432
- isDataUrl,
21433
- isRelativeUrl,
21434
- isLocalServerUrl,
21435
- isLocalUrl,
21436
- isLocalAssetUrl,
21437
- devicePixelRatio,
21438
- isJP2Supported,
21439
- isWebPSupported,
21440
- deviceType,
21441
- deviceOS,
21442
- deviceFont,
21443
- safariVersion,
21444
- };
21445
21530
  var framerPostSSRCSSSelector = 'style[data-framer-css-ssr-minified]';
21446
21531
  var componentsWithServerRenderedStyles = /* @__PURE__ */ (() => {
21447
21532
  if (!isBrowser2()) return /* @__PURE__ */ new Set();
@@ -21996,9 +22081,9 @@ var richTextCSSRules = /* @__PURE__ */ (() => [
21996
22081
  ul.framer-text,
21997
22082
  mark.framer-text,
21998
22083
  span.framer-text:not([data-text-fill]) {
21999
- font-family: var(--framer-blockquote-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif));
22000
- font-style: var(--framer-blockquote-font-style, var(--framer-font-style, normal));
22001
- font-weight: var(--framer-blockquote-font-weight, var(--framer-font-weight, 400));
22084
+ font-family: var(--framer-font-family-preview, var(--framer-blockquote-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
22085
+ font-style: var(--framer-font-style-preview, var(--framer-blockquote-font-style, var(--framer-font-style, normal)));
22086
+ font-weight: var(--framer-font-weight-preview, var(--framer-blockquote-font-weight, var(--framer-font-weight, 400)));
22002
22087
  color: var(--framer-blockquote-text-color, var(--framer-text-color, #000));
22003
22088
  font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
22004
22089
  letter-spacing: var(--framer-blockquote-letter-spacing, var(--framer-letter-spacing, 0));
@@ -22016,7 +22101,7 @@ var richTextCSSRules = /* @__PURE__ */ (() => [
22016
22101
  -moz-font-feature-settings: var(--framer-font-open-type-features, initial);
22017
22102
  -webkit-font-feature-settings: var(--framer-font-open-type-features, initial);
22018
22103
  font-feature-settings: var(--framer-font-open-type-features, initial);
22019
- font-variation-settings: var(--framer-font-variation-axes, normal);
22104
+ font-variation-settings: var(--framer-font-variation-axes-preview, var(--framer-font-variation-axes, normal));
22020
22105
  text-wrap: var(--framer-text-wrap-override, var(--framer-text-wrap));
22021
22106
  }
22022
22107
  `, /* css */
@@ -22180,9 +22265,9 @@ var richTextCSSRules = /* @__PURE__ */ (() => [
22180
22265
  span.framer-text[data-nested-link] span.framer-text:not([data-text-fill]) {
22181
22266
  /* Ensure the color is inherited from the link style rather than the parent text for nested spans */
22182
22267
  color: inherit;
22183
- font-family: var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
22184
- font-style: var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)));
22185
- font-weight: var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)));
22268
+ font-family: var(--framer-font-family-preview, var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
22269
+ font-style: var(--framer-font-style-preview, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
22270
+ font-weight: var(--framer-font-weight-preview, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
22186
22271
  font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
22187
22272
  text-transform: var(--framer-blockquote-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none)));
22188
22273
  /* Cursor inherit to overwrite the user agent stylesheet on rich text links. */
@@ -22264,9 +22349,9 @@ var richTextCSSRules = /* @__PURE__ */ (() => [
22264
22349
  a.framer-text:hover span.framer-text:not([data-text-fill]),
22265
22350
  span.framer-text[data-nested-link]:hover,
22266
22351
  span.framer-text[data-nested-link]:hover span.framer-text:not([data-text-fill]) {
22267
- 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))));
22268
- font-style: var(--framer-link-hover-font-style, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
22269
- font-weight: var(--framer-link-hover-font-weight, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
22352
+ font-family: var(--framer-font-family-preview, 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)))));
22353
+ font-style: var(--framer-font-style-preview, var(--framer-link-hover-font-style, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)))));
22354
+ font-weight: var(--framer-font-weight-preview, var(--framer-link-hover-font-weight, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)))));
22270
22355
  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));
22271
22356
  text-transform: var(--framer-link-hover-text-transform, var(--framer-blockquote-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none))));
22272
22357
  border-radius: var(--framer-link-hover-text-background-radius, var(--framer-link-text-background-radius, var(--framer-text-background-radius, initial)));
@@ -22343,9 +22428,9 @@ var richTextCSSRules = /* @__PURE__ */ (() => [
22343
22428
  a.framer-text[data-framer-page-link-current] span.framer-text:not([data-text-fill]),
22344
22429
  span.framer-text[data-framer-page-link-current],
22345
22430
  span.framer-text[data-framer-page-link-current] span.framer-text:not([data-text-fill]) {
22346
- font-family: var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
22347
- font-style: var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)));
22348
- font-weight: var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)));
22431
+ font-family: var(--framer-font-family-preview, var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
22432
+ font-style: var(--framer-font-style-preview, var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
22433
+ font-weight: var(--framer-font-weight-preview, var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
22349
22434
  font-size: calc(var(--framer-link-current-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px))) * var(--framer-font-size-scale, 1));
22350
22435
  text-transform: var(--framer-link-current-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none)));
22351
22436
  border-radius: var(--framer-link-current-text-background-radius, var(--framer-link-text-background-radius, initial));
@@ -22438,9 +22523,9 @@ var richTextCSSRules = /* @__PURE__ */ (() => [
22438
22523
  span.framer-text[data-framer-page-link-current]:hover,
22439
22524
  span.framer-text[data-framer-page-link-current]:hover span.framer-text:not([data-text-fill]) {
22440
22525
  color: inherit;
22441
- font-family: var(--framer-link-hover-font-family, var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
22442
- font-style: var(--framer-link-hover-font-style, var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
22443
- font-weight: var(--framer-link-hover-font-weight, var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
22526
+ font-family: var(--framer-font-family-preview, var(--framer-link-hover-font-family, var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)))));
22527
+ font-style: var(--framer-font-style-preview, var(--framer-link-hover-font-style, var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)))));
22528
+ font-weight: var(--framer-font-weight-preview, var(--framer-link-hover-font-weight, var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)))));
22444
22529
  font-size: calc(var(--framer-link-hover-font-size, var(--framer-link-current-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px)))) * var(--framer-font-size-scale, 1));
22445
22530
  text-transform: var(--framer-link-hover-text-transform, var(--framer-link-current-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none))));
22446
22531
  border-radius: var(--framer-link-hover-text-background-radius, var(--framer-link-current-text-background-radius, var(--framer-link-text-background-radius, initial)));
@@ -28384,7 +28469,7 @@ var FramerEvent = class _FramerEvent {
28384
28469
  * @internal
28385
28470
  */
28386
28471
  get isLeftMouseClick() {
28387
- if (environment.isTouch()) {
28472
+ if (isTouch()) {
28388
28473
  return void 0;
28389
28474
  }
28390
28475
  if ('button' in this.originalEvent && 'buttons' in this.originalEvent && 'ctrlKey' in this.originalEvent) {
@@ -32164,7 +32249,7 @@ var TouchEventListener = class extends Component2 {
32164
32249
  safeWindow.removeEventListener('touchend', this.domTouchEnd,);
32165
32250
  }
32166
32251
  };
32167
- var FramerEventListener = /* @__PURE__ */ environment.isTouch() ? TouchEventListener : MouseEventListener;
32252
+ var FramerEventListener = /* @__PURE__ */ isTouch() ? TouchEventListener : MouseEventListener;
32168
32253
  var directionMap = {
32169
32254
  horizontal: 'x',
32170
32255
  vertical: 'y',
@@ -32680,7 +32765,7 @@ function useEmulateTouchScroll(ref, direction, enabled,) {
32680
32765
  case 3:
32681
32766
  return;
32682
32767
  }
32683
- if (event.metaKey) return;
32768
+ if (isCommandKeyPressed(event,)) return;
32684
32769
  const point2 = getEventPoint(event,);
32685
32770
  if (!downPoint) return;
32686
32771
  const offset = Point.subtract(point2, downPoint,);
@@ -32764,7 +32849,7 @@ function useEmulateTouchScroll(ref, direction, enabled,) {
32764
32849
  }
32765
32850
  function onMouseDown(event,) {
32766
32851
  if (!enabled) return;
32767
- if (event.metaKey) return;
32852
+ if (isCommandKeyPressed(event,)) return;
32768
32853
  if (!canStartScrollFromElement(event.target, direction,)) {
32769
32854
  if (phase === 4) {
32770
32855
  phase = 0;
@@ -34852,9 +34937,9 @@ function isSuspense426Error(error,) {
34852
34937
  const minifiedMessage = 'Minified React error #426';
34853
34938
  return error instanceof Error && (error.message.includes(unminifiedMessage,) || error.message.includes(minifiedMessage,));
34854
34939
  }
34855
- var suspendPromise = /* @__PURE__ */ (() => typeof window !== 'undefined' ? new Promise(() => {},) : null)();
34940
+ var suspendPromise = /* @__PURE__ */ (() => typeof __unframerWindow2 !== 'undefined' ? new Promise(() => {},) : null)();
34856
34941
  function Suspend() {
34857
- if (typeof window === 'undefined' || shouldSuspenseBoundariesBeActive) {
34942
+ if (typeof __unframerWindow2 === 'undefined' || shouldSuspenseBoundariesBeActive) {
34858
34943
  return /* @__PURE__ */ jsx('div', {
34859
34944
  hidden: true,
34860
34945
  dangerouslySetInnerHTML: {
@@ -34957,7 +35042,7 @@ function ServerSideErrorBoundary({
34957
35042
  children,
34958
35043
  fallback = nullFallback,
34959
35044
  },) {
34960
- return typeof window === 'undefined'
35045
+ return typeof __unframerWindow2 === 'undefined'
34961
35046
  ? // On the server, Suspense fallback is activated by errors. So we use the actual Suspense,
34962
35047
  // and render the actual error fallback if Suspense activates.
34963
35048
  /* @__PURE__ */
@@ -35732,8 +35817,7 @@ function useReplaceNestedLinks(children, scopeId, nodeId, href, propsAddedByLink
35732
35817
  if (!propsAddedByLink.href) return;
35733
35818
  event.preventDefault();
35734
35819
  event.stopPropagation();
35735
- const isAppleDevice = /Mac|iPod|iPhone|iPad/u.test(__unframerNavigator2.userAgent,);
35736
- if (isAppleDevice ? event.metaKey : event.ctrlKey) {
35820
+ if (isCommandKeyPressed(event,)) {
35737
35821
  openExternalLink(propsAddedByLink.href, '', '_blank',);
35738
35822
  return;
35739
35823
  }
@@ -36570,7 +36654,7 @@ var GracefullyDegradingErrorBoundary = class extends Component2 {
36570
36654
  };
36571
36655
  }
36572
36656
  componentDidCatch(error,) {
36573
- window.__framer_hadFatalError = true;
36657
+ __unframerWindow2.__framer_hadFatalError = true;
36574
36658
  if ('cause' in error) {
36575
36659
  error = error.cause;
36576
36660
  }
@@ -36643,102 +36727,6 @@ function withChildrenCanSuspend(Component18,) {
36643
36727
  },);
36644
36728
  },);
36645
36729
  }
36646
- var PRELOAD_AFTER_MS = 500;
36647
- var OBSERVER_THRESHOLD = 0.9;
36648
- var LOW_MEMORY_THRESHOLD = 1.7;
36649
- var MAX_CONCURRENT_PRELOADS_SLOW_NETWORK = 4;
36650
- var MAX_CONCURRENT_PRELOADS_FAST_NETWORK = Infinity;
36651
- var nodeToRoute = /* @__PURE__ */ new WeakMap();
36652
- var preloadedRoutes = /* @__PURE__ */ new Set();
36653
- var routeToNodesInViewport = /* @__PURE__ */ new Map();
36654
- function getObserveRouteForPreloadingFn() {
36655
- const connection = __unframerNavigator2.connection || __unframerNavigator2.mozConnection || __unframerNavigator2.webkitConnection || {};
36656
- const lowDeviceMemory = __unframerNavigator2.deviceMemory && __unframerNavigator2.deviceMemory > LOW_MEMORY_THRESHOLD;
36657
- let effectiveType, preloadDisabled, maxPreloadAmount;
36658
- function updateConnection() {
36659
- effectiveType = connection.effectiveType || '';
36660
- preloadDisabled = connection.saveData || effectiveType.includes('2g',);
36661
- maxPreloadAmount = effectiveType === '3g' || lowDeviceMemory
36662
- ? MAX_CONCURRENT_PRELOADS_SLOW_NETWORK
36663
- : MAX_CONCURRENT_PRELOADS_FAST_NETWORK;
36664
- }
36665
- connection.addEventListener?.('change', updateConnection,);
36666
- updateConnection();
36667
- const observer2 = new IntersectionObserver(onPreloadIntersectionChange, {
36668
- threshold: OBSERVER_THRESHOLD,
36669
- },);
36670
- let activePreloadsAmount = 0;
36671
- async function preloadTimeout(context, target,) {
36672
- if (preloadDisabled) return;
36673
- const {
36674
- routeId,
36675
- pathVariables,
36676
- preload,
36677
- } = context;
36678
- const nodesInViewport = routeToNodesInViewport.get(routeId,);
36679
- if (!nodesInViewport?.size || preloadedRoutes.has(routeId,)) return;
36680
- ++activePreloadsAmount;
36681
- preloadedRoutes.add(routeId,);
36682
- const preloadPromise = preload(routeId, pathVariables,)?.catch(() => {
36683
- if (false) {
36684
- throw new Error(
36685
- 'Error in preloadRoute during preloadTimeout. This should never happen as it introduces bugs. Please make sure preloadRoute does not throw.',
36686
- );
36687
- }
36688
- },);
36689
- observer2.unobserve(target,);
36690
- nodeToRoute.delete(target,);
36691
- for (const node of nodesInViewport) {
36692
- observer2.unobserve(node,);
36693
- nodeToRoute.delete(node,);
36694
- }
36695
- nodesInViewport.clear();
36696
- routeToNodesInViewport.delete(routeId,);
36697
- await preloadPromise;
36698
- --activePreloadsAmount;
36699
- }
36700
- function onPreloadIntersectionChange(entries,) {
36701
- for (const entry of entries) {
36702
- const target = entry.target;
36703
- const context = nodeToRoute.get(target,);
36704
- if (!context || preloadedRoutes.has(context.routeId,)) {
36705
- observer2.unobserve(target,);
36706
- nodeToRoute.delete(target,);
36707
- continue;
36708
- }
36709
- const {
36710
- routeId,
36711
- } = context;
36712
- const nodes = routeToNodesInViewport.get(routeId,);
36713
- const amountOfNodesInViewport = routeToNodesInViewport.get(routeId,)?.size ?? 0;
36714
- if (entry.isIntersecting) {
36715
- if (activePreloadsAmount >= maxPreloadAmount) continue;
36716
- if (nodes) nodes.add(target,);
36717
- else routeToNodesInViewport.set(routeId, /* @__PURE__ */ new Set([target,],),);
36718
- setTimeout(preloadTimeout.bind(void 0, context, target,), PRELOAD_AFTER_MS,);
36719
- } else {
36720
- if (nodes) nodes.delete(target,);
36721
- if (amountOfNodesInViewport <= 1) routeToNodesInViewport.delete(routeId,);
36722
- }
36723
- }
36724
- }
36725
- return (node, preload, routeId, pathVariables,) => {
36726
- if (preloadedRoutes.has(routeId,)) return;
36727
- nodeToRoute.set(node, {
36728
- routeId,
36729
- pathVariables,
36730
- preload,
36731
- },);
36732
- observer2.observe(node,);
36733
- return () => {
36734
- nodeToRoute.delete(node,);
36735
- observer2.unobserve(node,);
36736
- };
36737
- };
36738
- }
36739
- var observeRouteForPreloading =
36740
- // this also guards `window`
36741
- !shouldPreloadBasedOnUA || typeof IntersectionObserver === 'undefined' ? null : /* @__PURE__ */ getObserveRouteForPreloadingFn();
36742
36730
  function findMatchingRouteAttributesForWebPageLink(router, currentRoute, pageLink, activeLocale, resolvedSlugs, implicitPathVariables,) {
36743
36731
  const {
36744
36732
  webPageId,
@@ -36774,10 +36762,16 @@ function findMatchingRouteAttributesForResolvedPath(router, path, implicitPathVa
36774
36762
  const {
36775
36763
  routeId,
36776
36764
  pathVariables,
36765
+ localeId,
36777
36766
  } = inferInitialRouteFromPath(router.routes, pathname, void 0, locales,);
36778
36767
  const route = router.getRoute(routeId,);
36779
36768
  if (route) {
36780
36769
  const combinedPathVariables = Object.assign({}, implicitPathVariables, pathVariables,);
36770
+ const locale = localeId
36771
+ ? locales?.find(({
36772
+ id: id3,
36773
+ },) => id3 === localeId)
36774
+ : void 0;
36781
36775
  return {
36782
36776
  routeId,
36783
36777
  route,
@@ -36786,6 +36780,7 @@ function findMatchingRouteAttributesForResolvedPath(router, path, implicitPathVa
36786
36780
  // should be resolved by getHashForRoute.
36787
36781
  elementId: hash2,
36788
36782
  pathVariables: combinedPathVariables,
36783
+ locale,
36789
36784
  };
36790
36785
  }
36791
36786
  } catch {}
@@ -36830,6 +36825,7 @@ function getRouteAttributes(
36830
36825
  href: resolvedHref,
36831
36826
  elementId: resolvedHash,
36832
36827
  pathVariables: combinedPathVariables,
36828
+ locale: activeLocale ?? void 0,
36833
36829
  };
36834
36830
  }
36835
36831
  var pathVariablesRegExp2 = /:([a-z]\w*)/gi;
@@ -36865,6 +36861,98 @@ function useLinkMatchesRoute(link,) {
36865
36861
  const pageLink = isString(link,) ? linkFromFramerPageLink(link,) : link;
36866
36862
  return isLinkToWebPage(pageLink,) ? linkMatchesRoute(route, pageLink, contextPathVariables,) : false;
36867
36863
  }
36864
+ var PRELOAD_AFTER_MS = 500;
36865
+ var OBSERVER_THRESHOLD = 0.9;
36866
+ var LOW_MEMORY_THRESHOLD = 1.7;
36867
+ var MAX_CONCURRENT_PRELOADS_SLOW_NETWORK = 4;
36868
+ var MAX_CONCURRENT_PRELOADS_FAST_NETWORK = Infinity;
36869
+ var nodeToRoute = /* @__PURE__ */ new WeakMap();
36870
+ var preloadedRoutes = /* @__PURE__ */ new Set();
36871
+ var routeToNodesInViewport = /* @__PURE__ */ new Map();
36872
+ function getObserveRouteForPreloadingFn() {
36873
+ const connection = __unframerNavigator2.connection || __unframerNavigator2.mozConnection || __unframerNavigator2.webkitConnection || {};
36874
+ const lowDeviceMemory = __unframerNavigator2.deviceMemory && __unframerNavigator2.deviceMemory > LOW_MEMORY_THRESHOLD;
36875
+ let effectiveType, preloadDisabled, maxPreloadAmount;
36876
+ function updateConnection() {
36877
+ effectiveType = connection.effectiveType || '';
36878
+ preloadDisabled = connection.saveData || effectiveType.includes('2g',);
36879
+ maxPreloadAmount = effectiveType === '3g' || lowDeviceMemory
36880
+ ? MAX_CONCURRENT_PRELOADS_SLOW_NETWORK
36881
+ : MAX_CONCURRENT_PRELOADS_FAST_NETWORK;
36882
+ }
36883
+ connection.addEventListener?.('change', updateConnection,);
36884
+ updateConnection();
36885
+ const observer2 = new IntersectionObserver(onPreloadIntersectionChange, {
36886
+ threshold: OBSERVER_THRESHOLD,
36887
+ },);
36888
+ let activePreloadsAmount = 0;
36889
+ async function preloadTimeout(context, target,) {
36890
+ if (preloadDisabled) return;
36891
+ const {
36892
+ id: id3,
36893
+ preload,
36894
+ } = context;
36895
+ const nodesInViewport = routeToNodesInViewport.get(id3,);
36896
+ if (!nodesInViewport?.size || preloadedRoutes.has(id3,)) return;
36897
+ ++activePreloadsAmount;
36898
+ preloadedRoutes.add(id3,);
36899
+ const preloadPromise = preload()?.catch(() => {
36900
+ if (false) {
36901
+ throw new Error(
36902
+ 'Error in preloadRoute during preloadTimeout. This should never happen as it introduces bugs. Please make sure preloadRoute does not throw.',
36903
+ );
36904
+ }
36905
+ },);
36906
+ observer2.unobserve(target,);
36907
+ nodeToRoute.delete(target,);
36908
+ for (const node of nodesInViewport) {
36909
+ observer2.unobserve(node,);
36910
+ nodeToRoute.delete(node,);
36911
+ }
36912
+ nodesInViewport.clear();
36913
+ routeToNodesInViewport.delete(id3,);
36914
+ await preloadPromise;
36915
+ --activePreloadsAmount;
36916
+ }
36917
+ function onPreloadIntersectionChange(entries,) {
36918
+ for (const entry of entries) {
36919
+ const target = entry.target;
36920
+ const context = nodeToRoute.get(target,);
36921
+ if (!context || preloadedRoutes.has(context.id,)) {
36922
+ observer2.unobserve(target,);
36923
+ nodeToRoute.delete(target,);
36924
+ continue;
36925
+ }
36926
+ const preloadId = context.id;
36927
+ const nodes = routeToNodesInViewport.get(preloadId,);
36928
+ const amountOfNodesInViewport = routeToNodesInViewport.get(preloadId,)?.size ?? 0;
36929
+ if (entry.isIntersecting) {
36930
+ if (activePreloadsAmount >= maxPreloadAmount) continue;
36931
+ if (nodes) nodes.add(target,);
36932
+ else routeToNodesInViewport.set(preloadId, /* @__PURE__ */ new Set([target,],),);
36933
+ setTimeout(preloadTimeout, PRELOAD_AFTER_MS, context, target,);
36934
+ } else {
36935
+ if (nodes) nodes.delete(target,);
36936
+ if (amountOfNodesInViewport <= 1) routeToNodesInViewport.delete(preloadId,);
36937
+ }
36938
+ }
36939
+ }
36940
+ return (node, preload, id3,) => {
36941
+ if (preloadedRoutes.has(id3,)) return;
36942
+ nodeToRoute.set(node, {
36943
+ id: id3,
36944
+ preload,
36945
+ },);
36946
+ observer2.observe(node,);
36947
+ return () => {
36948
+ nodeToRoute.delete(node,);
36949
+ observer2.unobserve(node,);
36950
+ };
36951
+ };
36952
+ }
36953
+ var observeRouteForPreloading =
36954
+ // this also guards `window`
36955
+ !shouldPreloadBasedOnUA || typeof IntersectionObserver === 'undefined' ? null : /* @__PURE__ */ getObserveRouteForPreloadingFn();
36868
36956
  var AnchorLinkTarget = /* @__PURE__ */ ((AnchorLinkTarget2) => {
36869
36957
  AnchorLinkTarget2['_blank'] = '_blank';
36870
36958
  AnchorLinkTarget2['_self'] = '_self';
@@ -37032,15 +37120,15 @@ function makeUrlAbsolute(href,) {
37032
37120
  }
37033
37121
  }
37034
37122
  function performNavigation(router, routeId, preload, elementId, combinedPathVariables, smoothScroll, beforeUrlUpdate,) {
37035
- void preload(routeId, combinedPathVariables, false,);
37123
+ void preload();
37036
37124
  router.navigate?.(routeId, elementId, combinedPathVariables, smoothScroll, beforeUrlUpdate,);
37037
37125
  }
37038
- function createOnClickLinkHandler(router, routeId, href, trackLinkClick, preload, elementId, combinedPathVariables, smoothScroll,) {
37126
+ function createOnClickLinkHandler(href, trackLinkClick, navigate,) {
37039
37127
  return async (event) => {
37040
- const usedMetaKey = event.metaKey;
37128
+ const usedCommandKey = isCommandKeyPressed(event,);
37041
37129
  const anchorElement = findAnchorElement(event.target,);
37042
37130
  const isExternalLink = !anchorElement || anchorElement.getAttribute('target',) === '_blank';
37043
- const shouldPerformNavigation = !usedMetaKey && !isExternalLink;
37131
+ const shouldPerformNavigation = !usedCommandKey && !isExternalLink;
37044
37132
  const track = () => void trackLinkClick(href,);
37045
37133
  if (!shouldPerformNavigation) {
37046
37134
  await yieldToMain({
@@ -37052,7 +37140,7 @@ function createOnClickLinkHandler(router, routeId, href, trackLinkClick, preload
37052
37140
  return;
37053
37141
  }
37054
37142
  event.preventDefault();
37055
- performNavigation(router, routeId, preload, elementId, combinedPathVariables, smoothScroll, track,);
37143
+ navigate(track,);
37056
37144
  };
37057
37145
  }
37058
37146
  function propsForRoutePath(href, router, currentRoute, linkOptions, preload, localeId, locales, implicitPathVariables,) {
@@ -37064,6 +37152,7 @@ function propsForRoutePath(href, router, currentRoute, linkOptions, preload, loc
37064
37152
  route,
37065
37153
  elementId,
37066
37154
  pathVariables,
37155
+ locale,
37067
37156
  } = matchedRoute;
37068
37157
  if (!route) return propsForLink(href, linkOptions,);
37069
37158
  const path = getPathForRoute(route, {
@@ -37081,26 +37170,38 @@ function propsForRoutePath(href, router, currentRoute, linkOptions, preload, loc
37081
37170
  localeId,
37082
37171
  },);
37083
37172
  const anchorTarget = getTargetAttrValue(linkOptions.openInNewTab, true,);
37084
- return {
37085
- routeId,
37086
- href: path,
37087
- target: anchorTarget,
37088
- onClick: createOnClickLinkHandler(
37173
+ const navigate = (beforeUrlUpdate) =>
37174
+ performNavigation(
37089
37175
  router,
37090
37176
  routeId,
37091
- path,
37092
- linkOptions.trackLinkClick,
37093
- preload,
37177
+ () =>
37178
+ preload(routeId, {
37179
+ pathVariables,
37180
+ locale,
37181
+ }, false,),
37094
37182
  elementId,
37095
37183
  pathVariables,
37096
37184
  linkOptions.smoothScroll,
37097
- ),
37098
- navigate: () => performNavigation(router, routeId, preload, elementId, pathVariables, linkOptions.smoothScroll,),
37185
+ beforeUrlUpdate,
37186
+ );
37187
+ return {
37188
+ href: path,
37189
+ target: anchorTarget,
37190
+ onClick: createOnClickLinkHandler(path, linkOptions.trackLinkClick, navigate,),
37191
+ navigate,
37099
37192
  'data-framer-page-link-current': currentRoute && linkMatchesRoute(currentRoute, {
37100
37193
  webPageId: routeId,
37101
37194
  hash: elementId,
37102
37195
  pathVariables,
37103
37196
  }, implicitPathVariables,) || void 0,
37197
+ preload: () =>
37198
+ preload(routeId, {
37199
+ pathVariables,
37200
+ locale,
37201
+ },),
37202
+ _routeId: routeId,
37203
+ _pathVariables: pathVariables,
37204
+ _locale: locale,
37104
37205
  };
37105
37206
  }
37106
37207
  var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ forwardRef(function Link2({
@@ -37125,6 +37226,7 @@ var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ forwardRef(fun
37125
37226
  } = useLocaleInfo();
37126
37227
  const resolveSlugsWithSuspense2 = useResolveSlugsWithSuspense();
37127
37228
  const preload = usePreloadRoute();
37229
+ const isOnFramerCanvas = useIsOnFramerCanvas();
37128
37230
  const trackLinkClick = useTrackLinkClick({
37129
37231
  nodeId,
37130
37232
  clickTrackingId,
@@ -37171,19 +37273,41 @@ var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ forwardRef(fun
37171
37273
  implicitPathVariables,
37172
37274
  );
37173
37275
  const {
37174
- routeId: routeId2,
37276
+ routeId,
37175
37277
  href: resolvedHref,
37176
37278
  elementId,
37177
37279
  pathVariables,
37280
+ locale,
37178
37281
  } = maybeRouteAttributes;
37179
37282
  const anchorTarget = getTargetAttrValue(openInNewTab, true,);
37283
+ const navigate2 = (beforeUrlUpdate) =>
37284
+ performNavigation(
37285
+ router,
37286
+ routeId,
37287
+ () =>
37288
+ preload(routeId, {
37289
+ pathVariables,
37290
+ locale,
37291
+ }, false,),
37292
+ elementId,
37293
+ pathVariables,
37294
+ smoothScroll,
37295
+ beforeUrlUpdate,
37296
+ );
37180
37297
  return {
37181
- routeId: routeId2,
37182
37298
  href: resolvedHref,
37183
37299
  target: anchorTarget,
37184
- onClick: createOnClickLinkHandler(router, routeId2, resolvedHref, trackLinkClick, preload, elementId, pathVariables, smoothScroll,),
37185
- navigate: () => performNavigation(router, routeId2, preload, elementId, pathVariables, smoothScroll,),
37300
+ onClick: createOnClickLinkHandler(resolvedHref, trackLinkClick, navigate2,),
37186
37301
  'data-framer-page-link-current': currentRoute && linkMatchesRoute(currentRoute, pageLink, implicitPathVariables,) || void 0,
37302
+ navigate: navigate2,
37303
+ preload: () =>
37304
+ preload(routeId, {
37305
+ pathVariables,
37306
+ locale,
37307
+ },),
37308
+ _routeId: routeId,
37309
+ _pathVariables: pathVariables,
37310
+ _locale: locale,
37187
37311
  };
37188
37312
  }, [
37189
37313
  href,
@@ -37204,22 +37328,22 @@ var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ forwardRef(fun
37204
37328
  const observerRef = useObserverRef(hasRef ? children.ref : void 0,);
37205
37329
  const {
37206
37330
  navigate,
37207
- routeId,
37208
- ...propsAddedByLinkExceptNavigate
37331
+ preload: preloadFn,
37332
+ _routeId,
37333
+ _pathVariables,
37334
+ _locale,
37335
+ ...restPropsAddedByLink
37209
37336
  } = propsAddedByLink;
37210
37337
  useRefEffect(observerRef, (node) => {
37211
- if (node === null || !routeId) return;
37212
- const pageLink = isLinkToWebPage(href,) ? href : linkFromFramerPageLink(href,);
37213
- if (!pageLink) return;
37214
- const pathVariables = isString(pageLink,) ? void 0 : pageLink.pathVariables;
37215
- return observeRouteForPreloading?.(node, preload, routeId, pathVariables,);
37216
- }, [href, preload, routeId,],);
37338
+ if (node === null || !_routeId || !preloadFn || isOnFramerCanvas) return;
37339
+ return observeRouteForPreloading?.(node, preloadFn, `${_routeId}:${_locale?.id}:${JSON.stringify(_pathVariables,)}`,);
37340
+ }, [preloadFn, _routeId, _pathVariables, _locale,],);
37217
37341
  const isInternalNavigation = Boolean(navigate,);
37218
37342
  const clone = useCloneChildrenWithPropsAndRef(forwardedRef,);
37219
37343
  const replacedChildren = clone.cloneAsArray(children, (childProps) =>
37220
37344
  cloneChildPropsWithAggregatedEvents(childProps, {
37221
37345
  ...restProps,
37222
- ...rebindEventHandlersIfNeeded(propsAddedByLinkExceptNavigate, motionChild, isInternalNavigation,),
37346
+ ...rebindEventHandlersIfNeeded(restPropsAddedByLink, motionChild, isInternalNavigation,),
37223
37347
  }, observerRef,),);
37224
37348
  return useReplaceNestedLinks(replacedChildren, scopeId, nodeId, href, propsAddedByLink, observerRef,);
37225
37349
  },),);
@@ -38329,9 +38453,9 @@ var useSendPageView = (
38329
38453
  sendTrackingEvent('published_site_pageview', eventData, 'eager',);
38330
38454
  }
38331
38455
  };
38332
- window.addEventListener('pageshow', listener,);
38456
+ __unframerWindow2.addEventListener('pageshow', listener,);
38333
38457
  return () => {
38334
- window.removeEventListener('pageshow', listener,);
38458
+ __unframerWindow2.removeEventListener('pageshow', listener,);
38335
38459
  };
38336
38460
  }, [
38337
38461
  currentRoute,
@@ -38356,7 +38480,7 @@ function updateScrollPosition(hash2, smoothScroll, isHistoryTransition,) {
38356
38480
  return;
38357
38481
  }
38358
38482
  if (isHistoryTransition) return;
38359
- window.scrollTo(0, 0,);
38483
+ __unframerWindow2.scrollTo(0, 0,);
38360
38484
  }
38361
38485
  function useScheduleRenderSideEffects(dep,) {
38362
38486
  const actions = useRef([],);
@@ -38403,7 +38527,7 @@ function useNavigationTransition() {
38403
38527
  startNativeSpinner(navigationPromise, updateURL, controller,);
38404
38528
  await nextRender.promise;
38405
38529
  if (signal?.aborted) return;
38406
- const navigationTransition = window.navigation?.transition;
38530
+ const navigationTransition = __unframerWindow2.navigation?.transition;
38407
38531
  resolveNavigationPromise();
38408
38532
  try {
38409
38533
  await navigationTransition?.finished;
@@ -38513,7 +38637,9 @@ function Router({
38513
38637
  preserveQueryParams,
38514
38638
  },);
38515
38639
  if (!localeResult) return;
38516
- const currentStatePaginationInfo = isHistoryState(window.history.state,) ? window.history.state.paginationInfo : void 0;
38640
+ const currentStatePaginationInfo = isHistoryState(__unframerWindow2.history.state,)
38641
+ ? __unframerWindow2.history.state.paginationInfo
38642
+ : void 0;
38517
38643
  const currentPath = localeResult.path;
38518
38644
  isInitialNavigationRef.current = false;
38519
38645
  currentPathVariablesRef.current = localeResult.pathVariables;
@@ -38626,7 +38752,7 @@ function Router({
38626
38752
  ) {
38627
38753
  nextRender.ignore?.();
38628
38754
  const route = routes[routeId];
38629
- if (window.history.state?.hash !== hash2 && !disableHistory && route) {
38755
+ if (__unframerWindow2.history.state?.hash !== hash2 && !disableHistory && route) {
38630
38756
  executeBeforeUrlUpdate();
38631
38757
  await pushRouteState(routeId, route, {
38632
38758
  currentRoutePath: route.path,
@@ -44348,7 +44474,11 @@ function getWhereExpressionFromPathVariables(pathVariables, collection,) {
44348
44474
  }));
44349
44475
  }
44350
44476
  var ALL_ELEMENTS_VALUE = '__all__';
44477
+ var BOOLEAN_TRUE_VALUE = '__true__';
44478
+ var BOOLEAN_FALSE_VALUE = '__false__';
44351
44479
  var variableBindingHooks = {
44480
+ ['boolean'/* Boolean */
44481
+ ]: useFormSelectBooleanVariableBinding,
44352
44482
  ['collectionreference'/* CollectionReference */
44353
44483
  ]: useFormSelectCollectionVariableBinding,
44354
44484
  };
@@ -44356,6 +44486,51 @@ function useFormSelectVariableBinding(options,) {
44356
44486
  const variableTypeRef = useRef(options.variableType,);
44357
44487
  return variableBindingHooks[variableTypeRef.current](options,);
44358
44488
  }
44489
+ function useFormSelectBooleanVariableBinding({
44490
+ allItemsLabel,
44491
+ booleanTrueLabel,
44492
+ booleanFalseLabel,
44493
+ isOptional,
44494
+ setValue,
44495
+ value,
44496
+ },) {
44497
+ const selectValue = useMemo(() => {
44498
+ if (value === true) return BOOLEAN_TRUE_VALUE;
44499
+ if (value === false) return BOOLEAN_FALSE_VALUE;
44500
+ return isOptional ? ALL_ELEMENTS_VALUE : BOOLEAN_TRUE_VALUE;
44501
+ }, [isOptional, value,],);
44502
+ const selectOptions = useMemo(() =>
44503
+ withAllOption(
44504
+ [{
44505
+ disabled: false,
44506
+ title: booleanTrueLabel,
44507
+ type: 'option',
44508
+ value: BOOLEAN_TRUE_VALUE,
44509
+ }, {
44510
+ disabled: false,
44511
+ title: booleanFalseLabel,
44512
+ type: 'option',
44513
+ value: BOOLEAN_FALSE_VALUE,
44514
+ },],
44515
+ isOptional,
44516
+ allItemsLabel,
44517
+ false,
44518
+ ), [allItemsLabel, booleanTrueLabel, booleanFalseLabel, isOptional,],);
44519
+ const onChange = useCallback2((event) => {
44520
+ if (!(event.target instanceof HTMLSelectElement)) return;
44521
+ const selectedValue = event.target.value;
44522
+ startTransition2(() => {
44523
+ if (selectedValue === ALL_ELEMENTS_VALUE) {
44524
+ setValue(void 0,);
44525
+ } else if (selectedValue === BOOLEAN_TRUE_VALUE) {
44526
+ setValue(true,);
44527
+ } else if (selectedValue === BOOLEAN_FALSE_VALUE) {
44528
+ setValue(false,);
44529
+ }
44530
+ },);
44531
+ }, [setValue,],);
44532
+ return [selectValue, selectOptions, onChange,];
44533
+ }
44359
44534
  function useFormSelectCollectionVariableBinding({
44360
44535
  allItemsLabel,
44361
44536
  collectionData,
@@ -44363,26 +44538,20 @@ function useFormSelectCollectionVariableBinding({
44363
44538
  slugId,
44364
44539
  titleId,
44365
44540
  setValue,
44366
- value,
44541
+ value: rawValue,
44367
44542
  },) {
44368
44543
  const selectOptions = useCollectionSelectOptions({
44369
44544
  collectionData,
44370
44545
  slugId,
44371
44546
  titleId,
44372
44547
  },);
44548
+ const value = isBoolean(rawValue,) ? void 0 : rawValue;
44373
44549
  const selectValue = value === void 0 ? ALL_ELEMENTS_VALUE : value;
44374
- const selectOptionsIncludingOptional = useMemo(() => {
44375
- if (!isOptional) return selectOptions;
44376
- const allOption = {
44377
- title: allItemsLabel,
44378
- type: 'option',
44379
- value: ALL_ELEMENTS_VALUE,
44380
- };
44381
- if (!selectOptions || selectOptions.length === 0) return [allOption,];
44382
- return [allOption, {
44383
- type: 'divider',
44384
- }, ...selectOptions,];
44385
- }, [allItemsLabel, isOptional, selectOptions,],);
44550
+ const selectOptionsIncludingOptional = useMemo(() => withAllOption(selectOptions, isOptional, allItemsLabel,), [
44551
+ allItemsLabel,
44552
+ isOptional,
44553
+ selectOptions,
44554
+ ],);
44386
44555
  const onChange = useCallback2((event) => {
44387
44556
  if (!(event.target instanceof HTMLSelectElement)) return;
44388
44557
  const selectedValue = event.target.value;
@@ -44440,6 +44609,21 @@ function useCollectionSelectOptions({
44440
44609
  },);
44441
44610
  }, [records, titleId, slugId,],);
44442
44611
  }
44612
+ function withAllOption(options, isOptional, allItemsLabel, includeDivider = true,) {
44613
+ if (isOptional !== true || !allItemsLabel) return options;
44614
+ const allOption = {
44615
+ title: allItemsLabel,
44616
+ type: 'option',
44617
+ value: ALL_ELEMENTS_VALUE,
44618
+ };
44619
+ if (!options || options.length === 0) return [allOption,];
44620
+ if (includeDivider) {
44621
+ return [allOption, {
44622
+ type: 'divider',
44623
+ }, ...options,];
44624
+ }
44625
+ return [allOption, ...options,];
44626
+ }
44443
44627
  function rejectPending(pendingTimers, pendingPromises,) {
44444
44628
  pendingTimers.forEach((t) => clearTimeout(t,));
44445
44629
  pendingTimers.clear();
@@ -45817,7 +46001,7 @@ var ltrStrategy = (insetProp, lengthProp, viewportLengthProp, paddingStartProp,
45817
46001
  var xStrategy = /* @__PURE__ */ (() => ltrStrategy('offsetLeft', 'offsetWidth', 'innerWidth', 'paddingLeft', 'right',))();
45818
46002
  var yStrategy = /* @__PURE__ */ (() => ltrStrategy('offsetTop', 'offsetHeight', 'innerHeight', 'paddingTop', 'bottom',))();
45819
46003
  function offsetRight(element, container,) {
45820
- const containerWidth = container?.offsetWidth ?? window.innerWidth;
46004
+ const containerWidth = container?.offsetWidth ?? __unframerWindow2.innerWidth;
45821
46005
  return containerWidth - (element.offsetLeft + element.offsetWidth);
45822
46006
  }
45823
46007
  var xRtlStrategy = /* @__PURE__ */ (() => ({
@@ -46019,8 +46203,8 @@ function useFocusNavigation(containerRef, axis, focusOffset, offset, setHasFocus
46019
46203
  setHasFocus(true,);
46020
46204
  isFocusTrapped.current = true;
46021
46205
  applyFocusOffset();
46022
- window.addEventListener('focus', detectTrapEnd, eventOptionsWithCapture,);
46023
- window.addEventListener('blur', detectTrapEnd, eventOptionsWithCapture,);
46206
+ __unframerWindow2.addEventListener('focus', detectTrapEnd, eventOptionsWithCapture,);
46207
+ __unframerWindow2.addEventListener('blur', detectTrapEnd, eventOptionsWithCapture,);
46024
46208
  container.addEventListener('keydown', handleFocusNavigation, eventOptions,);
46025
46209
  };
46026
46210
  const detectTrapEnd = (event) => {
@@ -46033,8 +46217,8 @@ function useFocusNavigation(containerRef, axis, focusOffset, offset, setHasFocus
46033
46217
  isFocusTrapped.current = false;
46034
46218
  setHasFocus(false,);
46035
46219
  offset.set(focusOffset.get(),);
46036
- window.removeEventListener('focus', detectTrapEnd,);
46037
- window.removeEventListener('blur', detectTrapEnd,);
46220
+ __unframerWindow2.removeEventListener('focus', detectTrapEnd,);
46221
+ __unframerWindow2.removeEventListener('blur', detectTrapEnd,);
46038
46222
  container.removeEventListener('keydown', handleFocusNavigation,);
46039
46223
  };
46040
46224
  const handleFocus = (event) => {
@@ -46050,13 +46234,13 @@ function useFocusNavigation(containerRef, axis, focusOffset, offset, setHasFocus
46050
46234
  if (detectionEnabled) return;
46051
46235
  detectionEnabled = true;
46052
46236
  container.addEventListener('focus', handleFocus, eventOptionsWithCapture,);
46053
- window.addEventListener('pointermove', handlePointerMove, eventOptions,);
46237
+ __unframerWindow2.addEventListener('pointermove', handlePointerMove, eventOptions,);
46054
46238
  };
46055
46239
  const handlePointerMove = () => {
46056
46240
  if (!detectionEnabled) return;
46057
46241
  detectionEnabled = false;
46058
46242
  container.removeEventListener('focus', handleFocus, true,);
46059
- window.removeEventListener('pointermove', handlePointerMove, eventOptions,);
46243
+ __unframerWindow2.removeEventListener('pointermove', handlePointerMove, eventOptions,);
46060
46244
  };
46061
46245
  const handleAriaHiddenClicks = (event) => {
46062
46246
  const target = event.target;
@@ -46065,7 +46249,7 @@ function useFocusNavigation(containerRef, axis, focusOffset, offset, setHasFocus
46065
46249
  ariaHiddenAncestor.removeAttribute('aria-hidden',);
46066
46250
  }
46067
46251
  };
46068
- window.addEventListener('keydown', detectFocusTrapEnable, eventOptions,);
46252
+ __unframerWindow2.addEventListener('keydown', detectFocusTrapEnable, eventOptions,);
46069
46253
  container.addEventListener('pointerdown', handleAriaHiddenClicks, eventOptions,);
46070
46254
  return () => {
46071
46255
  abortController.abort();
@@ -46188,7 +46372,7 @@ function TickerComponent({
46188
46372
  const isReducedMotion = useReducedMotion();
46189
46373
  const updateMeasurements = () => {
46190
46374
  if (!internalContainerRef.current || !listRef.current) return;
46191
- const direction = window.getComputedStyle(internalContainerRef.current,).direction;
46375
+ const direction = __unframerWindow2.getComputedStyle(internalContainerRef.current,).direction;
46192
46376
  const {
46193
46377
  measureItem,
46194
46378
  lengthProp,
@@ -46211,13 +46395,13 @@ function TickerComponent({
46211
46395
  hasItemSizeChanged = true;
46212
46396
  }
46213
46397
  }
46214
- const containerLength = Math.min(container[lengthProp], window[viewportLengthProp],);
46215
- let visibleLength = overflow ? window[viewportLengthProp] : containerLength;
46398
+ const containerLength = Math.min(container[lengthProp], __unframerWindow2[viewportLengthProp],);
46399
+ let visibleLength = overflow ? __unframerWindow2[viewportLengthProp] : containerLength;
46216
46400
  if (safeMargin > 0) {
46217
46401
  visibleLength += safeMargin * 2;
46218
46402
  }
46219
46403
  const totalItemLength = calcTotalItemLength(itemPositions,);
46220
- const computedContainerStyle = window.getComputedStyle(container,);
46404
+ const computedContainerStyle = __unframerWindow2.getComputedStyle(container,);
46221
46405
  const containerPaddingStart = parseInt(computedContainerStyle[paddingStartProp] ?? 0,);
46222
46406
  const containerPaddingEnd = parseInt(computedContainerStyle[paddingEndProp] ?? 0,);
46223
46407
  const inset2 = overflow ? getCumulativeInset(allItems[0],) : containerPaddingStart;
@@ -47778,22 +47962,22 @@ var MapWithHash = class extends Map {
47778
47962
  };
47779
47963
  var cachedServiceMap;
47780
47964
  function getServiceMap() {
47781
- if (typeof window === 'undefined') return {};
47965
+ if (typeof __unframerWindow2 === 'undefined') return {};
47782
47966
  if (cachedServiceMap) return cachedServiceMap;
47783
47967
  cachedServiceMap = extractServiceMap();
47784
47968
  return cachedServiceMap;
47785
47969
  }
47786
47970
  function extractServiceMap() {
47787
- const location = window.location;
47788
- let services = window?.bootstrap?.services;
47971
+ const location = __unframerWindow2.location;
47972
+ let services = __unframerWindow2?.bootstrap?.services;
47789
47973
  if (services) {
47790
47974
  return services;
47791
47975
  }
47792
47976
  let topOrigin;
47793
47977
  try {
47794
- const topWindow = window.top;
47978
+ const topWindow = __unframerWindow2.top;
47795
47979
  topOrigin = topWindow.location.origin;
47796
- services = window.top?.bootstrap?.services;
47980
+ services = __unframerWindow2.top?.bootstrap?.services;
47797
47981
  if (services) {
47798
47982
  return services;
47799
47983
  }
@@ -48468,11 +48652,11 @@ function getAssetOwnerType(asset,) {
48468
48652
  async function loadFontsWithOpenType(source,) {
48469
48653
  switch (source) {
48470
48654
  case 'google': {
48471
- const supportedFonts = await import('./framer-chunks/google-AG6EYFMK-VXMK4LWI.js');
48655
+ const supportedFonts = await import('./framer-chunks/google-VQ4ZP4WR-C2T2J24Z.js');
48472
48656
  return supportedFonts.default;
48473
48657
  }
48474
48658
  case 'fontshare': {
48475
- const supportedFonts = await import('./framer-chunks/fontshare-LTYJMI6Q-NLLRF2SZ.js');
48659
+ const supportedFonts = await import('./framer-chunks/fontshare-Q7VOJ3QT-LXRXXTSM.js');
48476
48660
  return supportedFonts.default;
48477
48661
  }
48478
48662
  default:
@@ -48482,15 +48666,15 @@ async function loadFontsWithOpenType(source,) {
48482
48666
  async function loadFontToOpenTypeFeatures(source,) {
48483
48667
  switch (source) {
48484
48668
  case 'google': {
48485
- const features = await import('./framer-chunks/google-EJBUPU3N-JOFVHSFQ.js');
48669
+ const features = await import('./framer-chunks/google-TRAPONMP-UUEFJ4ZF.js');
48486
48670
  return features.default;
48487
48671
  }
48488
48672
  case 'fontshare': {
48489
- const features = await import('./framer-chunks/fontshare-XMKN2FOD-GVCUQL37.js');
48673
+ const features = await import('./framer-chunks/fontshare-LJWOE5KG-36DNQHCT.js');
48490
48674
  return features.default;
48491
48675
  }
48492
48676
  case 'framer': {
48493
- const features = await import('./framer-chunks/framer-font-D6RMCRV4-5YYG4HIW.js');
48677
+ const features = await import('./framer-chunks/framer-font-G73BNA7N-B3OPPZB7.js');
48494
48678
  return features.default;
48495
48679
  }
48496
48680
  default:
@@ -49034,10 +49218,10 @@ function loadVariationAxes(source,) {
49034
49218
  const axes = (async () => {
49035
49219
  switch (source) {
49036
49220
  case 'google': {
49037
- return (await import('./framer-chunks/google-CQFUID6E-OQQXADED.js')).default;
49221
+ return (await import('./framer-chunks/google-LLNWFNMY-PWPZVCX5.js')).default;
49038
49222
  }
49039
49223
  case 'fontshare': {
49040
- return (await import('./framer-chunks/fontshare-X63NXWGB-NL5Q3YUU.js')).default;
49224
+ return (await import('./framer-chunks/fontshare-MHXFPDHS-VQYPAYVC.js')).default;
49041
49225
  }
49042
49226
  default:
49043
49227
  assertNever(source,);
@@ -49983,13 +50167,13 @@ function useEscToClose(isOpen, close,) {
49983
50167
  close();
49984
50168
  }
49985
50169
  }
49986
- window.addEventListener('keyup', handleKeyDown,);
49987
- return () => window.removeEventListener('keyup', handleKeyDown,);
50170
+ __unframerWindow2.addEventListener('keyup', handleKeyDown,);
50171
+ return () => __unframerWindow2.removeEventListener('keyup', handleKeyDown,);
49988
50172
  }, [isOpen, close,],);
49989
50173
  }
49990
50174
  function calculateImageWidth(aspectRatio2, maxWidth, totalHorizontalPadding, totalVerticalPadding,) {
49991
- const availableHeight = window.innerHeight - totalVerticalPadding;
49992
- const availableWidth = Math.min(window.innerWidth - totalHorizontalPadding, maxWidth,);
50175
+ const availableHeight = __unframerWindow2.innerHeight - totalVerticalPadding;
50176
+ const availableWidth = Math.min(__unframerWindow2.innerWidth - totalHorizontalPadding, maxWidth,);
49993
50177
  const maxWidthBasedOnHeight = availableHeight / aspectRatio2;
49994
50178
  return Math.min(availableWidth, maxWidthBasedOnHeight,);
49995
50179
  }
@@ -49998,7 +50182,7 @@ function optimisticallyDecodeImage(image, {
49998
50182
  height,
49999
50183
  },) {
50000
50184
  if (!image.src || !image.srcSet) return;
50001
- const i = new window.Image();
50185
+ const i = new __unframerWindow2.Image();
50002
50186
  i.src = image.src;
50003
50187
  i.srcset = image.srcSet;
50004
50188
  i.sizes = image.sizes || '';
@@ -50888,7 +51072,7 @@ var DeprecatedRichTextInner = /* @__PURE__ */ React.forwardRef(function Text(pro
50888
51072
  if (container === null) return;
50889
51073
  function interceptPageLinks(event,) {
50890
51074
  const anchorElement = findAnchorElement(event.target, layoutRef.current,);
50891
- if (event.metaKey || !navigate || !anchorElement || anchorElement.getAttribute('target',) === '_blank') {
51075
+ if (isCommandKeyPressed(event,) || !navigate || !anchorElement || anchorElement.getAttribute('target',) === '_blank') {
50892
51076
  return;
50893
51077
  }
50894
51078
  const didNavigate = navigateFromAttributes(navigate, anchorElement, implicitPathVariables,);
@@ -52651,7 +52835,7 @@ var TextInner = /* @__PURE__ */ React42.forwardRef(function Text2(props, forward
52651
52835
  const implicitPathVariables = useImplicitPathVariables();
52652
52836
  const interceptPageLinks = React42.useCallback((event) => {
52653
52837
  const anchorElement = findAnchorElement(event.target, layoutRef.current,);
52654
- if (event.metaKey || !navigate || !anchorElement) return;
52838
+ if (isCommandKeyPressed(event,) || !navigate || !anchorElement) return;
52655
52839
  const didNavigate = navigateFromAttributes(navigate, anchorElement, implicitPathVariables,);
52656
52840
  if (didNavigate) {
52657
52841
  event.preventDefault();
@@ -52923,7 +53107,7 @@ var TextComponent = /* @__PURE__ */ (() => {
52923
53107
  alignment: void 0,
52924
53108
  verticalAlignment: 'top',
52925
53109
  shadows: [],
52926
- font: '16px ' + deviceFont(),
53110
+ font: '16px Arial',
52927
53111
  },),
52928
53112
  __publicField(_a, 'defaultProps', {
52929
53113
  ...Layer.defaultProps,
@@ -53388,8 +53572,8 @@ var SVGRoot = (props) => {
53388
53572
  viewBox: `0 0 ${width} ${height}`,
53389
53573
  ref,
53390
53574
  };
53391
- const needsScale = isSafari() ? window.devicePixelRatio !== 1 : window.devicePixelRatio === 1;
53392
- const needsTranslate = window.devicePixelRatio === 1;
53575
+ const needsScale = isSafari() ? __unframerWindow2.devicePixelRatio !== 1 : __unframerWindow2.devicePixelRatio === 1;
53576
+ const needsTranslate = __unframerWindow2.devicePixelRatio === 1;
53393
53577
  if (!needsScale && !needsTranslate) {
53394
53578
  return /* @__PURE__ */ jsx('svg', {
53395
53579
  role: 'presentation',
@@ -54067,6 +54251,58 @@ function withPerformanceMarks(prefix3, callback,) {
54067
54251
  performance.mark(markEnd,);
54068
54252
  performance.measure(prefix3, markStart, markEnd,);
54069
54253
  }
54254
+ function deviceOS() {
54255
+ if (isMacOS()) return 'macos';
54256
+ if (isIOS()) return 'ios';
54257
+ if (isAndroid()) return 'android';
54258
+ if (isWindows()) return 'windows';
54259
+ return void 0;
54260
+ }
54261
+ function deviceFont(os,) {
54262
+ if (!os) {
54263
+ os = deviceOS();
54264
+ }
54265
+ const fonts = {
54266
+ apple: '-apple-system, BlinkMacSystemFont, SF Pro Text, SF UI Text, Helvetica Neue',
54267
+ google: 'Roboto, Helvetica Neue',
54268
+ microsoft: 'Segoe UI, Helvetica Neue',
54269
+ };
54270
+ if (os === 'macos') return fonts.apple;
54271
+ if (os === 'ios') return fonts.apple;
54272
+ if (os === 'android') return fonts.google;
54273
+ if (os === 'windows') return fonts.microsoft;
54274
+ return fonts.apple;
54275
+ }
54276
+ var environment = {
54277
+ chromeMainVersion,
54278
+ deviceFont,
54279
+ deviceOS,
54280
+ deviceType,
54281
+ isAndroid,
54282
+ isBrowser: isBrowser2,
54283
+ isChrome,
54284
+ isDataUrl,
54285
+ isDesktop,
54286
+ isEdge,
54287
+ isEmbedded,
54288
+ isFileUrl,
54289
+ isFirefox,
54290
+ isFramerX,
54291
+ isIOS,
54292
+ isLocalServerUrl,
54293
+ isLocalUrl,
54294
+ isMacOS,
54295
+ isMobile,
54296
+ isPhone,
54297
+ isRelativeUrl,
54298
+ isSafari,
54299
+ isTablet,
54300
+ isTest,
54301
+ isTouch,
54302
+ isWebKit,
54303
+ isWindows,
54304
+ safariVersion,
54305
+ };
54070
54306
  function loadJSON(url,) {
54071
54307
  return fetch(url, {
54072
54308
  mode: 'cors',
@@ -54184,6 +54420,14 @@ function useInitialRouteComponent(routes, homeNodeId,) {
54184
54420
  }, [],);
54185
54421
  return RouteComponent;
54186
54422
  }
54423
+ function getLoader(component,) {
54424
+ return component.loader;
54425
+ }
54426
+ function forwardLoader(component, props, context,) {
54427
+ const loader = getLoader(component,);
54428
+ if (!loader) return Promise.resolve(void 0,);
54429
+ return loader.load(props, context,);
54430
+ }
54187
54431
  var package_default = {
54188
54432
  name: 'framer',
54189
54433
  version: '2.4.1',
@@ -54200,7 +54444,7 @@ var package_default = {
54200
54444
  watch: 'jest --watch',
54201
54445
  },
54202
54446
  dependencies: {
54203
- devalue: '^5.4.2',
54447
+ devalue: '^5.6.2',
54204
54448
  eventemitter3: '^5.0.1',
54205
54449
  fontfaceobserver: '2.2.0',
54206
54450
  'hoist-non-react-statics': '^3.3.2',
@@ -54402,6 +54646,7 @@ export {
54402
54646
  FormContainer,
54403
54647
  FormPlainTextInput2 as FormPlainTextInput,
54404
54648
  FormSelect,
54649
+ forwardLoader,
54405
54650
  fraction,
54406
54651
  Frame,
54407
54652
  frame,