unframer 2.26.0 → 2.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/css.d.ts.map +1 -1
  2. package/dist/css.js +7 -6
  3. package/dist/css.js.map +1 -1
  4. package/dist/exporter.d.ts.map +1 -1
  5. package/dist/exporter.js +0 -1
  6. package/dist/exporter.js.map +1 -1
  7. package/dist/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.d.ts +115 -0
  8. package/dist/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.d.ts.map +1 -0
  9. package/dist/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.js +8 -0
  10. package/dist/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.js.map +1 -0
  11. package/dist/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.d.ts +781 -0
  12. package/dist/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.d.ts.map +1 -0
  13. package/dist/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.js +8 -0
  14. package/dist/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.js.map +1 -0
  15. package/dist/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.d.ts +634 -0
  16. package/dist/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.d.ts.map +1 -0
  17. package/dist/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.js +8 -0
  18. package/dist/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.js.map +1 -0
  19. package/dist/framer-chunks/google-42BCYVR5-QT55MZO3.d.ts +3231 -0
  20. package/dist/framer-chunks/google-42BCYVR5-QT55MZO3.d.ts.map +1 -0
  21. package/dist/framer-chunks/google-42BCYVR5-QT55MZO3.js +8 -0
  22. package/dist/framer-chunks/google-42BCYVR5-QT55MZO3.js.map +1 -0
  23. package/dist/framer.d.ts.map +1 -1
  24. package/dist/framer.js +745 -443
  25. package/dist/framer.js.map +1 -1
  26. package/dist/react.d.ts.map +1 -1
  27. package/dist/react.js +18 -0
  28. package/dist/react.js.map +1 -1
  29. package/dist/version.d.ts +1 -1
  30. package/dist/version.js +1 -1
  31. package/esm/css.d.ts.map +1 -1
  32. package/esm/css.js +7 -6
  33. package/esm/css.js.map +1 -1
  34. package/esm/exporter.d.ts.map +1 -1
  35. package/esm/exporter.js +1 -2
  36. package/esm/exporter.js.map +1 -1
  37. package/esm/framer-chunks/chunk-22NYTOTD.d.ts +14 -0
  38. package/esm/framer-chunks/chunk-22NYTOTD.d.ts.map +1 -0
  39. package/esm/framer-chunks/chunk-22NYTOTD.js +99 -0
  40. package/esm/framer-chunks/chunk-22NYTOTD.js.map +1 -0
  41. package/esm/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.d.ts +115 -0
  42. package/esm/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.d.ts.map +1 -0
  43. package/esm/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.js +5 -0
  44. package/esm/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.js.map +1 -0
  45. package/esm/framer-chunks/fontshare-GSJIWLGZ-7BHTUG6K.d.ts +115 -0
  46. package/esm/framer-chunks/fontshare-GSJIWLGZ-7BHTUG6K.d.ts.map +1 -0
  47. package/esm/framer-chunks/fontshare-GSJIWLGZ-7BHTUG6K.js +5 -0
  48. package/esm/framer-chunks/fontshare-GSJIWLGZ-7BHTUG6K.js.map +1 -0
  49. package/esm/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.d.ts +781 -0
  50. package/esm/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.d.ts.map +1 -0
  51. package/esm/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.js +5 -0
  52. package/esm/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.js.map +1 -0
  53. package/esm/framer-chunks/fontshare-SSHBFVID-ZX5Y6FJ4.d.ts +781 -0
  54. package/esm/framer-chunks/fontshare-SSHBFVID-ZX5Y6FJ4.d.ts.map +1 -0
  55. package/esm/framer-chunks/fontshare-SSHBFVID-ZX5Y6FJ4.js +5 -0
  56. package/esm/framer-chunks/fontshare-SSHBFVID-ZX5Y6FJ4.js.map +1 -0
  57. package/esm/framer-chunks/fontshare-X6MCIXW5-FUMOBUA2.d.ts +634 -0
  58. package/esm/framer-chunks/fontshare-X6MCIXW5-FUMOBUA2.d.ts.map +1 -0
  59. package/esm/framer-chunks/fontshare-X6MCIXW5-FUMOBUA2.js +5 -0
  60. package/esm/framer-chunks/fontshare-X6MCIXW5-FUMOBUA2.js.map +1 -0
  61. package/esm/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.d.ts +634 -0
  62. package/esm/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.d.ts.map +1 -0
  63. package/esm/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.js +5 -0
  64. package/esm/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.js.map +1 -0
  65. package/esm/framer-chunks/framer-font-TNC5DMGA-XVG7BST3.d.ts +18 -0
  66. package/esm/framer-chunks/framer-font-TNC5DMGA-XVG7BST3.d.ts.map +1 -0
  67. package/esm/framer-chunks/framer-font-TNC5DMGA-XVG7BST3.js +5 -0
  68. package/esm/framer-chunks/framer-font-TNC5DMGA-XVG7BST3.js.map +1 -0
  69. package/esm/framer-chunks/google-3GQMHAEU-KEOTHDV6.d.ts +9827 -0
  70. package/esm/framer-chunks/google-3GQMHAEU-KEOTHDV6.d.ts.map +1 -0
  71. package/esm/framer-chunks/google-3GQMHAEU-KEOTHDV6.js +5 -0
  72. package/esm/framer-chunks/google-3GQMHAEU-KEOTHDV6.js.map +1 -0
  73. package/esm/framer-chunks/google-42BCYVR5-PDCHFNPY.d.ts +3231 -0
  74. package/esm/framer-chunks/google-42BCYVR5-PDCHFNPY.d.ts.map +1 -0
  75. package/esm/framer-chunks/google-42BCYVR5-PDCHFNPY.js +5 -0
  76. package/esm/framer-chunks/google-42BCYVR5-PDCHFNPY.js.map +1 -0
  77. package/esm/framer-chunks/google-42BCYVR5-QT55MZO3.d.ts +3231 -0
  78. package/esm/framer-chunks/google-42BCYVR5-QT55MZO3.d.ts.map +1 -0
  79. package/esm/framer-chunks/google-42BCYVR5-QT55MZO3.js +5 -0
  80. package/esm/framer-chunks/google-42BCYVR5-QT55MZO3.js.map +1 -0
  81. package/esm/framer-chunks/google-LHIHIYDX-FZZ6UXE7.d.ts +1499 -0
  82. package/esm/framer-chunks/google-LHIHIYDX-FZZ6UXE7.d.ts.map +1 -0
  83. package/esm/framer-chunks/google-LHIHIYDX-FZZ6UXE7.js +5 -0
  84. package/esm/framer-chunks/google-LHIHIYDX-FZZ6UXE7.js.map +1 -0
  85. package/esm/framer.d.ts.map +1 -1
  86. package/esm/framer.js +739 -439
  87. package/esm/framer.js.map +1 -1
  88. package/esm/react.d.ts.map +1 -1
  89. package/esm/react.js +18 -0
  90. package/esm/react.js.map +1 -1
  91. package/esm/version.d.ts +1 -1
  92. package/esm/version.js +1 -1
  93. package/package.json +1 -1
  94. package/src/css.ts +7 -6
  95. package/src/exporter.ts +0 -1
  96. package/src/framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.js +7 -0
  97. package/src/framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.js +7 -0
  98. package/src/framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.js +7 -0
  99. package/src/framer-chunks/google-42BCYVR5-QT55MZO3.js +7 -0
  100. package/src/framer.js +763 -449
  101. package/src/react.tsx +24 -0
  102. package/src/version.ts +1 -1
package/dist/framer.js CHANGED
@@ -193,6 +193,7 @@ exports.recordStats = recordStats;
193
193
  exports.removeHiddenBreakpointLayers = removeHiddenBreakpointLayers;
194
194
  exports.removeHiddenBreakpointLayersV2 = removeHiddenBreakpointLayersV2;
195
195
  exports.removeItem = removeItem;
196
+ exports.resize = resize;
196
197
  exports.resolveElements = resolveElements;
197
198
  exports.resolveLink = resolveLink;
198
199
  exports.resolveMotionValue = resolveMotionValue;
@@ -269,6 +270,7 @@ exports.useLocaleInfo = useLocaleInfo;
269
270
  exports.useLocalesForCurrentRoute = useLocalesForCurrentRoute;
270
271
  exports.useLocalizationInfo = useLocalizationInfo;
271
272
  exports.useMeasureLayout = useMeasureLayout;
273
+ exports.useMetadata = useMetadata;
272
274
  exports.useMotionTemplate = useMotionTemplate;
273
275
  exports.useMotionValue = useMotionValue;
274
276
  exports.useMotionValueEvent = useMotionValueEvent;
@@ -322,7 +324,7 @@ exports.withShape = withShape;
322
324
  exports.yieldToMain = yieldToMain;
323
325
  exports.Router = Router;
324
326
  const chunk_A2PMVMFI_js_1 = require("./framer-chunks/chunk-A2PMVMFI.js");
325
- // /:https://app.framerstatic.com/chunk-A6RUM2JZ.mjs
327
+ // /:https://app.framerstatic.com/chunk-BLFSVU7M.mjs
326
328
  const react_1 = require("react");
327
329
  const react_2 = require("react");
328
330
  const react_3 = require("react");
@@ -3812,6 +3814,99 @@ function getComputedStyle2(element, name) {
3812
3814
  const computedStyle = window.getComputedStyle(element);
3813
3815
  return isCSSVar(name) ? computedStyle.getPropertyValue(name) : computedStyle[name];
3814
3816
  }
3817
+ function isSVGElement(element) {
3818
+ return isObject(element) && 'ownerSVGElement' in element;
3819
+ }
3820
+ var resizeHandlers = /* @__PURE__ */ new WeakMap();
3821
+ var observer;
3822
+ var getSize = (borderBoxAxis, svgAxis, htmlAxis) => (target, borderBoxSize) => {
3823
+ if (borderBoxSize && borderBoxSize[0]) {
3824
+ return borderBoxSize[0][borderBoxAxis + 'Size'];
3825
+ }
3826
+ else if (isSVGElement(target) && 'getBBox' in target) {
3827
+ return target.getBBox()[svgAxis];
3828
+ }
3829
+ else {
3830
+ return target[htmlAxis];
3831
+ }
3832
+ };
3833
+ var getWidth = /* @__PURE__ */ getSize('inline', 'width', 'offsetWidth');
3834
+ var getHeight = /* @__PURE__ */ getSize('block', 'height', 'offsetHeight');
3835
+ function notifyTarget({ target, borderBoxSize, }) {
3836
+ var _a;
3837
+ (_a = resizeHandlers.get(target)) == null ? void 0 : _a.forEach((handler) => {
3838
+ handler(target, {
3839
+ get width() {
3840
+ return getWidth(target, borderBoxSize);
3841
+ },
3842
+ get height() {
3843
+ return getHeight(target, borderBoxSize);
3844
+ },
3845
+ });
3846
+ });
3847
+ }
3848
+ function notifyAll(entries) {
3849
+ entries.forEach(notifyTarget);
3850
+ }
3851
+ function createResizeObserver() {
3852
+ if (typeof ResizeObserver === 'undefined')
3853
+ return;
3854
+ observer = new ResizeObserver(notifyAll);
3855
+ }
3856
+ function resizeElement(target, handler) {
3857
+ if (!observer)
3858
+ createResizeObserver();
3859
+ const elements = resolveElements(target);
3860
+ elements.forEach((element) => {
3861
+ let elementHandlers = resizeHandlers.get(element);
3862
+ if (!elementHandlers) {
3863
+ elementHandlers = /* @__PURE__ */ new Set();
3864
+ resizeHandlers.set(element, elementHandlers);
3865
+ }
3866
+ elementHandlers.add(handler);
3867
+ observer == null ? void 0 : observer.observe(element);
3868
+ });
3869
+ return () => {
3870
+ elements.forEach((element) => {
3871
+ const elementHandlers = resizeHandlers.get(element);
3872
+ elementHandlers == null ? void 0 : elementHandlers.delete(handler);
3873
+ if (!(elementHandlers == null ? void 0 : elementHandlers.size)) {
3874
+ observer == null ? void 0 : observer.unobserve(element);
3875
+ }
3876
+ });
3877
+ };
3878
+ }
3879
+ var windowCallbacks = /* @__PURE__ */ new Set();
3880
+ var windowResizeHandler;
3881
+ function createWindowResizeHandler() {
3882
+ windowResizeHandler = () => {
3883
+ const info = {
3884
+ get width() {
3885
+ return window.innerWidth;
3886
+ },
3887
+ get height() {
3888
+ return window.innerHeight;
3889
+ },
3890
+ };
3891
+ windowCallbacks.forEach((callback) => callback(info));
3892
+ };
3893
+ window.addEventListener('resize', windowResizeHandler);
3894
+ }
3895
+ function resizeWindow(callback) {
3896
+ windowCallbacks.add(callback);
3897
+ if (!windowResizeHandler)
3898
+ createWindowResizeHandler();
3899
+ return () => {
3900
+ windowCallbacks.delete(callback);
3901
+ if (!windowCallbacks.size && typeof windowResizeHandler === 'function') {
3902
+ window.removeEventListener('resize', windowResizeHandler);
3903
+ windowResizeHandler = void 0;
3904
+ }
3905
+ };
3906
+ }
3907
+ function resize(a, b) {
3908
+ return typeof a === 'function' ? resizeWindow(a) : resizeElement(a, b);
3909
+ }
3815
3910
  function observeTimeline(update, timeline) {
3816
3911
  let prevProgress;
3817
3912
  const onFrame = () => {
@@ -3934,9 +4029,6 @@ function recordStats() {
3934
4029
  frame.postRender(record, true);
3935
4030
  return reportStats;
3936
4031
  }
3937
- function isSVGElement(element) {
3938
- return isObject(element) && 'ownerSVGElement' in element;
3939
- }
3940
4032
  function isSVGSVGElement(element) {
3941
4033
  return isSVGElement(element) && element.tagName === 'svg';
3942
4034
  }
@@ -8471,6 +8563,7 @@ function createProjectionNode2({ attachResizeListener, defaultParent, measureScr
8471
8563
  this.motionValue || (this.motionValue = motionValue(0));
8472
8564
  this.currentAnimation = animateSingleValue(this.motionValue, [0, 1e3,], {
8473
8565
  ...options,
8566
+ velocity: 0,
8474
8567
  isSync: true,
8475
8568
  onUpdate: (latest) => {
8476
8569
  this.mixTargetDelta(latest);
@@ -9263,100 +9356,6 @@ exports.domMin = domMin;
9263
9356
  function useMotionValueEvent(value, event, callback) {
9264
9357
  (0, react_5.useInsertionEffect)(() => value.on(event, callback), [value, event, callback,]);
9265
9358
  }
9266
- var resizeHandlers = /* @__PURE__ */ new WeakMap();
9267
- var observer;
9268
- function getElementSize(target, borderBoxSize) {
9269
- if (borderBoxSize) {
9270
- const { inlineSize, blockSize, } = borderBoxSize[0];
9271
- return {
9272
- width: inlineSize,
9273
- height: blockSize,
9274
- };
9275
- }
9276
- else if (isSVGElement(target) && 'getBBox' in target) {
9277
- return target.getBBox();
9278
- }
9279
- else {
9280
- return {
9281
- width: target.offsetWidth,
9282
- height: target.offsetHeight,
9283
- };
9284
- }
9285
- }
9286
- function notifyTarget({ target, contentRect, borderBoxSize, }) {
9287
- var _a;
9288
- (_a = resizeHandlers.get(target)) == null ? void 0 : _a.forEach((handler) => {
9289
- handler({
9290
- target,
9291
- contentSize: contentRect,
9292
- get size() {
9293
- return getElementSize(target, borderBoxSize);
9294
- },
9295
- });
9296
- });
9297
- }
9298
- function notifyAll(entries) {
9299
- entries.forEach(notifyTarget);
9300
- }
9301
- function createResizeObserver() {
9302
- if (typeof ResizeObserver === 'undefined')
9303
- return;
9304
- observer = new ResizeObserver(notifyAll);
9305
- }
9306
- function resizeElement(target, handler) {
9307
- if (!observer)
9308
- createResizeObserver();
9309
- const elements = resolveElements(target);
9310
- elements.forEach((element) => {
9311
- let elementHandlers = resizeHandlers.get(element);
9312
- if (!elementHandlers) {
9313
- elementHandlers = /* @__PURE__ */ new Set();
9314
- resizeHandlers.set(element, elementHandlers);
9315
- }
9316
- elementHandlers.add(handler);
9317
- observer == null ? void 0 : observer.observe(element);
9318
- });
9319
- return () => {
9320
- elements.forEach((element) => {
9321
- const elementHandlers = resizeHandlers.get(element);
9322
- elementHandlers == null ? void 0 : elementHandlers.delete(handler);
9323
- if (!(elementHandlers == null ? void 0 : elementHandlers.size)) {
9324
- observer == null ? void 0 : observer.unobserve(element);
9325
- }
9326
- });
9327
- };
9328
- }
9329
- var windowCallbacks = /* @__PURE__ */ new Set();
9330
- var windowResizeHandler;
9331
- function createWindowResizeHandler() {
9332
- windowResizeHandler = () => {
9333
- const size = {
9334
- width: window.innerWidth,
9335
- height: window.innerHeight,
9336
- };
9337
- const info = {
9338
- target: window,
9339
- size,
9340
- contentSize: size,
9341
- };
9342
- windowCallbacks.forEach((callback) => callback(info));
9343
- };
9344
- window.addEventListener('resize', windowResizeHandler);
9345
- }
9346
- function resizeWindow(callback) {
9347
- windowCallbacks.add(callback);
9348
- if (!windowResizeHandler)
9349
- createWindowResizeHandler();
9350
- return () => {
9351
- windowCallbacks.delete(callback);
9352
- if (!windowCallbacks.size && windowResizeHandler) {
9353
- windowResizeHandler = void 0;
9354
- }
9355
- };
9356
- }
9357
- function resize(a, b) {
9358
- return typeof a === 'function' ? resizeWindow(a) : resizeElement(a, b);
9359
- }
9360
9359
  var maxElapsed2 = 50;
9361
9360
  var createAxisInfo = () => ({
9362
9361
  current: 0,
@@ -10959,7 +10958,7 @@ function stagger(duration = 0.1, { startDelay = 0, from = 0, ease: ease2, } = {}
10959
10958
  return startDelay + delay2;
10960
10959
  };
10961
10960
  }
10962
- // /:https://app.framerstatic.com/framer.C2MZBAEL.mjs
10961
+ // /:https://app.framerstatic.com/framer.6RBAH774.mjs
10963
10962
  const react_10 = require("react");
10964
10963
  const react_11 = __importDefault(require("react"));
10965
10964
  const react_12 = require("react");
@@ -14249,6 +14248,198 @@ function patchRoutesForABTesting(routes, initialRouteId) {
14249
14248
  removeRoutesVariants(routes);
14250
14249
  return resolvedInitialRouteId;
14251
14250
  }
14251
+ var mainTagId = 'main';
14252
+ var generatedPageDatasetKey = 'framerGeneratedPage';
14253
+ var searchIndexMetaName = 'framer-search-index';
14254
+ var searchIndexMetaSelector = `meta[name="${searchIndexMetaName}"]`;
14255
+ var endOfHeadStartMarker = '<!-- End of headStart -->';
14256
+ var endOfHeadEndMarker = '<!-- End of headEnd -->';
14257
+ var endOfBodyStartMarker = '<!-- End of bodyStart -->';
14258
+ var endOfBodyEndMarker = '<!-- End of bodyEnd -->';
14259
+ function assert(condition, ...msg) {
14260
+ var _a, _b;
14261
+ if (condition)
14262
+ return;
14263
+ const e = Error('Assertion Error' + (msg.length > 0 ? ': ' + msg.join(' ') : ''));
14264
+ if (e.stack) {
14265
+ try {
14266
+ const lines = e.stack.split('\n');
14267
+ if ((_a = lines[1]) == null ? void 0 : _a.includes('assert')) {
14268
+ lines.splice(1, 1);
14269
+ e.stack = lines.join('\n');
14270
+ }
14271
+ else if ((_b = lines[0]) == null ? void 0 : _b.includes('assert')) {
14272
+ lines.splice(0, 1);
14273
+ e.stack = lines.join('\n');
14274
+ }
14275
+ }
14276
+ catch { }
14277
+ }
14278
+ throw e;
14279
+ }
14280
+ function assertNever(x, error) {
14281
+ throw error || new Error(x ? `Unexpected value: ${x}` : 'Application entered invalid state');
14282
+ }
14283
+ async function insertHTML(html, referenceNode, position = 'beforeend') {
14284
+ let insertionParent, insertionPoint;
14285
+ switch (position) {
14286
+ case 'beforebegin':
14287
+ assert(referenceNode.parentNode, 'Can\'t use \'beforebegin\' with a referenceNode at the top level');
14288
+ insertionParent = referenceNode.parentNode;
14289
+ insertionPoint = referenceNode;
14290
+ break;
14291
+ case 'afterend':
14292
+ assert(referenceNode.parentNode, 'Can\'t use \'afterend\' with a referenceNode at the top level');
14293
+ insertionParent = referenceNode.parentNode;
14294
+ insertionPoint = referenceNode.nextSibling;
14295
+ break;
14296
+ case 'afterbegin':
14297
+ insertionParent = referenceNode;
14298
+ insertionPoint = referenceNode.firstChild;
14299
+ break;
14300
+ case 'beforeend':
14301
+ insertionParent = referenceNode;
14302
+ insertionPoint = null;
14303
+ break;
14304
+ default:
14305
+ assertNever(position);
14306
+ }
14307
+ const range = document.createRange();
14308
+ range.selectNodeContents(insertionParent);
14309
+ const fragment = range.createContextualFragment(html);
14310
+ await pump(fragment, insertionParent, insertionPoint);
14311
+ }
14312
+ async function pump(sourceNode, targetParent, beforeNode) {
14313
+ for (let node = sourceNode.firstChild; node; node = node.nextSibling) {
14314
+ if (node instanceof HTMLScriptElement) {
14315
+ await handleScript(node, targetParent, beforeNode);
14316
+ continue;
14317
+ }
14318
+ const clone = node.cloneNode(false);
14319
+ targetParent.insertBefore(clone, beforeNode);
14320
+ if (node.firstChild) {
14321
+ await pump(node, clone, null);
14322
+ }
14323
+ }
14324
+ }
14325
+ async function handleScript(node, parent, beforeNode) {
14326
+ var _a;
14327
+ const script = node.cloneNode(true);
14328
+ const isExternal = script.hasAttribute('src');
14329
+ const isAsync = script.hasAttribute('async');
14330
+ const isDefer = script.hasAttribute('defer');
14331
+ const isModule = ((_a = script.getAttribute('type')) == null ? void 0 : _a.toLowerCase()) === 'module';
14332
+ if (!isExternal || isAsync || isDefer || isModule) {
14333
+ parent.insertBefore(script, beforeNode);
14334
+ }
14335
+ else {
14336
+ await execExternalBlockingScript(script, parent, beforeNode);
14337
+ }
14338
+ }
14339
+ function execExternalBlockingScript(script, parent, beforeNode) {
14340
+ return new Promise((resolve) => {
14341
+ script.onload = () => resolve();
14342
+ script.onerror = () => resolve();
14343
+ parent.insertBefore(script, beforeNode);
14344
+ });
14345
+ }
14346
+ function useMetadata(metadata) {
14347
+ const { isInitialNavigation, } = useRouter();
14348
+ React2.useEffect(() => {
14349
+ if (metadata.robots) {
14350
+ let robotsTag = document.querySelector('meta[name="robots"]');
14351
+ if (robotsTag) {
14352
+ robotsTag.setAttribute('content', metadata.robots);
14353
+ }
14354
+ else {
14355
+ robotsTag = document.createElement('meta');
14356
+ robotsTag.setAttribute('name', 'robots');
14357
+ robotsTag.setAttribute('content', metadata.robots);
14358
+ document.head.appendChild(robotsTag);
14359
+ }
14360
+ }
14361
+ }, [metadata.robots,]);
14362
+ React2.useInsertionEffect(() => {
14363
+ var _a;
14364
+ document.title = metadata.title || '';
14365
+ if (metadata.viewport) {
14366
+ (_a = document.querySelector('meta[name="viewport"]')) == null ? void 0 : _a.setAttribute('content', metadata.viewport);
14367
+ }
14368
+ }, [metadata.title, metadata.viewport,]);
14369
+ React2.useEffect(() => {
14370
+ if (!isInitialNavigation)
14371
+ return;
14372
+ const mainTag = document.getElementById(mainTagId);
14373
+ const isGeneratedPage = mainTag && mainTag.dataset[generatedPageDatasetKey] !== void 0;
14374
+ if (isGeneratedPage)
14375
+ return;
14376
+ void insertCustomHTML(metadata.customHTMLHeadStart, metadata.customHTMLHeadEnd, metadata.customHTMLBodyStart, metadata.customHTMLBodyEnd);
14377
+ }, []);
14378
+ }
14379
+ async function insertCustomHTML(customHTMLHeadStart, customHTMLHeadEnd, customHTMLBodyStart, customHTMLBodyEnd) {
14380
+ let endOfHeadStart;
14381
+ let endOfHeadEnd;
14382
+ let endOfBodyStart;
14383
+ let endOfBodyEnd;
14384
+ if (customHTMLHeadStart || customHTMLHeadEnd) {
14385
+ const { start: start2, end, } = findCommentMarkers(document.head.childNodes, customHTMLHeadStart ? endOfHeadStartMarker : void 0, customHTMLHeadEnd ? endOfHeadEndMarker : void 0);
14386
+ endOfHeadStart = start2;
14387
+ endOfHeadEnd = end;
14388
+ }
14389
+ if (customHTMLBodyStart || customHTMLBodyEnd) {
14390
+ const { start: start2, end, } = findCommentMarkers(document.body.childNodes, customHTMLBodyStart ? endOfBodyStartMarker : void 0, customHTMLBodyEnd ? endOfBodyEndMarker : void 0);
14391
+ endOfBodyStart = start2;
14392
+ endOfBodyEnd = end;
14393
+ }
14394
+ if (customHTMLHeadStart && endOfHeadStart) {
14395
+ await insertHTML(customHTMLHeadStart, endOfHeadStart, 'beforebegin');
14396
+ }
14397
+ if (customHTMLHeadEnd && endOfHeadEnd) {
14398
+ await insertHTML(customHTMLHeadEnd, endOfHeadEnd, 'beforebegin');
14399
+ }
14400
+ if (customHTMLBodyStart && endOfBodyStart) {
14401
+ await insertHTML(customHTMLBodyStart, endOfBodyStart, 'beforebegin');
14402
+ }
14403
+ if (customHTMLBodyEnd && endOfBodyEnd) {
14404
+ await insertHTML(customHTMLBodyEnd, endOfBodyEnd, 'beforebegin');
14405
+ }
14406
+ }
14407
+ function findCommentMarkers(nodes, startMarker, endMarker) {
14408
+ if (!startMarker && !endMarker) {
14409
+ return {
14410
+ start: void 0,
14411
+ end: void 0,
14412
+ };
14413
+ }
14414
+ let start2;
14415
+ let end;
14416
+ let i = 0;
14417
+ let j = nodes.length - 1;
14418
+ while (i <= j) {
14419
+ const startNode = nodes[i];
14420
+ const endNode = nodes[j];
14421
+ if (!start2 && (startNode == null ? void 0 : startNode.nodeType) === Node.COMMENT_NODE && startMarker &&
14422
+ `<!--${startNode.nodeValue}-->` === startMarker) {
14423
+ start2 = startNode;
14424
+ if (!endMarker)
14425
+ break;
14426
+ }
14427
+ if (!end && (endNode == null ? void 0 : endNode.nodeType) === Node.COMMENT_NODE && endMarker &&
14428
+ `<!--${endNode.nodeValue}-->` === endMarker) {
14429
+ end = endNode;
14430
+ if (!startMarker)
14431
+ break;
14432
+ }
14433
+ if (start2 && end)
14434
+ break;
14435
+ i++;
14436
+ j--;
14437
+ }
14438
+ return {
14439
+ start: start2,
14440
+ end,
14441
+ };
14442
+ }
14252
14443
  var warningMessages = /* @__PURE__ */ new Set();
14253
14444
  function warnOnce2(keyMessage, ...rest) {
14254
14445
  if (warningMessages.has(keyMessage))
@@ -14436,6 +14627,9 @@ function roundWithOffset(value, offset) {
14436
14627
  }
14437
14628
  return Math.round(value - offset) + offset;
14438
14629
  }
14630
+ function roundToHalfPixel(value) {
14631
+ return Math.round(value * 2) / 2;
14632
+ }
14439
14633
  function Point(x, y) {
14440
14634
  return {
14441
14635
  x,
@@ -14564,30 +14758,6 @@ function Point(x, y) {
14564
14758
  }
14565
14759
  Point2.sortClockwise = sortClockwise;
14566
14760
  })(Point || (exports.Point = Point = {}));
14567
- function assert(condition, ...msg) {
14568
- var _a, _b;
14569
- if (condition)
14570
- return;
14571
- const e = Error('Assertion Error' + (msg.length > 0 ? ': ' + msg.join(' ') : ''));
14572
- if (e.stack) {
14573
- try {
14574
- const lines = e.stack.split('\n');
14575
- if ((_a = lines[1]) == null ? void 0 : _a.includes('assert')) {
14576
- lines.splice(1, 1);
14577
- e.stack = lines.join('\n');
14578
- }
14579
- else if ((_b = lines[0]) == null ? void 0 : _b.includes('assert')) {
14580
- lines.splice(0, 1);
14581
- e.stack = lines.join('\n');
14582
- }
14583
- }
14584
- catch { }
14585
- }
14586
- throw e;
14587
- }
14588
- function assertNever(x, error) {
14589
- throw error || new Error(x ? `Unexpected value: ${x}` : 'Application entered invalid state');
14590
- }
14591
14761
  var BezierDefaults = {
14592
14762
  curve: 'ease',
14593
14763
  duration: 1,
@@ -16790,7 +16960,10 @@ var Loop = class extends EventEmitter {
16790
16960
  var MainLoop = /* @__PURE__ */ new Loop();
16791
16961
  exports.MainLoop = MainLoop;
16792
16962
  var RenderEnvironment = {
16793
- target: 'PREVIEW',
16963
+ target:
16964
+ // Enable static renderer when taking screenshots
16965
+ // in screenshot-site lambda
16966
+ safeWindow.location.origin === 'https://screenshot.framer.invalid' ? 'EXPORT' : 'PREVIEW',
16794
16967
  zoom: 1,
16795
16968
  };
16796
16969
  function executeInRenderEnvironment(customEnvironment, task) {
@@ -18013,11 +18186,21 @@ var Rect = {
18013
18186
  return rect.x === other.x && rect.y === other.y && rect.width === other.width && rect.height === other.height;
18014
18187
  },
18015
18188
  /** @internal */
18189
+ from: (rect) => {
18190
+ return {
18191
+ x: rect.x,
18192
+ y: rect.y,
18193
+ width: rect.width,
18194
+ height: rect.height,
18195
+ };
18196
+ },
18197
+ /** @internal */
18016
18198
  atOrigin: (size) => {
18017
18199
  return {
18018
- ...size,
18019
18200
  x: 0,
18020
18201
  y: 0,
18202
+ width: size.width,
18203
+ height: size.height,
18021
18204
  };
18022
18205
  },
18023
18206
  /** @internal */
@@ -18181,13 +18364,13 @@ var Rect = {
18181
18364
  };
18182
18365
  },
18183
18366
  /** @internal */
18184
- boundingRectFromPoints: (ps) => {
18367
+ boundingRectFromPoints: (points) => {
18185
18368
  let minX = Infinity;
18186
18369
  let maxX = -Infinity;
18187
18370
  let minY = Infinity;
18188
18371
  let maxY = -Infinity;
18189
- for (let i = 0; i < ps.length; i++) {
18190
- const point2 = ps[i];
18372
+ for (let i = 0; i < points.length; i++) {
18373
+ const point2 = points[i];
18191
18374
  minX = Math.min(minX, point2.x);
18192
18375
  maxX = Math.max(maxX, point2.x);
18193
18376
  minY = Math.min(minY, point2.y);
@@ -18491,20 +18674,6 @@ var Rect = {
18491
18674
  y: 0,
18492
18675
  });
18493
18676
  },
18494
- /** @internal */
18495
- fromAny: (rect, defaults = {
18496
- x: 0,
18497
- y: 0,
18498
- width: 0,
18499
- height: 0,
18500
- }) => {
18501
- return {
18502
- x: rect.x || defaults.x,
18503
- y: rect.y || defaults.y,
18504
- width: rect.width || defaults.width,
18505
- height: rect.height || defaults.height,
18506
- };
18507
- },
18508
18677
  delta: (a, b) => {
18509
18678
  const pointA = {
18510
18679
  x: Rect.minX(a),
@@ -19229,6 +19398,7 @@ var ControlType = /* @__PURE__ */ ((ControlType2) => {
19229
19398
  ControlType2['MultiCollectionReference'] = 'multicollectionreference';
19230
19399
  ControlType2['TrackingId'] = 'trackingid';
19231
19400
  ControlType2['VectorSetItem'] = 'vectorsetitem';
19401
+ ControlType2['LinkRelValues'] = 'linkrelvalues';
19232
19402
  return ControlType2;
19233
19403
  })(ControlType || {});
19234
19404
  exports.ControlType = ControlType;
@@ -20599,6 +20769,8 @@ function getControlDefaultValue(control) {
20599
20769
  return isObject2(control.defaultValue) ? control.defaultValue : void 0;
20600
20770
  case 'font':
20601
20771
  return isObject2(control.defaultValue) ? control.defaultValue : void 0;
20772
+ case 'linkrelvalues':
20773
+ return isArray(control.defaultValue) ? control.defaultValue : void 0;
20602
20774
  case 'object': {
20603
20775
  const value = isObject2(control.defaultValue) ? control.defaultValue : {};
20604
20776
  if (isObject2(control.controls)) {
@@ -22423,7 +22595,7 @@ function OptimizedCanvasImage({ nodeId, image, containerSize, }) {
22423
22595
  });
22424
22596
  }
22425
22597
  function BackgroundImageComponent({ layoutId, image, ...props }) {
22426
- const { motionDivToDiv, } = useLibraryFeatures();
22598
+ const { motionDivToDivBackgroundImage, } = useLibraryFeatures();
22427
22599
  if (layoutId) {
22428
22600
  layoutId += '-background';
22429
22601
  }
@@ -22437,6 +22609,7 @@ function BackgroundImageComponent({ layoutId, image, ...props }) {
22437
22609
  width: Math.round(backgroundSize * image.pixelWidth),
22438
22610
  height: Math.round(backgroundSize * image.pixelHeight),
22439
22611
  };
22612
+ const roundedBackgroundSize = roundToHalfPixel(backgroundSize * (image.pixelWidth / 2));
22440
22613
  const imageSource = runtime.useImageSource(image, tileSize);
22441
22614
  fallbackWrapperStyles = {
22442
22615
  ...wrapperStyle,
@@ -22445,15 +22618,7 @@ function BackgroundImageComponent({ layoutId, image, ...props }) {
22445
22618
  backgroundPosition: cssObjectPosition(image.positionX, image.positionY),
22446
22619
  opacity: void 0,
22447
22620
  border: 0,
22448
- // image.backgroundSize is a floating point number like 0.05
22449
- // so we need to multiply it by the pixelWidth to get the pixel
22450
- // value for the backgroundSize so that the size of the tile is
22451
- // a function of the image width + background size percentage.
22452
- // e.g image is 64px/64px and backgroundSize is 0.05, the tile size
22453
- // should be 3.2px
22454
- // We divide the pixel width by 2 because we assume that most designers
22455
- // will be working with 2x (retina) assets.
22456
- backgroundSize: `${(backgroundSize * (image.pixelWidth / 2)).toFixed(2)}px auto`,
22621
+ backgroundSize: `${roundedBackgroundSize}px auto`,
22457
22622
  };
22458
22623
  imageNode = null;
22459
22624
  needsMotion = true;
@@ -22484,7 +22649,7 @@ function BackgroundImageComponent({ layoutId, image, ...props }) {
22484
22649
  ...wrapperStyle,
22485
22650
  ...getPlaceholderStyle(),
22486
22651
  };
22487
- return needsMotion || !motionDivToDiv
22652
+ return needsMotion || !motionDivToDivBackgroundImage
22488
22653
  ? /* @__PURE__ */ (0, jsx_runtime_1.jsx)(motion.div, {
22489
22654
  layoutId,
22490
22655
  style: style2,
@@ -22634,7 +22799,15 @@ var isFirefox = () => safeNavigator && /Firefox\/\d+\.\d+$/u.test(safeNavigator.
22634
22799
  var isFramerX = () => safeNavigator && /FramerX/u.test(safeNavigator.userAgent);
22635
22800
  var isEdge = () => safeNavigator && /Edg\//u.test(safeNavigator.userAgent);
22636
22801
  var isAndroid = () => safeNavigator && /android/iu.test(safeNavigator.userAgent);
22637
- var isIOS = () => safeNavigator && /iPhone|iPod|iPad/iu.test(safeNavigator.platform);
22802
+ var iOSRegex = /iPhone|iPod|iPad/iu;
22803
+ var macIntelRegex = /MacIntel/iu;
22804
+ var isIOS = () => {
22805
+ if (!safeNavigator)
22806
+ return false;
22807
+ if (iOSRegex.test(safeNavigator.platform))
22808
+ return true;
22809
+ return macIntelRegex.test(safeNavigator.platform) && safeNavigator.maxTouchPoints && safeNavigator.maxTouchPoints > 2;
22810
+ };
22638
22811
  var isMacOS = () => safeNavigator && /Mac/u.test(safeNavigator.platform);
22639
22812
  var isWindows = () => safeNavigator && /Win/u.test(safeNavigator.platform);
22640
22813
  var isTouch = () => safeWindow.ontouchstart === null && safeWindow.ontouchmove === null && safeWindow.ontouchend === null;
@@ -23965,39 +24138,59 @@ function useStableRefWithObserver() {
23965
24138
  return ref.current;
23966
24139
  },
23967
24140
  set current(value) {
24141
+ if (value === ref.current)
24142
+ return;
24143
+ ref.current = value;
23968
24144
  if (refCallback)
23969
24145
  refCallback(value);
23970
- ref.current = value;
23971
- const needsCleanup = value === null;
23972
- callbacks.forEach((callback) => {
23973
- if (needsCleanup && cleanups.has(callback))
23974
- return;
23975
- const cleanup = callback(value);
23976
- if (cleanup)
23977
- cleanups.set(callback, cleanup);
24146
+ cleanups.forEach((cleanup, callback) => {
24147
+ if (cleanup) {
24148
+ cleanup();
24149
+ }
24150
+ else {
24151
+ callback(null);
24152
+ }
23978
24153
  });
23979
- if (needsCleanup) {
23980
- cleanups.forEach((cleanup) => cleanup());
24154
+ if (value === null) {
23981
24155
  cleanups.clear();
24156
+ callbacks.clear();
24157
+ return;
23982
24158
  }
24159
+ callbacks.forEach((callback) => {
24160
+ const cleanup = callback(value);
24161
+ cleanups.set(callback, cleanup);
24162
+ });
23983
24163
  },
23984
- observe(fn, skipCall = false) {
23985
- if (callbacks.has(fn))
23986
- return;
24164
+ /**
24165
+ * Adds `fn` to the list of callbacks to be called when the ref is updated.
24166
+ * Executes `fn` immediately if the ref already has a value.
24167
+ */
24168
+ observe(fn) {
23987
24169
  callbacks.add(fn);
23988
- if (!skipCall && ref.current)
23989
- fn(ref.current);
24170
+ const value = ref.current;
24171
+ if (value) {
24172
+ const cleanup = fn(value);
24173
+ cleanups.set(fn, cleanup);
24174
+ }
23990
24175
  },
24176
+ /**
24177
+ * Removes `fn` from the list of callbacks.
24178
+ * Runs the cleanup for `fn` if it has been called before.
24179
+ */
23991
24180
  unobserve(fn) {
23992
- if (fn)
23993
- callbacks.delete(fn);
23994
- },
23995
- cleanup(fn) {
23996
- var _a;
23997
- if (!fn || !cleanups.has(fn))
23998
- return false;
23999
- (_a = cleanups.get(fn)) == null ? void 0 : _a();
24000
- return true;
24181
+ if (!fn)
24182
+ return;
24183
+ callbacks.delete(fn);
24184
+ if (!cleanups.has(fn))
24185
+ return;
24186
+ const cleanupFn = cleanups.get(fn);
24187
+ if (cleanupFn) {
24188
+ cleanupFn();
24189
+ }
24190
+ else {
24191
+ fn(null);
24192
+ }
24193
+ cleanups.delete(fn);
24001
24194
  },
24002
24195
  };
24003
24196
  });
@@ -24014,32 +24207,22 @@ function useObserverRef(forwardedRef) {
24014
24207
  });
24015
24208
  }
24016
24209
  function useRefEffect(ref, effect, deps) {
24017
- var _a;
24018
24210
  const effectRef = (0, react_4.useRef)();
24019
24211
  const depsChangedRef = (0, react_4.useRef)();
24020
24212
  useMemoOne(() => {
24021
- if (depsChangedRef.current !== void 0)
24213
+ if (depsChangedRef.current !== void 0) {
24022
24214
  depsChangedRef.current = true;
24215
+ }
24023
24216
  }, deps ?? [{},]);
24024
24217
  if (!ref)
24025
24218
  return;
24026
24219
  const depsChanged = depsChangedRef.current;
24027
- if (depsChanged) {
24028
- depsChangedRef.current = false;
24029
- if (!ref.cleanup(effectRef.current)) {
24030
- (_a = effectRef.current) == null ? void 0 : _a.call(effectRef, null);
24031
- }
24032
- const value = ref.current;
24033
- if (value)
24034
- effect == null ? void 0 : effect(value);
24035
- }
24036
- if (effectRef.current === effect)
24220
+ if (depsChanged === false)
24037
24221
  return;
24222
+ depsChangedRef.current = false;
24038
24223
  ref.unobserve(effectRef.current);
24224
+ ref.observe(effect);
24039
24225
  effectRef.current = effect;
24040
- ref.observe(effect, depsChanged);
24041
- if (depsChangedRef.current === void 0)
24042
- depsChangedRef.current = false;
24043
24226
  }
24044
24227
  var SharedIntersectionObserver = class {
24045
24228
  constructor(options) {
@@ -26818,7 +27001,7 @@ function collectBoxShadowsForProps(props, style2) {
26818
27001
  return;
26819
27002
  style2.boxShadow = boxShadow;
26820
27003
  }
26821
- function shadowForShape(boxShadows, rect, shapeId, strokeAlpha, strokeWidth, strokeClipId, svgStrokeAttributes) {
27004
+ function shadowForShape(boxShadows, rect, shapeId, fillEnabled, strokeEnabled, strokeWidth, strokeClipId, svgStrokeAttributes) {
26822
27005
  const definition = [];
26823
27006
  let outsetElement = null;
26824
27007
  let insetElement = null;
@@ -26905,6 +27088,7 @@ function shadowForShape(boxShadows, rect, shapeId, strokeAlpha, strokeWidth, str
26905
27088
  /* @__PURE__ */ (0, jsx_runtime_1.jsx)('use', {
26906
27089
  href: shapeId.link,
26907
27090
  fill: 'black',
27091
+ fillOpacity: fillEnabled ? void 0 : 0,
26908
27092
  }),
26909
27093
  ],
26910
27094
  });
@@ -26915,9 +27099,10 @@ function shadowForShape(boxShadows, rect, shapeId, strokeAlpha, strokeWidth, str
26915
27099
  children: /* @__PURE__ */ (0, jsx_runtime_1.jsx)('use', {
26916
27100
  ...svgStrokeAttributes,
26917
27101
  fill: 'black',
27102
+ fillOpacity: fillEnabled ? void 0 : 0,
26918
27103
  stroke: 'black',
26919
- strokeOpacity: strokeAlpha <= 0 ? 0 : 1,
26920
- strokeWidth: strokeAlpha > 0 ? strokeWidth : 0,
27104
+ strokeOpacity: strokeEnabled ? void 0 : 0,
27105
+ strokeWidth: strokeEnabled ? strokeWidth : 0,
26921
27106
  xlinkHref: shapeId.link,
26922
27107
  clipPath: strokeClipId.urlLink,
26923
27108
  }),
@@ -31205,7 +31390,7 @@ function useParallax(options, ref, visibilityStyle) {
31205
31390
  const visibility = useMotionValue(adjustPosition && originalPosition.current === null ? 'hidden' : visibilityStyle);
31206
31391
  const defaultValue = useMotionValue(0);
31207
31392
  useRefEffect(ref, (element) => {
31208
- if (element === null)
31393
+ if (element === null || !parallaxTransformEnabled)
31209
31394
  return;
31210
31395
  frame.read(() => {
31211
31396
  var _a;
@@ -31217,8 +31402,12 @@ function useParallax(options, ref, visibilityStyle) {
31217
31402
  visibility.set(visibilityStyle ?? 'initial');
31218
31403
  }
31219
31404
  });
31220
- }, [adjustPosition,]);
31221
- useOnRouteChange(() => parallaxY.set(0));
31405
+ }, [adjustPosition, parallaxTransformEnabled,]);
31406
+ useOnRouteChange(() => {
31407
+ if (!parallaxTransformEnabled)
31408
+ return;
31409
+ parallaxY.set(0);
31410
+ });
31222
31411
  return {
31223
31412
  values: {
31224
31413
  y: shouldReduceMotion || !parallaxTransformEnabled ? defaultValue : parallaxY,
@@ -31816,8 +32005,13 @@ function extractFXOptions(props) {
31816
32005
  },
31817
32006
  loop: {},
31818
32007
  forwardedProps: {},
32008
+ targetOpacityValue: props.__targetOpacity,
32009
+ withPerspective: props.__perspectiveFX,
32010
+ inSmartComponent: props.__smartComponentFX,
31819
32011
  };
31820
32012
  for (const key7 in props) {
32013
+ if (key7 === '__targetOpacity' || key7 === '__perspectiveFX' || key7 === '__smartComponentFX')
32014
+ continue;
31821
32015
  const strippedKey = stripPrefixFromPrefixedKey(key7);
31822
32016
  if (strippedKey) {
31823
32017
  for (const group of groupValues) {
@@ -31876,9 +32070,7 @@ var withFX = (Component17) => react_11.default.forwardRef((props, forwardedRef)
31876
32070
  ref: forwardedRef,
31877
32071
  });
31878
32072
  }
31879
- const { parallax = {}, styleAppear = {}, styleTransform = {}, presence = {}, loop = {}, forwardedProps, } = extractFXOptions(props);
31880
- const { __targetOpacity: targetOpacityValue, __perspectiveFX: withPerspective, __smartComponentFX: inSmartComponent = false, } = props;
31881
- const targetOpacity = useMotionValue(targetOpacityValue ?? 1);
32073
+ const { parallax = {}, styleAppear = {}, styleTransform = {}, presence = {}, loop = {}, forwardedProps, targetOpacityValue, withPerspective, inSmartComponent = false, } = extractFXOptions(props);
31882
32074
  const observerRef = useObserverRef(forwardedRef);
31883
32075
  const { values: presenceEffectValues, style: presenceEffectStyle, } = usePresenceAnimation(presence, observerRef, inSmartComponent, props.style, props[optimizedAppearDataAttribute]);
31884
32076
  const { values: parallaxValues, style: parallaxStyle, } = useParallax(parallax, observerRef, (_a = props.style) == null ? void 0 : _a.visibility);
@@ -31886,16 +32078,10 @@ var withFX = (Component17) => react_11.default.forwardRef((props, forwardedRef)
31886
32078
  const { values: appearEffectValues, style: scrollAppearStyle, } = useStyleAppearEffect(styleAppear, observerRef);
31887
32079
  const { values: loopValues, style: loopStyle, } = useLoop(loop, observerRef);
31888
32080
  const fxValues = react_11.default.useMemo(() => {
32081
+ const layerOpacity = new MotionValue(targetOpacityValue ?? 1);
31889
32082
  return {
31890
32083
  scale: [appearEffectValues.scale, loopValues.scale, presenceEffectValues.scale, transformValues2.scale,],
31891
- opacity: [
31892
- appearEffectValues.opacity,
31893
- loopValues.opacity,
31894
- presenceEffectValues.opacity,
31895
- // Ensure that the layers opacity is always represented.
31896
- targetOpacity,
31897
- transformValues2.opacity,
31898
- ],
32084
+ opacity: [appearEffectValues.opacity, loopValues.opacity, presenceEffectValues.opacity, layerOpacity, transformValues2.opacity,],
31899
32085
  x: [appearEffectValues.x, loopValues.x, presenceEffectValues.x, transformValues2.x,],
31900
32086
  y: [appearEffectValues.y, loopValues.y, parallaxValues.y, presenceEffectValues.y, transformValues2.y,],
31901
32087
  rotate: [appearEffectValues.rotate, loopValues.rotate, presenceEffectValues.rotate, transformValues2.rotate,],
@@ -31909,7 +32095,7 @@ var withFX = (Component17) => react_11.default.forwardRef((props, forwardedRef)
31909
32095
  // value here on purpose.
31910
32096
  ],
31911
32097
  };
31912
- }, [targetOpacity, transformValues2, parallaxValues, appearEffectValues, loopValues, presenceEffectValues,]);
32098
+ }, [targetOpacityValue, transformValues2, parallaxValues, appearEffectValues, loopValues, presenceEffectValues,]);
31913
32099
  addMotionValueStyle(props.style, fxValues);
31914
32100
  const scale2 = useTransform(fxValues.scale, multiply);
31915
32101
  const opacity = useTransform(fxValues.opacity, multiply);
@@ -32986,7 +33172,7 @@ function motionOriginFromFloatingPosition(placement = 'bottom', alignment = 'cen
32986
33172
  assertNever(placement);
32987
33173
  }
32988
33174
  }
32989
- function getAncestorInfo(anchorRef) {
33175
+ function domReadGetAncestorInfo(anchorRef) {
32990
33176
  var _a;
32991
33177
  let el = anchorRef.current;
32992
33178
  const info = {
@@ -33006,12 +33192,11 @@ function getAncestorInfo(anchorRef) {
33006
33192
  }
33007
33193
  return info;
33008
33194
  }
33009
- function createAnimationFrameLoop(onRead) {
33010
- const startLoop = () => frame.read(onRead, true);
33011
- const cancelLoop = () => cancelFrame(onRead);
33012
- return [startLoop, cancelLoop,];
33195
+ function domReadStartAnimationFrameLoop(onRead) {
33196
+ frame.read(onRead, true);
33197
+ return () => cancelFrame(onRead);
33013
33198
  }
33014
- function createUpdateSafeArea(safeAreaRef) {
33199
+ function domWriteCreateUpdateSafeArea(safeAreaRef) {
33015
33200
  let x = 0;
33016
33201
  let y = 0;
33017
33202
  return (anchorRect, calculatedRect, placement, event) => {
@@ -33023,7 +33208,7 @@ function createUpdateSafeArea(safeAreaRef) {
33023
33208
  Object.assign(safeAreaRef.current.style, floatingPositionSafeAreaStyle(x, y, placement, anchorRect, calculatedRect));
33024
33209
  };
33025
33210
  }
33026
- function updatePosition(floatingPositionRef, position, rect) {
33211
+ function domWriteUpdatePosition(floatingPositionRef, position, rect) {
33027
33212
  if (!floatingPositionRef.current)
33028
33213
  return;
33029
33214
  Object.assign(floatingPositionRef.current.style, {
@@ -33034,7 +33219,11 @@ function updatePosition(floatingPositionRef, position, rect) {
33034
33219
  top: ((rect == null ? void 0 : rect.y) ?? 0) + (position === 'fixed' ? 0 : safeWindow.scrollY) + 'px',
33035
33220
  });
33036
33221
  }
33037
- var FloatingStackingContext = /* @__PURE__ */ react_11.default.createContext(/* @__PURE__ */ new Set());
33222
+ var FloatingStackingContext = /* @__PURE__ */ (() => {
33223
+ const Context2 = react_11.default.createContext(/* @__PURE__ */ new Set());
33224
+ Context2.displayName = 'FloatingStackingContext';
33225
+ return Context2;
33226
+ })();
33038
33227
  function useDismissFloatingLayer(anchorRef, floatingPositionRef, safeAreaRef, { safeArea, onDismiss, }) {
33039
33228
  const descendantStackingContext = useConstant2(() => /* @__PURE__ */ new Set());
33040
33229
  const ancestorStackingContext = react_11.default.useContext(FloatingStackingContext);
@@ -33141,70 +33330,98 @@ function Floating({ alignment, placement, safeArea, offsetX, offsetY, anchorRef,
33141
33330
  react_11.default.useLayoutEffect(() => {
33142
33331
  if (!refHasValue(anchorRef) || !contentRef.current || !placement || !alignment)
33143
33332
  return;
33144
- const { position, scrolls, } = getAncestorInfo(anchorRef);
33145
- const elementRect = contentRef.current.getBoundingClientRect();
33146
- const initialAnchorRect = anchorRef.current.getBoundingClientRect();
33147
33333
  const offset = {
33148
33334
  x: offsetX ?? 0,
33149
33335
  y: offsetY ?? 0,
33150
33336
  };
33151
- const getSafePlacementRect = makeGetSafePlacementFloatingPositionRect({
33152
- placement,
33153
- alignment,
33154
- offset,
33155
- collisionDetectionSize: collisionDetection
33156
- ? {
33157
- width: safeWindow.innerWidth,
33158
- height: safeWindow.innerHeight,
33159
- }
33160
- : void 0,
33161
- collisionDetectionPadding,
33162
- });
33163
- const [initialSafePlacement, initialCalculatedRect,] = getSafePlacementRect(initialAnchorRect, elementRect);
33164
- frame.update(() => {
33165
- updateOrigin(initialSafePlacement);
33166
- });
33167
- frame.render(() => {
33168
- if (!floatingPositionRef.current)
33169
- return;
33170
- updatePosition(floatingPositionRef, position, initialCalculatedRect);
33171
- });
33172
- const updateSafeArea = createUpdateSafeArea(safeAreaRef);
33173
- let anchorRect = initialAnchorRect;
33337
+ let getSafePlacementRect;
33338
+ let position;
33339
+ let cleanup;
33340
+ let cleanupHasRun = false;
33341
+ let initialUpdateHasRun = false;
33342
+ let anchorRect;
33343
+ let elementRect;
33174
33344
  let safePlacement;
33175
33345
  let calculatedRect;
33346
+ let scrolls;
33176
33347
  let latestEvent;
33177
- const onUpdate = () => {
33178
- updateOrigin(safePlacement);
33179
- };
33348
+ let updateSafeArea;
33180
33349
  const onRender = () => {
33181
- updatePosition(floatingPositionRef, position, calculatedRect);
33350
+ if (cleanupHasRun)
33351
+ return;
33352
+ domWriteUpdatePosition(floatingPositionRef, position, calculatedRect);
33182
33353
  if (safeArea)
33183
33354
  updateSafeArea(anchorRect, calculatedRect, safePlacement, latestEvent);
33184
33355
  latestEvent = void 0;
33185
33356
  };
33186
- const onRead = () => {
33357
+ const initialRender = () => {
33358
+ updateSafeArea = domWriteCreateUpdateSafeArea(safeAreaRef);
33359
+ if (latestEvent) {
33360
+ onRender();
33361
+ }
33362
+ else {
33363
+ domWriteUpdatePosition(floatingPositionRef, position, calculatedRect);
33364
+ }
33365
+ initialUpdateHasRun = true;
33366
+ };
33367
+ const onUpdate = () => {
33368
+ if (cleanupHasRun)
33369
+ return;
33370
+ updateOrigin(safePlacement);
33371
+ };
33372
+ const domReadUpdateSafePlacementAndRect = () => {
33373
+ if (!getSafePlacementRect || cleanupHasRun)
33374
+ return;
33187
33375
  anchorRect = anchorRef.current.getBoundingClientRect();
33188
33376
  const safePlacementAndRect = getSafePlacementRect(anchorRect, elementRect);
33189
33377
  safePlacement = safePlacementAndRect[0];
33190
33378
  calculatedRect = safePlacementAndRect[1];
33191
- frame.update(onUpdate);
33192
- frame.render(onRender);
33193
33379
  };
33194
- const [loop, cancelAnimationFrameLoop,] = createAnimationFrameLoop(onRead);
33195
- if (scrolls)
33196
- loop == null ? void 0 : loop();
33197
- if (!safeArea)
33198
- return () => cancelAnimationFrameLoop == null ? void 0 : cancelAnimationFrameLoop();
33380
+ frame.read(() => {
33381
+ if (cleanupHasRun || !contentRef.current)
33382
+ return;
33383
+ const ancestorInfo = domReadGetAncestorInfo(anchorRef);
33384
+ position = ancestorInfo.position;
33385
+ elementRect = contentRef.current.getBoundingClientRect();
33386
+ getSafePlacementRect = makeGetSafePlacementFloatingPositionRect({
33387
+ placement,
33388
+ alignment,
33389
+ offset,
33390
+ collisionDetectionSize: collisionDetection
33391
+ ? {
33392
+ width: safeWindow.innerWidth,
33393
+ height: safeWindow.innerHeight,
33394
+ }
33395
+ : void 0,
33396
+ collisionDetectionPadding,
33397
+ });
33398
+ domReadUpdateSafePlacementAndRect();
33399
+ frame.update(onUpdate);
33400
+ frame.render(initialRender);
33401
+ if (!ancestorInfo.scrolls)
33402
+ return;
33403
+ cleanup = domReadStartAnimationFrameLoop(domReadUpdateSafePlacementAndRect);
33404
+ });
33405
+ if (!safeArea) {
33406
+ return () => {
33407
+ cleanup == null ? void 0 : cleanup();
33408
+ cleanupHasRun = true;
33409
+ };
33410
+ }
33199
33411
  const handleMouseMove = (event) => {
33200
33412
  latestEvent = event;
33201
- frame.read(onRead);
33413
+ if (!initialUpdateHasRun)
33414
+ return;
33415
+ frame.read(domReadUpdateSafePlacementAndRect);
33416
+ frame.update(onUpdate, false, true);
33417
+ frame.render(onRender, false, true);
33202
33418
  };
33203
33419
  const anchor = anchorRef.current;
33204
33420
  anchor.addEventListener('mousemove', handleMouseMove);
33205
33421
  return () => {
33206
- cancelAnimationFrameLoop == null ? void 0 : cancelAnimationFrameLoop();
33207
33422
  anchor.removeEventListener('mousemove', handleMouseMove);
33423
+ cleanup == null ? void 0 : cleanup();
33424
+ cleanupHasRun = true;
33208
33425
  };
33209
33426
  }, [safeArea, placement, alignment, offsetX, offsetY, anchorRef, collisionDetection, collisionDetectionPadding, updateOrigin,]);
33210
33427
  const descendantContext = useDismissFloatingLayer(anchorRef, floatingPositionRef, safeAreaRef, {
@@ -33867,25 +34084,23 @@ var AnchorLinkTarget = /* @__PURE__ */ ((AnchorLinkTarget2) => {
33867
34084
  return AnchorLinkTarget2;
33868
34085
  })(AnchorLinkTarget || {});
33869
34086
  exports.AnchorLinkTarget = AnchorLinkTarget;
33870
- function propsForLink(href, openInNewTab = void 0, trackLinkClick) {
34087
+ function propsForLink(href, options) {
33871
34088
  const isInternal = isInternalURL(href);
33872
- const target = getTargetAttrValue(openInNewTab, isInternal);
33873
- const rel = !isInternal ? 'noopener' : void 0;
33874
- href = href === '' || isValidURL(href, isInternal) ? href : `https://${href}`;
33875
- return trackLinkClick
33876
- ? {
33877
- href,
33878
- target,
33879
- rel,
33880
- onClick() {
33881
- void trackLinkClick(href);
33882
- },
33883
- }
33884
- : {
33885
- href,
33886
- target,
33887
- rel,
34089
+ const props = {
34090
+ href: href === '' || isValidURL(href, isInternal) ? href : `https://${href}`,
34091
+ target: getTargetAttrValue(options == null ? void 0 : options.openInNewTab, isInternal),
34092
+ rel: !isInternal ? combineRels('noopener', options == null ? void 0 : options.rel) : void 0,
34093
+ };
34094
+ if (options == null ? void 0 : options.preserveParams) {
34095
+ props.href = forwardCurrentQueryParams(props.href ?? href);
34096
+ props['data-framer-preserve-params'] = true;
34097
+ }
34098
+ if (options == null ? void 0 : options.trackLinkClick) {
34099
+ props.onClick = () => {
34100
+ void options.trackLinkClick(href);
33888
34101
  };
34102
+ }
34103
+ return props;
33889
34104
  }
33890
34105
  function getTargetAttrValue(openInNewTab, isInternal) {
33891
34106
  if (openInNewTab !== void 0) {
@@ -33893,6 +34108,15 @@ function getTargetAttrValue(openInNewTab, isInternal) {
33893
34108
  }
33894
34109
  return isInternal ? void 0 : '_blank';
33895
34110
  }
34111
+ function combineRels(rel, otherRel) {
34112
+ if (rel && !otherRel)
34113
+ return rel;
34114
+ if (!rel && otherRel)
34115
+ return otherRel;
34116
+ if (rel && otherRel)
34117
+ return `${rel} ${otherRel}`;
34118
+ return void 0;
34119
+ }
33896
34120
  function linkInfoKey(link) {
33897
34121
  var _a, _b;
33898
34122
  return `${link.scopeId}:${link.nodeId}:${(_a = link.furthestExternalComponent) == null ? void 0 : _a.scopeId}:${(_b = link.furthestExternalComponent) == null ? void 0 : _b.nodeId}`;
@@ -34151,15 +34375,15 @@ function createOnClickLinkHandler(router, routeId, href, trackLinkClick, element
34151
34375
  performNavigation(router, routeId, elementId, combinedPathVariables, smoothScroll, track);
34152
34376
  };
34153
34377
  }
34154
- function propsForRoutePath(href, openInNewTab, router, currentRoute, trackLinkClick, implicitPathVariables, smoothScroll) {
34378
+ function propsForRoutePath(href, router, currentRoute, linkOptions, implicitPathVariables) {
34155
34379
  if (!currentRoute)
34156
- return propsForLink(href, openInNewTab, trackLinkClick);
34380
+ return propsForLink(href, linkOptions);
34157
34381
  const matchedRoute = findMatchingRouteAttributesForResolvedPath(router, href, implicitPathVariables);
34158
34382
  if (!matchedRoute)
34159
- return propsForLink(href, openInNewTab, trackLinkClick);
34383
+ return propsForLink(href, linkOptions);
34160
34384
  const { routeId, route, elementId, pathVariables, } = matchedRoute;
34161
34385
  if (!route)
34162
- return propsForLink(href, openInNewTab, trackLinkClick);
34386
+ return propsForLink(href, linkOptions);
34163
34387
  const path = getPathForRoute(route, {
34164
34388
  // If the link is resolved, we trust that the slugs are resolved.
34165
34389
  currentRoutePath: currentRoute.path,
@@ -34172,16 +34396,16 @@ function propsForRoutePath(href, openInNewTab, router, currentRoute, trackLinkCl
34172
34396
  // don't preserve query params for bots
34173
34397
  siteCanonicalURL: router.siteCanonicalURL,
34174
34398
  });
34175
- const anchorTarget = getTargetAttrValue(openInNewTab, true);
34399
+ const anchorTarget = getTargetAttrValue(linkOptions.openInNewTab, true);
34176
34400
  return {
34177
34401
  href: path,
34178
34402
  target: anchorTarget,
34179
- onClick: createOnClickLinkHandler(router, routeId, path, trackLinkClick, elementId, pathVariables, smoothScroll),
34180
- navigate: () => performNavigation(router, routeId, elementId, pathVariables, smoothScroll),
34403
+ onClick: createOnClickLinkHandler(router, routeId, path, linkOptions.trackLinkClick, elementId, pathVariables, linkOptions.smoothScroll),
34404
+ navigate: () => performNavigation(router, routeId, elementId, pathVariables, linkOptions.smoothScroll),
34181
34405
  'data-framer-page-link-current': !elementId && currentRoute.id === routeId || void 0,
34182
34406
  };
34183
34407
  }
34184
- var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ (0, react_7.forwardRef)(function Link2({ children, href, openInNewTab, smoothScroll, clickTrackingId, nodeId, scopeId, motionChild, ...restProps }, forwardedRef) {
34408
+ var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ (0, react_7.forwardRef)(function Link2({ children, href, openInNewTab, smoothScroll, clickTrackingId, relValues, preserveParams, nodeId, scopeId, motionChild, ...restProps }, forwardedRef) {
34185
34409
  const router = useRouter();
34186
34410
  const currentRoute = useCurrentRoute();
34187
34411
  const implicitPathVariables = useImplicitPathVariables();
@@ -34200,7 +34424,13 @@ var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ (0, react_7.fo
34200
34424
  if (!pageLink)
34201
34425
  return {};
34202
34426
  if (isString(pageLink)) {
34203
- return propsForRoutePath(pageLink, openInNewTab, router, currentRoute, trackLinkClick, implicitPathVariables, smoothScroll);
34427
+ return propsForRoutePath(pageLink, router, currentRoute, {
34428
+ openInNewTab,
34429
+ trackLinkClick,
34430
+ rel: relValues == null ? void 0 : relValues.join(' '),
34431
+ preserveParams,
34432
+ smoothScroll,
34433
+ }, implicitPathVariables);
34204
34434
  }
34205
34435
  const { routeId, href: resolvedHref, elementId, pathVariables, } = findMatchingRouteAttributesForWebPageLinkWithSuspense(router, currentRoute, pageLink, activeLocale, implicitPathVariables);
34206
34436
  const anchorTarget = getTargetAttrValue(openInNewTab, true);
@@ -34211,7 +34441,18 @@ var Link = /* @__PURE__ */ withChildrenCanSuspend(/* @__PURE__ */ (0, react_7.fo
34211
34441
  navigate: () => performNavigation(router, routeId, elementId, pathVariables, smoothScroll),
34212
34442
  'data-framer-page-link-current': currentRoute && linkMatchesRoute(currentRoute, pageLink, implicitPathVariables) || void 0,
34213
34443
  };
34214
- }, [href, router, activeLocale, implicitPathVariables, openInNewTab, currentRoute, smoothScroll, trackLinkClick,]);
34444
+ }, [
34445
+ href,
34446
+ router,
34447
+ activeLocale,
34448
+ implicitPathVariables,
34449
+ openInNewTab,
34450
+ currentRoute,
34451
+ smoothScroll,
34452
+ trackLinkClick,
34453
+ relValues,
34454
+ preserveParams,
34455
+ ]);
34215
34456
  const hasRef = (0, react_6.isValidElement)(children) && 'ref' in children;
34216
34457
  const observerRef = useObserverRef(hasRef ? children.ref : void 0);
34217
34458
  useRefEffect(observerRef, (node) => {
@@ -34796,6 +35037,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
34796
35037
  const scheduleSideEffect = useScheduleRenderSideEffects(dep);
34797
35038
  const startNavigation = useNavigationTransition();
34798
35039
  const monitorNextPaintAfterRender = useMonitorNextPaintAfterRender('framer-route-change');
35040
+ const isInitialNavigationRef = (0, react_4.useRef)(true);
34799
35041
  const currentRouteRef = (0, react_4.useRef)(initialRoute);
34800
35042
  const currentPathVariablesRef = (0, react_4.useRef)(initialPathVariables);
34801
35043
  const currentLocaleIdRef = (0, react_4.useRef)(initialLocaleId);
@@ -34849,6 +35091,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
34849
35091
  return;
34850
35092
  const currentStatePaginationInfo = isHistoryState(window.history.state) ? window.history.state.paginationInfo : void 0;
34851
35093
  const currentPath = localeResult.path;
35094
+ isInitialNavigationRef.current = false;
34852
35095
  currentPathVariablesRef.current = localeResult.pathVariables;
34853
35096
  currentLocaleIdRef.current = nextLocale.id;
34854
35097
  const updateURL = async (ignorePushStateWrapper = false) => {
@@ -34880,6 +35123,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
34880
35123
  monitorNextPaintAfterRender,
34881
35124
  ]);
34882
35125
  const setCurrentRouteId = (0, react_3.useCallback)((routeId, localeId, hash2, pathVariables, isHistoryTransition, nextRender, smoothScroll = false, updateURL) => {
35126
+ isInitialNavigationRef.current = false;
34883
35127
  const currentRouteId2 = currentRouteRef.current;
34884
35128
  currentRouteRef.current = routeId;
34885
35129
  currentPathVariablesRef.current = pathVariables;
@@ -34977,6 +35221,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
34977
35221
  const currentRoute = routes[currentRouteId];
34978
35222
  const currentRoutePath = currentRoute == null ? void 0 : currentRoute.path;
34979
35223
  const pageviewEventData = useSendPageView(currentRoute, currentRouteId, currentPathVariables, collectionUtils, activeLocale);
35224
+ const isInitialNavigation = isInitialNavigationRef.current;
34980
35225
  const api = (0, react_4.useMemo)(() => ({
34981
35226
  navigate,
34982
35227
  getRoute,
@@ -34987,6 +35232,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
34987
35232
  preserveQueryParams,
34988
35233
  pageviewEventData,
34989
35234
  siteCanonicalURL,
35235
+ isInitialNavigation,
34990
35236
  }), [
34991
35237
  navigate,
34992
35238
  getRoute,
@@ -34997,6 +35243,7 @@ function Router({ defaultPageStyle, disableHistory, initialPathVariables, initia
34997
35243
  preserveQueryParams,
34998
35244
  siteCanonicalURL,
34999
35245
  pageviewEventData,
35246
+ isInitialNavigation,
35000
35247
  ]);
35001
35248
  if (!currentRoute) {
35002
35249
  throw new Error(`Router cannot find route for ${currentRouteId}`);
@@ -35800,6 +36047,7 @@ var CompatibilityDatabaseCollection = class {
35800
36047
  assert(definition.type !== 'unknown', 'Invalid definition type');
35801
36048
  data2[key7] = {
35802
36049
  type: definition.type,
36050
+ // biome-ignore lint/suspicious/noExplicitAny: Existing.
35803
36051
  value,
35804
36052
  };
35805
36053
  }
@@ -36104,6 +36352,23 @@ function castRichText(value) {
36104
36352
  }
36105
36353
  return null;
36106
36354
  }
36355
+ function compareVectorSetItem(left, right) {
36356
+ const leftValue = left.value;
36357
+ const rightValue = right.value;
36358
+ if (leftValue < rightValue)
36359
+ return -1;
36360
+ if (leftValue > rightValue)
36361
+ return 1;
36362
+ return 0;
36363
+ }
36364
+ function castVectorSetItem(value) {
36365
+ switch (value == null ? void 0 : value.type) {
36366
+ case 'vectorsetitem': {
36367
+ return value;
36368
+ }
36369
+ }
36370
+ return null;
36371
+ }
36107
36372
  function compareString(left, right, collation11) {
36108
36373
  let leftValue = left.value;
36109
36374
  let rightValue = right.value;
@@ -36165,6 +36430,8 @@ var DatabaseValue = {
36165
36430
  return castRichText(value);
36166
36431
  case 'string':
36167
36432
  return castString(value);
36433
+ case 'vectorsetitem':
36434
+ return castVectorSetItem(value);
36168
36435
  case 'unknown':
36169
36436
  return value;
36170
36437
  default:
@@ -36346,6 +36613,8 @@ var DatabaseValue = {
36346
36613
  return `'${value.value}' /* Date */`;
36347
36614
  case 'richtext':
36348
36615
  return 'RichText';
36616
+ case 'vectorsetitem':
36617
+ return 'VectorSetItem';
36349
36618
  case 'responsiveimage':
36350
36619
  return 'ResponsiveImage';
36351
36620
  case 'file':
@@ -36409,6 +36678,10 @@ function compare(left, right, collation11) {
36409
36678
  assert(left.type === right.type);
36410
36679
  return compareRichText(left, right);
36411
36680
  }
36681
+ case 'vectorsetitem': {
36682
+ assert(left.type === right.type);
36683
+ return compareVectorSetItem(left, right);
36684
+ }
36412
36685
  case 'string': {
36413
36686
  assert(left.type === right.type);
36414
36687
  return compareString(left, right, collation11);
@@ -36649,7 +36922,7 @@ function calculateHash(name, ...values) {
36649
36922
  });
36650
36923
  return Hash(`${name}(${hashes.join(', ')})`);
36651
36924
  }
36652
- var RichText = class {
36925
+ var RichTextResolver = class {
36653
36926
  constructor(data2, pointer) {
36654
36927
  this.data = data2;
36655
36928
  this.pointer = pointer;
@@ -36660,6 +36933,18 @@ var RichText = class {
36660
36933
  return this.cached;
36661
36934
  }
36662
36935
  };
36936
+ var VectorSetItemResolver = class {
36937
+ constructor(data2, pointer) {
36938
+ this.data = data2;
36939
+ this.pointer = pointer;
36940
+ (0, chunk_A2PMVMFI_js_1.__publicField)(this, 'cached');
36941
+ }
36942
+ resolve() {
36943
+ assert(this.data.resolveVectorSetItem, 'Can\'t resolve vector set item.');
36944
+ this.cached ??= this.data.resolveVectorSetItem(this.pointer);
36945
+ return this.cached;
36946
+ }
36947
+ };
36663
36948
  var VIRTUAL_INDEX_FIELD = 'index';
36664
36949
  var Metadata = class extends Set {
36665
36950
  merge(other) {
@@ -36754,7 +37039,14 @@ var FieldMetadata = class {
36754
37039
  assert(this.collection, 'Rich text field must have a collection');
36755
37040
  return {
36756
37041
  type: 'richtext',
36757
- value: new RichText(this.collection.data, value.value),
37042
+ value: new RichTextResolver(this.collection.data, value.value),
37043
+ };
37044
+ }
37045
+ if ((value == null ? void 0 : value.type) === 'vectorsetitem') {
37046
+ assert(this.collection, 'Vector set item field must have a collection');
37047
+ return {
37048
+ type: 'vectorsetitem',
37049
+ value: new VectorSetItemResolver(this.collection.data, value.value),
36758
37050
  };
36759
37051
  }
36760
37052
  return value ?? null;
@@ -39758,10 +40050,14 @@ var EnforcerResolve = class _EnforcerResolve extends EnforcerNode {
39758
40050
  for (const tuple of input.tuples) {
39759
40051
  for (const field of this.fields) {
39760
40052
  const value = tuple.getValue(field);
39761
- if ((value == null ? void 0 : value.type) !== 'richtext')
39762
- continue;
39763
- assert(value.value instanceof RichText, 'Pointer must be wrapped');
39764
- void value.value.resolve();
40053
+ if ((value == null ? void 0 : value.type) === 'richtext') {
40054
+ assert(value.value instanceof RichTextResolver, 'Pointer must be wrapped');
40055
+ void value.value.resolve();
40056
+ }
40057
+ else if ((value == null ? void 0 : value.type) === 'vectorsetitem') {
40058
+ assert(value.value instanceof VectorSetItemResolver, 'Pointer must be wrapped');
40059
+ void value.value.resolve();
40060
+ }
39765
40061
  }
39766
40062
  }
39767
40063
  const collectionItems = yield Promise.all(Array.from(collections).map(async (collection) => {
@@ -40094,7 +40390,11 @@ ${stringifyQuery(query)}`);
40094
40390
  }
40095
40391
  async resolveValue(value) {
40096
40392
  if ((value == null ? void 0 : value.type) === 'richtext') {
40097
- assert(value.value instanceof RichText, 'Pointer must be wrapped');
40393
+ assert(value.value instanceof RichTextResolver, 'Pointer must be wrapped');
40394
+ return value.value.resolve();
40395
+ }
40396
+ if ((value == null ? void 0 : value.type) === 'vectorsetitem') {
40397
+ assert(value.value instanceof VectorSetItemResolver, 'Pointer must be wrapped');
40098
40398
  return value.value.resolve();
40099
40399
  }
40100
40400
  if ((value == null ? void 0 : value.type) === 'array') {
@@ -41076,9 +41376,9 @@ function useRunCallbackIfElementIsInView() {
41076
41376
  queuedMicrotask = true;
41077
41377
  queueMicrotask(() => {
41078
41378
  var _a;
41379
+ queuedMicrotask = false;
41079
41380
  if (!isInViewRef.current)
41080
41381
  return;
41081
- queuedMicrotask = false;
41082
41382
  (_a = callbackRef.current) == null ? void 0 : _a.call(callbackRef);
41083
41383
  });
41084
41384
  };
@@ -41368,6 +41668,11 @@ function tryToApplyOverride(Component17, override) {
41368
41668
  function valueWithMirroring(value, mirror) {
41369
41669
  return mirror ? wrap(0, 2, value) : value;
41370
41670
  }
41671
+ function singleFrame() {
41672
+ return new Promise((resolve) => {
41673
+ frame.postRender(() => resolve());
41674
+ });
41675
+ }
41371
41676
  var withV1StrokeFX = (Component17) => (0, react_7.forwardRef)((props, forwardedRef) => {
41372
41677
  const { strokeEffectLength, strokeEffectGap, strokeEffectOffset, strokeEffectLoop, strokeEffectTotalLength, strokeEffectLoopType, pathLengthTransition, ...restProps } = props;
41373
41678
  const isCanvas = isStaticRenderer();
@@ -41385,11 +41690,11 @@ var withV1StrokeFX = (Component17) => (0, react_7.forwardRef)((props, forwardedR
41385
41690
  while (true) {
41386
41691
  if (signal.signal.aborted)
41387
41692
  break;
41388
- const mirror = strokeEffectLoopType === 'mirror';
41693
+ const mirror = strokeEffectLoop && strokeEffectLoopType === 'mirror';
41389
41694
  const from = valueWithMirroring(index, mirror);
41390
41695
  const to = valueWithMirroring(index + 1, mirror);
41391
- await animate(offset, [from, to,], pathLengthTransition);
41392
- if (!strokeEffectLoop && !mirror)
41696
+ await Promise.all([animate(offset, [from, to,], pathLengthTransition), singleFrame(),]);
41697
+ if (!strokeEffectLoop)
41393
41698
  break;
41394
41699
  if (strokeEffectLoop && strokeEffectLoopType === 'repeat')
41395
41700
  continue;
@@ -42566,6 +42871,8 @@ var variantsNameToWeight = {
42566
42871
  extrabold: 800,
42567
42872
  'extrabold-italic': 800,
42568
42873
  black: 900,
42874
+ extralight: 100,
42875
+ 'extralight-italic': 100,
42569
42876
  'black-italic': 900,
42570
42877
  'extra-italic': 900,
42571
42878
  'extra-italic-bold': 900,
@@ -42834,7 +43141,7 @@ async function loadFontsWithOpenType(source) {
42834
43141
  return supportedFonts == null ? void 0 : supportedFonts.default;
42835
43142
  }
42836
43143
  case 'fontshare': {
42837
- const supportedFonts = await import('./framer-chunks/fontshare-G3KSKQMF-6RG7QQ3J.js');
43144
+ const supportedFonts = await import('./framer-chunks/fontshare-GSJIWLGZ-3DSFZVD7.js');
42838
43145
  return supportedFonts == null ? void 0 : supportedFonts.default;
42839
43146
  }
42840
43147
  default:
@@ -42848,7 +43155,7 @@ async function loadFontToOpenTypeFeatures(source) {
42848
43155
  return features == null ? void 0 : features.default;
42849
43156
  }
42850
43157
  case 'fontshare': {
42851
- const features = await import('./framer-chunks/fontshare-PSV545VO-KUZ52D7F.js');
43158
+ const features = await import('./framer-chunks/fontshare-SSHBFVID-JIQZ2OLR.js');
42852
43159
  return features == null ? void 0 : features.default;
42853
43160
  }
42854
43161
  case 'framer': {
@@ -43373,10 +43680,10 @@ function loadVariationAxes(source) {
43373
43680
  const axes = (async () => {
43374
43681
  switch (source) {
43375
43682
  case 'google': {
43376
- return (await import('./framer-chunks/google-LMM7WH6E-5EU2EAFQ.js')).default;
43683
+ return (await import('./framer-chunks/google-42BCYVR5-QT55MZO3.js')).default;
43377
43684
  }
43378
43685
  case 'fontshare': {
43379
- return (await import('./framer-chunks/fontshare-YYTAVKI7-DXLAG4CY.js')).default;
43686
+ return (await import('./framer-chunks/fontshare-X6MCIXW5-UOB5XTBQ.js')).default;
43380
43687
  }
43381
43688
  default:
43382
43689
  assertNever(source);
@@ -43558,11 +43865,12 @@ var FontStore = class {
43558
43865
  if (builtInFontLocator) {
43559
43866
  const fontVariant = BuiltInFontSource.parseVariant(builtInFontLocator.variant);
43560
43867
  if (isSuccessfullyParsedFontVariant(fontVariant)) {
43868
+ const family = builtInFontLocator.isVariable ? createVariableFontFamilyName(builtInFontLocator.name) : builtInFontLocator.name;
43561
43869
  return {
43562
43870
  style: fontVariant.style,
43563
43871
  weight: fontVariant.weight,
43564
43872
  variant: builtInFontLocator.variant,
43565
- family: builtInFontLocator.name,
43873
+ family,
43566
43874
  source: 'builtIn',
43567
43875
  category: void 0,
43568
43876
  };
@@ -44333,14 +44641,107 @@ var trimSlugRegExp = /^-+|-+$/gu;
44333
44641
  function slugify(value) {
44334
44642
  return value.toLowerCase().replace(nonSlugCharactersRegExp, '-').replace(trimSlugRegExp, '');
44335
44643
  }
44336
- var htmlRegExp = /[&<>'"]/gu;
44337
- var escapeHTML = (str) => str.replace(htmlRegExp, (tag) => ({
44338
- '&': '&amp;',
44339
- '<': '&lt;',
44340
- '>': '&gt;',
44341
- '\'': '&#39;',
44342
- '"': '&quot;',
44343
- })[tag] || tag);
44644
+ var frameFromElement = (element) => {
44645
+ const frame2 = Rect.fromRect(element.getBoundingClientRect());
44646
+ frame2.x = frame2.x + safeWindow.scrollX;
44647
+ frame2.y = frame2.y + safeWindow.scrollY;
44648
+ return frame2;
44649
+ };
44650
+ exports.frameFromElement = frameFromElement;
44651
+ var frameFromElements = (elements) => {
44652
+ return Rect.merge(...elements.map(frameFromElement));
44653
+ };
44654
+ exports.frameFromElements = frameFromElements;
44655
+ var convertToPageFrame = (frame2, element) => {
44656
+ const point2 = convertToPagePoint(frame2, element);
44657
+ return {
44658
+ x: point2.x,
44659
+ y: point2.y,
44660
+ width: frame2.width,
44661
+ height: frame2.height,
44662
+ };
44663
+ };
44664
+ var convertFromPageFrame = (frame2, element) => {
44665
+ const point2 = convertFromPagePoint(frame2, element);
44666
+ return {
44667
+ x: point2.x,
44668
+ y: point2.y,
44669
+ width: frame2.width,
44670
+ height: frame2.height,
44671
+ };
44672
+ };
44673
+ var getPageFrame = (element) => {
44674
+ const rect = element.getBoundingClientRect();
44675
+ return {
44676
+ x: rect.left + safeWindow.scrollX,
44677
+ y: rect.top + safeWindow.scrollY,
44678
+ width: rect.width,
44679
+ height: rect.height,
44680
+ };
44681
+ };
44682
+ var fromEventForPage = (event) => {
44683
+ return {
44684
+ x: event.pageX,
44685
+ y: event.pageY,
44686
+ };
44687
+ };
44688
+ var fromEventForClient = (event) => {
44689
+ return {
44690
+ x: event.clientX,
44691
+ y: event.clientY,
44692
+ };
44693
+ };
44694
+ var convertToPagePoint = (point2, element) => {
44695
+ const frame2 = getPageFrame(element);
44696
+ return {
44697
+ x: point2.x + frame2.x,
44698
+ y: point2.y + frame2.y,
44699
+ };
44700
+ };
44701
+ var convertFromPagePoint = (point2, element) => {
44702
+ const frame2 = getPageFrame(element);
44703
+ return {
44704
+ x: point2.x - frame2.x,
44705
+ y: point2.y - frame2.y,
44706
+ };
44707
+ };
44708
+ var dispatchKeyDownEvent = (keyCode, options = {}) => {
44709
+ const keyboardEvent = new KeyboardEvent('keydown', {
44710
+ bubbles: true,
44711
+ keyCode,
44712
+ ...options,
44713
+ });
44714
+ const activeElement = document.activeElement;
44715
+ if (activeElement) {
44716
+ activeElement.dispatchEvent(keyboardEvent);
44717
+ }
44718
+ };
44719
+ exports.dispatchKeyDownEvent = dispatchKeyDownEvent;
44720
+ var DOM = {
44721
+ frameFromElement,
44722
+ frameFromElements,
44723
+ convertToPageFrame,
44724
+ convertFromPageFrame,
44725
+ getPageFrame,
44726
+ fromEventForPage,
44727
+ fromEventForClient,
44728
+ convertToPagePoint,
44729
+ convertFromPagePoint,
44730
+ };
44731
+ exports.DOM = DOM;
44732
+ var parser;
44733
+ var supportsNativeParseHTML = /* @__PURE__ */ (() =>
44734
+ // Firefox has rare-random issues with the native parser: https://framer-team.slack.com/archives/C01B14R6E22/p1724159313153969
44735
+ !isFirefox() && typeof Document !== 'undefined' && typeof Document.parseHTMLUnsafe === 'function')();
44736
+ function domParser(html, type) {
44737
+ if (supportsNativeParseHTML && !type)
44738
+ return Document.parseHTMLUnsafe(html);
44739
+ parser ??= new DOMParser();
44740
+ return parser.parseFromString(html, type ?? 'text/html');
44741
+ }
44742
+ function escapeHTML(value) {
44743
+ return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll('\'', '&#39;');
44744
+ }
44344
44745
  var regex = /(<([a-z]+)(?:\s+(?!href[\s=])[^=\s]+=(?:'[^']*'|"[^"]*"))*)(?:(\s+href\s*=)(?:'([^']*)'|"([^"]*)"))?((?:\s+[^=\s]+=(?:'[^']*'|"[^"]*"))*>)/gi;
44345
44746
  function replaceFramerPageLinks(rawHTML, getRoute, currentRoute, implicitPathVariables) {
44346
44747
  return rawHTML.replace(regex, (original, pre1, tag, pre2, value1, value2, post) => {
@@ -44385,18 +44786,6 @@ function replaceFramerPageLinks(rawHTML, getRoute, currentRoute, implicitPathVar
44385
44786
  function isShallowEqualArray(a, b) {
44386
44787
  return a.length === b.length && a.every((v, i) => v === b[i]);
44387
44788
  }
44388
- var htmlEscapes = {
44389
- '&': '&amp;',
44390
- '<': '&lt;',
44391
- '>': '&gt;',
44392
- '"': '&quot;',
44393
- '\'': '&#39;',
44394
- };
44395
- var reUnescapedHtml = /[&<>"']/gu;
44396
- var reHasUnescapedHtml = /* @__PURE__ */ (() => new RegExp(reUnescapedHtml.source))();
44397
- function escapeHTML2(str) {
44398
- return str && reHasUnescapedHtml.test(str) ? str.replace(reUnescapedHtml, (chr) => htmlEscapes[chr] ?? '') : str || '';
44399
- }
44400
44789
  var deprecatedRichTextPlaceholder = '{{ text-placeholder }}';
44401
44790
  var richTextWrapperClassName = 'rich-text-wrapper';
44402
44791
  var DeprecatedRichText = /* @__PURE__ */ React2.forwardRef(function Text(props, forwardedRef) {
@@ -44421,14 +44810,14 @@ var DeprecatedRichText = /* @__PURE__ */ React2.forwardRef(function Text(props,
44421
44810
  }
44422
44811
  let innerHTML = '';
44423
44812
  if (textOrOverride) {
44424
- const escapedText = escapeHTML2(textOrOverride);
44813
+ const escapedText = escapeHTML(textOrOverride);
44425
44814
  innerHTML = __htmlStructure ? __htmlStructure.replace(deprecatedRichTextPlaceholder, escapedText) : `<p>${escapedText}</p>`;
44426
44815
  }
44427
44816
  else if (html) {
44428
44817
  innerHTML = html;
44429
44818
  }
44430
44819
  else if (textFromDesign) {
44431
- const escapedText = escapeHTML2(textFromDesign);
44820
+ const escapedText = escapeHTML(textFromDesign);
44432
44821
  innerHTML = __htmlStructure ? __htmlStructure.replace(deprecatedRichTextPlaceholder, escapedText) : `<p>${escapedText}</p>`;
44433
44822
  }
44434
44823
  else if (htmlFromDesign) {
@@ -44992,13 +45381,21 @@ function createLineGroups(elements) {
44992
45381
  groups2.push(currentGroup);
44993
45382
  return groups2;
44994
45383
  }
44995
- var FitText = /* @__PURE__ */ (0, react_7.forwardRef)(({ viewBoxScale, viewBox, children, ...props }, ref) => {
45384
+ var BaseSVG = /* @__PURE__ */ (0, react_7.forwardRef)(function BaseSVG2(props, forwardedRef) {
44996
45385
  return (
44997
45386
  // biome-ignore lint/a11y/noSvgWithoutTitle: FIXME: FitText might be inaccessible to screen readers because it’s wrapped in an svg
44998
45387
  /* @__PURE__ */
44999
- (0, jsx_runtime_1.jsx)(motion.svg, {
45000
- ref,
45388
+ (0, jsx_runtime_1.jsx)('svg', {
45389
+ ...props,
45390
+ ref: forwardedRef,
45391
+ children: props.children,
45392
+ }));
45393
+ });
45394
+ var MotionSVG = /* @__PURE__ */ motion.create(BaseSVG);
45395
+ var FitText = /* @__PURE__ */ (0, react_7.forwardRef)(function FitText2({ viewBoxScale, viewBox, children, ...props }, forwardedRef) {
45396
+ return /* @__PURE__ */ (0, jsx_runtime_1.jsx)(MotionSVG, {
45001
45397
  ...props,
45398
+ ref: forwardedRef,
45002
45399
  viewBox,
45003
45400
  children: /* @__PURE__ */ (0, jsx_runtime_1.jsx)(motion.foreignObject, {
45004
45401
  width: '100%',
@@ -45011,16 +45408,18 @@ var FitText = /* @__PURE__ */ (0, react_7.forwardRef)(({ viewBoxScale, viewBox,
45011
45408
  },
45012
45409
  children,
45013
45410
  }),
45014
- }));
45411
+ });
45015
45412
  });
45016
- var RichTextContainer = /* @__PURE__ */ (0, react_7.forwardRef)(function RichTextContainer2(props, ref) {
45017
- const { __fromCanvasComponent = false, _forwardedOverrideId, _forwardedOverrides, _usesDOMRect, anchorLinkOffsetY, as: _as, bottom, center, children, environment: environment2 = RenderTarget.current, fonts = [], height, isEditable = false, left, name, opacity, positionSticky, positionStickyBottom, positionStickyLeft, positionStickyRight, positionStickyTop, right, rotation = 0, style: style2, _initialStyle, stylesPresetsClassNames, text: plainText, top, verticalAlignment = 'top', visible = true, width, withExternalLayout = false, viewBox, viewBoxScale = 1, effect, ...rest } = props;
45413
+ var defaultFonts = [];
45414
+ var richTextContainerComponentType = 'RichTextContainer';
45415
+ var RichTextContainer = /* @__PURE__ */ (0, react_7.forwardRef)(function RichTextContainer2(props, forwardedRef) {
45416
+ const { __fromCanvasComponent = false, _forwardedOverrideId, _forwardedOverrides, _usesDOMRect, anchorLinkOffsetY, as: _as, bottom, center, children, environment: environment2 = RenderTarget.current, fonts = defaultFonts, height, isEditable = false, left, name, opacity, positionSticky, positionStickyBottom, positionStickyLeft, positionStickyRight, positionStickyTop, right, rotation = 0, style: style2, _initialStyle, stylesPresetsClassNames, text: plainText, top, verticalAlignment = 'top', visible = true, width, withExternalLayout = false, viewBox, viewBoxScale = 1, effect, ...rest } = props;
45018
45417
  const parentSize = useParentSize();
45019
45418
  const isOnCanvas = useIsOnFramerCanvas();
45020
45419
  const inCodeComponent = (0, react_3.useContext)(ComponentContainerContext);
45021
45420
  const layoutId = useLayoutId2(props);
45022
45421
  const fallbackRef = (0, react_4.useRef)(null);
45023
- const containerRef = ref ?? fallbackRef;
45422
+ const containerRef = forwardedRef ?? fallbackRef;
45024
45423
  useMeasureLayout(props, containerRef);
45025
45424
  useLoadFonts(fonts, __fromCanvasComponent, containerRef);
45026
45425
  (0, react_5.useInsertionEffect)(() => {
@@ -45089,6 +45488,7 @@ var RichTextContainer = /* @__PURE__ */ (0, react_7.forwardRef)(function RichTex
45089
45488
  rest.layout = 'preserve-aspect';
45090
45489
  }
45091
45490
  const Component17 = htmlElementAsMotionComponent(props.as);
45491
+ const dataFramerName = rest['data-framer-name'] ?? name;
45092
45492
  if (isString(props.viewBox)) {
45093
45493
  if (props.as !== void 0) {
45094
45494
  return /* @__PURE__ */ (0, jsx_runtime_1.jsx)(Component17, {
@@ -45097,8 +45497,8 @@ var RichTextContainer = /* @__PURE__ */ (0, react_7.forwardRef)(function RichTex
45097
45497
  style: containerStyle,
45098
45498
  layoutId,
45099
45499
  transformTemplate: template,
45100
- 'data-framer-name': rest['data-framer-name'] ?? name,
45101
- 'data-framer-component-type': 'RichTextContainer',
45500
+ 'data-framer-name': dataFramerName,
45501
+ 'data-framer-component-type': richTextContainerComponentType,
45102
45502
  children: /* @__PURE__ */ (0, jsx_runtime_1.jsx)(FitText, {
45103
45503
  viewBox,
45104
45504
  viewBoxScale,
@@ -45119,8 +45519,8 @@ var RichTextContainer = /* @__PURE__ */ (0, react_7.forwardRef)(function RichTex
45119
45519
  viewBox,
45120
45520
  viewBoxScale,
45121
45521
  transformTemplate: template,
45122
- 'data-framer-name': rest['data-framer-name'] ?? name,
45123
- 'data-framer-component-type': 'RichTextContainer',
45522
+ 'data-framer-name': dataFramerName,
45523
+ 'data-framer-component-type': richTextContainerComponentType,
45124
45524
  children: processedChildren,
45125
45525
  });
45126
45526
  }
@@ -45131,8 +45531,8 @@ var RichTextContainer = /* @__PURE__ */ (0, react_7.forwardRef)(function RichTex
45131
45531
  style: containerStyle,
45132
45532
  layoutId,
45133
45533
  transformTemplate: template,
45134
- 'data-framer-name': rest['data-framer-name'] ?? name,
45135
- 'data-framer-component-type': 'RichTextContainer',
45534
+ 'data-framer-name': dataFramerName,
45535
+ 'data-framer-component-type': richTextContainerComponentType,
45136
45536
  children: processedChildren,
45137
45537
  });
45138
45538
  });
@@ -45208,7 +45608,7 @@ function extractTextFromReactNode(node) {
45208
45608
  }
45209
45609
  return '';
45210
45610
  }
45211
- var RichText2 = /* @__PURE__ */ (0, react_7.forwardRef)(function RichText3({ children, html, htmlFromDesign, ...props }, ref) {
45611
+ var RichText = /* @__PURE__ */ (0, react_7.forwardRef)(function RichText2({ children, html, htmlFromDesign, ...props }, forwardedRef) {
45212
45612
  const content = html || children || htmlFromDesign;
45213
45613
  if (isString(content)) {
45214
45614
  if (!props.stylesPresetsClassName && isObject2(props.stylesPresetsClassNames)) {
@@ -45221,7 +45621,7 @@ var RichText2 = /* @__PURE__ */ (0, react_7.forwardRef)(function RichText3({ chi
45221
45621
  return /* @__PURE__ */ (0, jsx_runtime_1.jsx)(DeprecatedRichText, {
45222
45622
  ...props,
45223
45623
  ...contentProp,
45224
- ref,
45624
+ ref: forwardedRef,
45225
45625
  });
45226
45626
  }
45227
45627
  if (!props.stylesPresetsClassNames && isString(props.stylesPresetsClassName)) {
@@ -45241,11 +45641,11 @@ var RichText2 = /* @__PURE__ */ (0, react_7.forwardRef)(function RichText3({ chi
45241
45641
  }
45242
45642
  return /* @__PURE__ */ (0, jsx_runtime_1.jsx)(RichTextContainer, {
45243
45643
  ...props,
45244
- ref,
45644
+ ref: forwardedRef,
45245
45645
  children: (0, react_6.isValidElement)(content) ? content : void 0,
45246
45646
  });
45247
45647
  });
45248
- exports.RichText = RichText2;
45648
+ exports.RichText = RichText;
45249
45649
  function linearGradientLine(angle) {
45250
45650
  var _a, _b;
45251
45651
  const rad = angle * Math.PI / 180;
@@ -45448,104 +45848,6 @@ var ImagePatternElement = ({ id: id3, path, transform: transform2, repeat, width
45448
45848
  }, href),
45449
45849
  });
45450
45850
  };
45451
- var frameFromElement = (element) => {
45452
- const frame2 = Rect.fromRect(element.getBoundingClientRect());
45453
- frame2.x = frame2.x + safeWindow.scrollX;
45454
- frame2.y = frame2.y + safeWindow.scrollY;
45455
- return frame2;
45456
- };
45457
- exports.frameFromElement = frameFromElement;
45458
- var frameFromElements = (elements) => {
45459
- return Rect.merge(...elements.map(frameFromElement));
45460
- };
45461
- exports.frameFromElements = frameFromElements;
45462
- var convertToPageFrame = (frame2, element) => {
45463
- const point2 = convertToPagePoint(frame2, element);
45464
- return {
45465
- x: point2.x,
45466
- y: point2.y,
45467
- width: frame2.width,
45468
- height: frame2.height,
45469
- };
45470
- };
45471
- var convertFromPageFrame = (frame2, element) => {
45472
- const point2 = convertFromPagePoint(frame2, element);
45473
- return {
45474
- x: point2.x,
45475
- y: point2.y,
45476
- width: frame2.width,
45477
- height: frame2.height,
45478
- };
45479
- };
45480
- var getPageFrame = (element) => {
45481
- const rect = element.getBoundingClientRect();
45482
- return {
45483
- x: rect.left + safeWindow.scrollX,
45484
- y: rect.top + safeWindow.scrollY,
45485
- width: rect.width,
45486
- height: rect.height,
45487
- };
45488
- };
45489
- var fromEventForPage = (event) => {
45490
- return {
45491
- x: event.pageX,
45492
- y: event.pageY,
45493
- };
45494
- };
45495
- var fromEventForClient = (event) => {
45496
- return {
45497
- x: event.clientX,
45498
- y: event.clientY,
45499
- };
45500
- };
45501
- var convertToPagePoint = (point2, element) => {
45502
- const frame2 = getPageFrame(element);
45503
- return {
45504
- x: point2.x + frame2.x,
45505
- y: point2.y + frame2.y,
45506
- };
45507
- };
45508
- var convertFromPagePoint = (point2, element) => {
45509
- const frame2 = getPageFrame(element);
45510
- return {
45511
- x: point2.x - frame2.x,
45512
- y: point2.y - frame2.y,
45513
- };
45514
- };
45515
- var dispatchKeyDownEvent = (keyCode, options = {}) => {
45516
- const keyboardEvent = new KeyboardEvent('keydown', {
45517
- bubbles: true,
45518
- keyCode,
45519
- ...options,
45520
- });
45521
- const activeElement = document.activeElement;
45522
- if (activeElement) {
45523
- activeElement.dispatchEvent(keyboardEvent);
45524
- }
45525
- };
45526
- exports.dispatchKeyDownEvent = dispatchKeyDownEvent;
45527
- var DOM = {
45528
- frameFromElement,
45529
- frameFromElements,
45530
- convertToPageFrame,
45531
- convertFromPageFrame,
45532
- getPageFrame,
45533
- fromEventForPage,
45534
- fromEventForClient,
45535
- convertToPagePoint,
45536
- convertFromPagePoint,
45537
- };
45538
- exports.DOM = DOM;
45539
- var parser;
45540
- var supportsNativeParseHTML = /* @__PURE__ */ (() =>
45541
- // Firefox has rare-random issues with the native parser: https://framer-team.slack.com/archives/C01B14R6E22/p1724159313153969
45542
- !isFirefox() && typeof Document !== 'undefined' && typeof Document.parseHTMLUnsafe === 'function')();
45543
- function domParser(html, type) {
45544
- if (supportsNativeParseHTML && !type)
45545
- return Document.parseHTMLUnsafe(html);
45546
- parser ??= new DOMParser();
45547
- return parser.parseFromString(html, type ?? 'text/html');
45548
- }
45549
45851
  var useDOM = /* @__PURE__ */ isBrowser2();
45550
45852
  var SharedSVGEntry = class {
45551
45853
  constructor(id3, svg, innerHTML, viewBox, count = 0) {
@@ -46908,7 +47210,7 @@ var Vector = /* @__PURE__ */ (() => {
46908
47210
  return _a = class extends Layer {
46909
47211
  render() {
46910
47212
  countNodeRender();
46911
- const { opacity, calculatedPath, calculatedPathBoundingBox, d, insideStroke, strokeEnabled, strokeClipId, strokeWidth, idAttribute, shadows, strokeAlpha, name, includeTransform, isRootVectorNode, rotation, id: id3, lineCap, lineJoin, strokeColor, strokeMiterLimit, strokeDashArray, strokeDashOffset, fill, variants, transition, fillOpacity, visible, x, y, width, height, } = this.props;
47213
+ const { opacity, calculatedPath, calculatedPathBoundingBox, d, insideStroke, strokeEnabled, strokeClipId, strokeWidth, idAttribute, shadows, name, includeTransform, isRootVectorNode, rotation, id: id3, lineCap, lineJoin, strokeColor, strokeMiterLimit, strokeDashArray, strokeDashOffset, fill, variants, transition, fillOpacity, visible, x, y, width, height, } = this.props;
46912
47214
  if (!visible)
46913
47215
  return null;
46914
47216
  if (!id3 || !strokeClipId)
@@ -47007,7 +47309,7 @@ var Vector = /* @__PURE__ */ (() => {
47007
47309
  // Shadow filter uses 'objectBoundingBox' as filter units, so calculations should be
47008
47310
  // relative to the referenced object itself (path), instead of the node rect, which
47009
47311
  // can be larger than the path bounding box.
47010
- calculatedPathBoundingBox, internalShapeId, strokeAlpha, strokeWidth, internalStrokeClipId, svgStrokeAttributes);
47312
+ calculatedPathBoundingBox, internalShapeId, Boolean(fill), strokeEnabled, strokeWidth, internalStrokeClipId, svgStrokeAttributes);
47011
47313
  const currentName = target === RenderTarget.preview ? name || void 0 : void 0;
47012
47314
  if (shadow.insetElement !== null || shadow.outsetElement !== null || insideStroke) {
47013
47315
  pathAttributes.id = internalShapeId.id;
@@ -47578,8 +47880,8 @@ var package_default = {
47578
47880
  scripts: {
47579
47881
  coverage: 'yarn :jest --coverage',
47580
47882
  lint: 'yarn :eslint ./src --ext .ts,.tsx --format codeframe --quiet --cache',
47581
- 'lint:ci': 'yarn :eslint ./src --ext .ts,.tsx --format codeframe --quiet --cache --cache-strategy content',
47582
- 'lint:fix': 'yarn lint --fix --cache',
47883
+ 'lint:ci': 'yarn lint --cache-strategy content --cache-location $HOME/.cache/eslint/framer-library',
47884
+ 'lint:fix': 'yarn lint --fix',
47583
47885
  test: 'yarn :jest',
47584
47886
  watch: 'yarn :jest --watch',
47585
47887
  postinstall: 'node postinstall.cjs',