@preprio/toolkit 0.5.0-rc.2 → 0.6.0-alpha.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 (71) hide show
  1. package/README.md +308 -27
  2. package/dist/astro/chunk-3UVUDDNY.js +173 -0
  3. package/dist/astro/graphql.cjs +983 -0
  4. package/dist/astro/graphql.d.cts +231 -0
  5. package/dist/astro/graphql.d.ts +231 -0
  6. package/dist/astro/graphql.js +893 -0
  7. package/dist/astro/index-XT_z-RYT.d.cts +130 -0
  8. package/dist/astro/index-XT_z-RYT.d.ts +130 -0
  9. package/dist/astro/index.cjs +14 -1
  10. package/dist/astro/index.d.cts +1 -120
  11. package/dist/astro/index.d.ts +1 -120
  12. package/dist/astro/index.js +15 -153
  13. package/dist/{chunk-FLPNN3CV.js → chunk-BJ2LBLWO.js} +71 -276
  14. package/dist/chunk-DGZA7KX7.js +172 -0
  15. package/dist/chunk-YR7P4IWE.js +187 -0
  16. package/dist/graphql.cjs +894 -0
  17. package/dist/graphql.d.cts +231 -0
  18. package/dist/graphql.d.ts +231 -0
  19. package/dist/graphql.js +787 -0
  20. package/dist/index.cjs +76 -119
  21. package/dist/index.d.cts +12 -64
  22. package/dist/index.d.ts +12 -64
  23. package/dist/index.js +23 -167
  24. package/dist/nextjs/chunk-U4HXENF7.js +231 -0
  25. package/dist/nextjs/components.cjs +190 -122
  26. package/dist/nextjs/components.d.cts +33 -2
  27. package/dist/nextjs/components.d.ts +33 -2
  28. package/dist/nextjs/components.js +132 -4
  29. package/dist/nextjs/graphql.cjs +1315 -0
  30. package/dist/nextjs/graphql.d.cts +361 -0
  31. package/dist/nextjs/graphql.d.ts +361 -0
  32. package/dist/nextjs/graphql.js +1218 -0
  33. package/dist/nextjs/index.cjs +126 -6
  34. package/dist/nextjs/index.d.cts +53 -147
  35. package/dist/nextjs/index.d.ts +53 -147
  36. package/dist/nextjs/index.js +113 -203
  37. package/dist/nextjs/server-CjpELYvq.d.cts +156 -0
  38. package/dist/nextjs/server-CjpELYvq.d.ts +156 -0
  39. package/dist/nuxt/chunk-P6ENNAEE.js +417 -0
  40. package/dist/nuxt/graphql.cjs +990 -0
  41. package/dist/nuxt/graphql.d.cts +228 -0
  42. package/dist/nuxt/graphql.d.ts +228 -0
  43. package/dist/nuxt/graphql.js +894 -0
  44. package/dist/nuxt/index.cjs +14 -1
  45. package/dist/nuxt/index.d.cts +3 -148
  46. package/dist/nuxt/index.d.ts +3 -148
  47. package/dist/nuxt/index.js +15 -391
  48. package/dist/nuxt/server-8v6OHbsw.d.cts +158 -0
  49. package/dist/nuxt/server-8v6OHbsw.d.ts +158 -0
  50. package/dist/pixel-DwW7cXJm.d.cts +49 -0
  51. package/dist/pixel-DwW7cXJm.d.ts +49 -0
  52. package/dist/react/components.cjs +88 -120
  53. package/dist/react/components.d.cts +2 -8
  54. package/dist/react/components.d.ts +2 -8
  55. package/dist/react/components.js +88 -120
  56. package/dist/server-Brr1UgtW.d.ts +59 -0
  57. package/dist/server-DJuS3YU0.d.cts +59 -0
  58. package/dist/sveltekit/chunk-FSARVMG5.js +413 -0
  59. package/dist/sveltekit/graphql.cjs +996 -0
  60. package/dist/sveltekit/graphql.d.cts +233 -0
  61. package/dist/sveltekit/graphql.d.ts +233 -0
  62. package/dist/sveltekit/graphql.js +900 -0
  63. package/dist/sveltekit/index.cjs +14 -1
  64. package/dist/sveltekit/index.d.cts +3 -88
  65. package/dist/sveltekit/index.d.ts +3 -88
  66. package/dist/sveltekit/index.js +15 -387
  67. package/dist/sveltekit/server-CO847mEV.d.cts +98 -0
  68. package/dist/sveltekit/server-CO847mEV.d.ts +98 -0
  69. package/dist/{pixel-B3oQNbZ3.d.cts → types-BYH9XqmN.d.cts} +4 -58
  70. package/dist/{pixel-B3oQNbZ3.d.ts → types-BYH9XqmN.d.ts} +4 -58
  71. package/package.json +31 -1
@@ -1,161 +1,15 @@
1
- // src/version.ts
2
- var VERSION = "0.5.0-rc.2";
3
-
4
- // src/core/features.ts
5
- function isEnabled(config) {
6
- if (typeof config === "boolean") return config;
7
- return config?.enabled ?? true;
8
- }
9
- function resolveFeatures(features) {
10
- return {
11
- segments: isEnabled(features?.segments),
12
- abTesting: isEnabled(features?.abTesting),
13
- editMode: isEnabled(features?.editMode)
14
- };
15
- }
16
- var ALL_FEATURES_ENABLED = Object.freeze({
17
- segments: true,
18
- abTesting: true,
19
- editMode: true
20
- });
21
-
22
- // src/core/stega/clean.ts
23
- import { vercelStegaClean, vercelStegaDecode } from "@vercel/stega";
24
-
25
- // src/core/utils.ts
26
- var trustedParentOrigin = null;
27
- function setTrustedParentOrigin(origin) {
28
- trustedParentOrigin = origin;
29
- }
30
- function sendPreprEvent(event, data, options) {
31
- if (typeof window !== "undefined") {
32
- const message = {
33
- name: "prepr_preview_bar",
34
- event,
35
- ...data
36
- };
37
- window.dispatchEvent(
38
- new CustomEvent("prepr_preview_bar", { detail: message })
39
- );
40
- if (window.parent && window.parent !== window) {
41
- if (trustedParentOrigin) {
42
- window.parent.postMessage(message, trustedParentOrigin);
43
- } else if (options?.allowUntrustedTarget) {
44
- window.parent.postMessage(message, "*");
45
- }
46
- }
47
- }
48
- }
49
- var DebugLogger = class {
50
- constructor(options) {
51
- this.options = {
52
- prefix: "[Prepr]",
53
- ...options
54
- };
55
- }
56
- // A local `enabled` wins; otherwise defer to the global logger so scoped
57
- // loggers created before initDebugLogger() still pick up the setting.
58
- isEnabled() {
59
- if (this.options.enabled !== void 0) {
60
- return this.options.enabled;
61
- }
62
- return globalDebugLogger?.options?.enabled ?? false;
63
- }
64
- log(message, ...args) {
65
- if (!this.isEnabled()) return;
66
- const prefix = this.options.prefix;
67
- console.log(`${prefix} ${message}`, ...args);
68
- }
69
- warn(message, ...args) {
70
- if (!this.isEnabled()) return;
71
- const prefix = this.options.prefix;
72
- console.warn(`${prefix} ${message}`, ...args);
73
- }
74
- error(message, ...args) {
75
- if (!this.isEnabled()) return;
76
- const prefix = this.options.prefix;
77
- console.error(`${prefix} ${message}`, ...args);
78
- }
79
- };
80
- var globalDebugLogger = null;
81
- function initDebugLogger(enabled = false) {
82
- globalDebugLogger = new DebugLogger({ enabled });
83
- }
84
- function createScopedLogger(scopeName) {
85
- return new DebugLogger({
86
- prefix: `[Prepr][${scopeName}]`
87
- });
88
- }
89
- function throttle(func, delay) {
90
- let timeoutId = null;
91
- let lastExecTime = 0;
92
- const throttledFunc = ((...args) => {
93
- const currentTime = Date.now();
94
- const timeSinceLastExec = currentTime - lastExecTime;
95
- if (timeSinceLastExec >= delay) {
96
- func(...args);
97
- lastExecTime = currentTime;
98
- } else {
99
- if (timeoutId) {
100
- clearTimeout(timeoutId);
101
- }
102
- timeoutId = setTimeout(() => {
103
- func(...args);
104
- lastExecTime = Date.now();
105
- timeoutId = null;
106
- }, delay - timeSinceLastExec);
107
- }
108
- });
109
- throttledFunc.cancel = () => {
110
- if (timeoutId) {
111
- clearTimeout(timeoutId);
112
- timeoutId = null;
113
- }
114
- };
115
- return throttledFunc;
116
- }
117
- function createElementCache(query, ttl = 1e3) {
118
- let cache = null;
119
- let lastCacheTime = 0;
120
- return () => {
121
- const now = Date.now();
122
- if (!cache || now - lastCacheTime > ttl) {
123
- cache = document.querySelectorAll(query);
124
- lastCacheTime = now;
125
- }
126
- return cache;
127
- };
128
- }
129
-
130
- // src/core/stega/clean.ts
131
- var debug = createScopedLogger("stega:clean");
132
- function stegaClean(text) {
133
- if (!text) return text;
134
- return vercelStegaClean(text);
135
- }
136
- function decodeStega(str) {
137
- if (!str) return null;
138
- try {
139
- const decoded = vercelStegaDecode(str);
140
- if (decoded?.href) {
141
- return decoded;
142
- }
143
- } catch (error) {
144
- debug.log("error decoding stega data", error);
145
- const match = str.match(/{"origin.*?}/);
146
- if (match) {
147
- try {
148
- const decodedMatch = vercelStegaDecode(match[0]);
149
- if (decodedMatch?.href) {
150
- return decodedMatch;
151
- }
152
- } catch (innerError) {
153
- debug.log("error decoding stega regex match", innerError);
154
- }
155
- }
156
- }
157
- return null;
158
- }
1
+ import {
2
+ ALL_FEATURES_ENABLED,
3
+ VERSION,
4
+ createElementCache,
5
+ createScopedLogger,
6
+ decodeStega,
7
+ initDebugLogger,
8
+ resolveFeatures,
9
+ sendPreprEvent,
10
+ setTrustedParentOrigin,
11
+ throttle
12
+ } from "./chunk-DGZA7KX7.js";
159
13
 
160
14
  // src/core/stega/dom.ts
161
15
  var IGNORED_ANCESTORS = "script, style, noscript";
@@ -186,37 +40,14 @@ function isRenderedElement(element) {
186
40
  if (!style) return true;
187
41
  return style.visibility !== "hidden" && style.display !== "none";
188
42
  }
189
- function parseEditHref(href) {
190
- try {
191
- const url = new URL(href, window.location.origin);
192
- return {
193
- id: url.pathname.split("/").pop() || void 0,
194
- field: url.searchParams.get("field") || void 0,
195
- locale: url.searchParams.get("locale") || void 0
196
- };
197
- } catch {
198
- return {};
199
- }
200
- }
201
- function setOrRemove(element, name, value) {
202
- if (value) {
203
- element.setAttribute(name, value);
204
- } else {
205
- element.removeAttribute(name);
206
- }
207
- }
208
43
  function tagEncodedElement(element, decoded) {
209
44
  element.setAttribute("data-prepr-encoded", "");
210
45
  element.setAttribute("data-prepr-href", decoded.href);
211
46
  element.setAttribute("data-prepr-origin", decoded.origin);
212
- const { id, field, locale } = parseEditHref(decoded.href);
213
- setOrRemove(element, "data-prepr-id", id);
214
- setOrRemove(element, "data-prepr-field", field);
215
- setOrRemove(element, "data-prepr-locale", locale);
216
47
  }
217
48
 
218
49
  // src/core/stega/elements.ts
219
- var debug2 = createScopedLogger("stega:elements");
50
+ var debug = createScopedLogger("stega:elements");
220
51
  var StegaElements = class {
221
52
  constructor(decode = decodeStega) {
222
53
  this.observer = null;
@@ -261,7 +92,7 @@ var StegaElements = class {
261
92
  walkTextNodes(document.body, (textNode) => {
262
93
  if (this.tagFromTextNode(textNode)) encodedCount++;
263
94
  });
264
- debug2.log("document scan complete, encoded", encodedCount, "elements");
95
+ debug.log("document scan complete, encoded", encodedCount, "elements");
265
96
  this.elements = document.querySelectorAll("[data-prepr-encoded]");
266
97
  }
267
98
  /** `onUpdate` fires after each debounced batch, for refreshing derived state. */
@@ -317,9 +148,6 @@ var StegaElements = class {
317
148
  element.removeAttribute("data-prepr-encoded");
318
149
  element.removeAttribute("data-prepr-href");
319
150
  element.removeAttribute("data-prepr-origin");
320
- element.removeAttribute("data-prepr-id");
321
- element.removeAttribute("data-prepr-field");
322
- element.removeAttribute("data-prepr-locale");
323
151
  element.classList.remove("prepr-overlay-active");
324
152
  });
325
153
  this.elements = void 0;
@@ -327,7 +155,7 @@ var StegaElements = class {
327
155
  };
328
156
 
329
157
  // src/core/stega/overlay.ts
330
- var debug3 = createScopedLogger("stega:overlay");
158
+ var debug2 = createScopedLogger("stega:overlay");
331
159
  var StegaOverlay = class {
332
160
  constructor(onEdit) {
333
161
  this.overlay = null;
@@ -372,8 +200,7 @@ var StegaOverlay = class {
372
200
  const origin = element.getAttribute("data-prepr-origin");
373
201
  const id = element.getAttribute("data-prepr-id") ?? void 0;
374
202
  const field = element.getAttribute("data-prepr-field") ?? void 0;
375
- const locale = element.getAttribute("data-prepr-locale") ?? void 0;
376
- debug3.log("showing overlay", { href, origin });
203
+ debug2.log("showing overlay", { href, origin });
377
204
  const overlay = this.overlay;
378
205
  overlay.style.display = "block";
379
206
  overlay.style.top = `${rect.top + window.scrollY - 2}px`;
@@ -405,7 +232,7 @@ var StegaOverlay = class {
405
232
  tooltip.style.left = `${left}px`;
406
233
  });
407
234
  tooltip.onclick = () => {
408
- this.onEdit({ href, origin, id, field, locale });
235
+ this.onEdit({ href, origin, id, field });
409
236
  };
410
237
  }
411
238
  this.currentElement = element;
@@ -445,7 +272,7 @@ var StegaOverlay = class {
445
272
  };
446
273
 
447
274
  // src/core/stega/proximity.ts
448
- var debug4 = createScopedLogger("stega:proximity");
275
+ var debug3 = createScopedLogger("stega:proximity");
449
276
  var StegaProximity = class {
450
277
  constructor() {
451
278
  this.highlighted = /* @__PURE__ */ new Set();
@@ -480,9 +307,9 @@ var StegaProximity = class {
480
307
  );
481
308
  const nodes = this.getEncodedElements();
482
309
  nodes.forEach((el) => this.observer.observe(el));
483
- debug4.log("observing", nodes.length, "encoded elements");
310
+ debug3.log("observing", nodes.length, "encoded elements");
484
311
  } catch (error) {
485
- debug4.log("error setting up IntersectionObserver", error);
312
+ debug3.log("error setting up IntersectionObserver", error);
486
313
  }
487
314
  }
488
315
  stopObserving() {
@@ -552,7 +379,7 @@ function removeStegaStyles() {
552
379
  }
553
380
 
554
381
  // src/core/stega/scan.ts
555
- var debug5 = createScopedLogger("stega:scan");
382
+ var debug4 = createScopedLogger("stega:scan");
556
383
  var EDITOR_MODE_STYLES = "[data-prepr-encoded]{cursor:pointer}";
557
384
  function createStegaController(opts) {
558
385
  const tooltipEnabled = opts.tooltip ?? true;
@@ -585,13 +412,12 @@ function createStegaController(opts) {
585
412
  href: encoded.getAttribute("data-prepr-href") ?? "",
586
413
  origin: encoded.getAttribute("data-prepr-origin") ?? "",
587
414
  id: encoded.getAttribute("data-prepr-id") ?? void 0,
588
- field: encoded.getAttribute("data-prepr-field") ?? void 0,
589
- locale: encoded.getAttribute("data-prepr-locale") ?? void 0
415
+ field: encoded.getAttribute("data-prepr-field") ?? void 0
590
416
  });
591
417
  };
592
418
  const start = () => {
593
419
  if (initialized) {
594
- debug5.log("already initialized, skipping setup");
420
+ debug4.log("already initialized, skipping setup");
595
421
  return;
596
422
  }
597
423
  if (!tooltipEnabled) {
@@ -601,7 +427,7 @@ function createStegaController(opts) {
601
427
  });
602
428
  document.addEventListener("click", handleClick, { capture: true });
603
429
  initialized = true;
604
- debug5.log("stega controller started (editor mode)");
430
+ debug4.log("stega controller started (editor mode)");
605
431
  return;
606
432
  }
607
433
  injectStegaStyles();
@@ -632,7 +458,7 @@ function createStegaController(opts) {
632
458
  passive: true
633
459
  });
634
460
  initialized = true;
635
- debug5.log("stega controller started");
461
+ debug4.log("stega controller started");
636
462
  };
637
463
  const stop = () => {
638
464
  if (!initialized) return;
@@ -641,7 +467,7 @@ function createStegaController(opts) {
641
467
  elements.cleanup();
642
468
  removeStegaStyles();
643
469
  initialized = false;
644
- debug5.log("stega controller stopped (editor mode)");
470
+ debug4.log("stega controller stopped (editor mode)");
645
471
  return;
646
472
  }
647
473
  if (throttledMouseMove) {
@@ -661,14 +487,15 @@ function createStegaController(opts) {
661
487
  elements.cleanup();
662
488
  removeStegaStyles();
663
489
  initialized = false;
664
- debug5.log("stega controller stopped");
490
+ debug4.log("stega controller stopped");
665
491
  };
666
492
  return { start, stop };
667
493
  }
668
494
 
669
495
  // src/core/stega/auto-clean.ts
670
496
  import { vercelStegaSplit } from "@vercel/stega";
671
- var debug6 = createScopedLogger("stega:auto-clean");
497
+ var debug5 = createScopedLogger("stega:auto-clean");
498
+ var HYDRATION_RETRY_MS = 100;
672
499
  function createStegaAutoClean(options) {
673
500
  const stripText = options?.enabled ?? true;
674
501
  let observer = null;
@@ -677,8 +504,29 @@ function createStegaAutoClean(options) {
677
504
  let pendingHidden = /* @__PURE__ */ new Set();
678
505
  let pendingDirty = /* @__PURE__ */ new Set();
679
506
  let debounceTimeout = null;
507
+ const isHydrated = options?.isHydrated;
508
+ let pendingHydration = /* @__PURE__ */ new Set();
509
+ let hydrationTimeout = null;
510
+ function retryPendingHydration() {
511
+ hydrationTimeout = null;
512
+ processing = true;
513
+ const batch = [...pendingHydration];
514
+ pendingHydration.clear();
515
+ batch.forEach((textNode) => {
516
+ if (textNode.isConnected) cleanTextNode(textNode);
517
+ });
518
+ processing = false;
519
+ }
680
520
  function cleanTextNode(textNode) {
681
521
  if (isIgnoredTextNode(textNode)) return false;
522
+ if (isHydrated && !isHydrated(textNode)) {
523
+ pendingHydration.add(textNode);
524
+ hydrationTimeout ?? (hydrationTimeout = setTimeout(
525
+ retryPendingHydration,
526
+ HYDRATION_RETRY_MS
527
+ ));
528
+ return false;
529
+ }
682
530
  const textContent = textNode.textContent;
683
531
  const info = cleaned.get(textNode);
684
532
  const settled = stripText ? info?.cleaned : info?.original;
@@ -711,7 +559,7 @@ function createStegaAutoClean(options) {
711
559
  }
712
560
  pendingHidden.add(textNode);
713
561
  } catch (error) {
714
- debug6.log("error cleaning text node", error);
562
+ debug5.log("error cleaning text node", error);
715
563
  }
716
564
  return false;
717
565
  }
@@ -797,13 +645,17 @@ function createStegaAutoClean(options) {
797
645
  if (observer || typeof window === "undefined") return;
798
646
  scanAndClean();
799
647
  setupObserver();
800
- debug6.log("stega auto-clean started");
648
+ debug5.log("stega auto-clean started");
801
649
  }
802
650
  function stop() {
803
651
  if (debounceTimeout) {
804
652
  clearTimeout(debounceTimeout);
805
653
  debounceTimeout = null;
806
654
  }
655
+ if (hydrationTimeout) {
656
+ clearTimeout(hydrationTimeout);
657
+ hydrationTimeout = null;
658
+ }
807
659
  if (observer) {
808
660
  observer.disconnect();
809
661
  observer = null;
@@ -811,43 +663,12 @@ function createStegaAutoClean(options) {
811
663
  cleaned = /* @__PURE__ */ new WeakMap();
812
664
  pendingHidden = /* @__PURE__ */ new Set();
813
665
  pendingDirty = /* @__PURE__ */ new Set();
814
- debug6.log("stega auto-clean stopped");
666
+ pendingHydration = /* @__PURE__ */ new Set();
667
+ debug5.log("stega auto-clean stopped");
815
668
  }
816
669
  return { start, stop };
817
670
  }
818
671
 
819
- // src/core/stega/scroll-to-field.ts
820
- var debug7 = createScopedLogger("stega:scroll");
821
- var FLASH_DURATION_MS = 1200;
822
- var flashTimeout = null;
823
- function scrollToField(request) {
824
- const { field, id } = request;
825
- if (!field) return false;
826
- const candidates = document.querySelectorAll(
827
- "[data-prepr-encoded]"
828
- );
829
- let target = null;
830
- for (const candidate of candidates) {
831
- if (candidate.getAttribute("data-prepr-field") !== field) continue;
832
- if (id && candidate.getAttribute("data-prepr-id") !== id) continue;
833
- target = candidate;
834
- break;
835
- }
836
- if (!target) {
837
- debug7.log("no element found for field", field);
838
- return false;
839
- }
840
- target.scrollIntoView({ behavior: "smooth", block: "center" });
841
- if (flashTimeout) clearTimeout(flashTimeout);
842
- document.querySelectorAll(".prepr-overlay-active").forEach((el) => el.classList.remove("prepr-overlay-active"));
843
- target.classList.add("prepr-overlay-active");
844
- flashTimeout = setTimeout(() => {
845
- target.classList.remove("prepr-overlay-active");
846
- flashTimeout = null;
847
- }, FLASH_DURATION_MS);
848
- return true;
849
- }
850
-
851
672
  // src/core/store.ts
852
673
  var DEFAULT_STATE = {
853
674
  locale: "en",
@@ -2004,13 +1825,9 @@ function t2(key, locale, vars) {
2004
1825
  }
2005
1826
 
2006
1827
  // src/core/iframe-bridge.ts
2007
- var debug8 = createScopedLogger("iframe-bridge");
2008
1828
  var EDITOR_BASE_DOMAIN = "prepr.io";
2009
1829
  function isAllowedEditorOrigin(origin, allowed) {
2010
- if (allowed) {
2011
- if (allowed.includes("*")) return origin !== "null";
2012
- return allowed.includes(origin);
2013
- }
1830
+ if (allowed) return allowed.includes(origin);
2014
1831
  let url;
2015
1832
  try {
2016
1833
  url = new URL(origin);
@@ -2025,7 +1842,6 @@ function isAllowedEditorOrigin(origin, allowed) {
2025
1842
  }
2026
1843
  function createIframeBridge(store, options = {}) {
2027
1844
  const allowedOrigins = options.allowedEditorOrigins;
2028
- const onScrollToField = options.onScrollToField;
2029
1845
  let parentOrigin = null;
2030
1846
  const onKeyDown = (event) => {
2031
1847
  const key = event.key.toLowerCase();
@@ -2035,10 +1851,7 @@ function createIframeBridge(store, options = {}) {
2035
1851
  const onMessage = (evt) => {
2036
1852
  const data = evt?.data;
2037
1853
  if (data?.event === "prepr:initVE" && !parentOrigin) {
2038
- if (!isAllowedEditorOrigin(evt.origin, allowedOrigins)) {
2039
- debug8.warn("ignored editor handshake from origin", evt.origin);
2040
- return;
2041
- }
1854
+ if (!isAllowedEditorOrigin(evt.origin, allowedOrigins)) return;
2042
1855
  parentOrigin = evt.origin;
2043
1856
  setTrustedParentOrigin(parentOrigin);
2044
1857
  if (data.scrollPosition != null) {
@@ -2052,15 +1865,6 @@ function createIframeBridge(store, options = {}) {
2052
1865
  const currentScrollY = window.scrollY || document.documentElement.scrollTop;
2053
1866
  sendPreprEvent("getScrollPosition", { value: currentScrollY });
2054
1867
  }
2055
- if (data?.event === "prepr:scrollToField") {
2056
- if (typeof data.field !== "string" || !data.field) return;
2057
- if (data.id !== void 0 && typeof data.id !== "string") return;
2058
- try {
2059
- onScrollToField?.({ field: data.field, id: data.id });
2060
- } catch (error) {
2061
- debug8.warn("scrollToField handler failed", error);
2062
- }
2063
- }
2064
1868
  };
2065
1869
  return {
2066
1870
  start() {
@@ -2179,7 +1983,7 @@ function splitPath(full) {
2179
1983
  }
2180
1984
 
2181
1985
  // src/core/create-preview.ts
2182
- var debug9 = createScopedLogger("create-preview");
1986
+ var debug6 = createScopedLogger("create-preview");
2183
1987
  var controllerStores = /* @__PURE__ */ new WeakMap();
2184
1988
  function defaultNavigation() {
2185
1989
  return {
@@ -2221,7 +2025,7 @@ function createPreprPreview(opts = {}) {
2221
2025
  const search = new URLSearchParams(window.location.search);
2222
2026
  const hideBar = search.get(PARAM_HIDE_BAR) === "true";
2223
2027
  if (hideBar) {
2224
- debug9.log(`${PARAM_HIDE_BAR}=true \u2014 no visible toolbar`);
2028
+ debug6.log(`${PARAM_HIDE_BAR}=true \u2014 no visible toolbar`);
2225
2029
  }
2226
2030
  const mountUi = (options?.ui ?? true) && !isIframe && !hideBar;
2227
2031
  const locale = resolveLocale(options);
@@ -2257,17 +2061,18 @@ function createPreprPreview(opts = {}) {
2257
2061
  tooltip: mountUi,
2258
2062
  // In the editor, ask the parent to focus the field instead of opening a new
2259
2063
  // tab. Standalone previews keep the window.open behaviour.
2260
- onEdit: ({ href, id, field, locale: contentLocale }) => {
2064
+ onEdit: ({ href, origin, id, field }) => {
2261
2065
  const safeHref = href ? safeEditUrl(href) : null;
2262
2066
  if (href && !safeHref) {
2263
- debug9.warn("ignored edit request with unsupported href scheme");
2067
+ debug6.warn("ignored edit request with unsupported href scheme");
2264
2068
  return;
2265
2069
  }
2266
2070
  if (isIframe) {
2267
2071
  sendPreprEvent("field_edit_requested", {
2072
+ href: safeHref ?? void 0,
2073
+ origin,
2268
2074
  id,
2269
- field,
2270
- locale: contentLocale
2075
+ field
2271
2076
  });
2272
2077
  } else if (safeHref) {
2273
2078
  window.open(safeHref, "_blank", "noopener,noreferrer");
@@ -2275,7 +2080,8 @@ function createPreprPreview(opts = {}) {
2275
2080
  }
2276
2081
  });
2277
2082
  const autoClean = createStegaAutoClean({
2278
- enabled: options?.autoClean
2083
+ enabled: options?.autoClean,
2084
+ isHydrated: opts.isHydrated
2279
2085
  });
2280
2086
  autoClean.start();
2281
2087
  const handleChange = createChangeHandler({
@@ -2294,15 +2100,7 @@ function createPreprPreview(opts = {}) {
2294
2100
  handleChange(before, state);
2295
2101
  });
2296
2102
  const bridge = createIframeBridge(store, {
2297
- allowedEditorOrigins: options?.allowedEditorOrigins,
2298
- // The editor selecting a field scrolls the matching element into view. The
2299
- // lookup relies on the attributes the stega scan writes, so it finds
2300
- // nothing until encoded content has been tagged.
2301
- onScrollToField: ({ field, id }) => {
2302
- if (!scrollToField({ field, id })) {
2303
- debug9.log("no element on this page renders field", field);
2304
- }
2305
- }
2103
+ allowedEditorOrigins: options?.allowedEditorOrigins
2306
2104
  });
2307
2105
  sendPreprEvent(
2308
2106
  "getScrollPosition",
@@ -2322,7 +2120,7 @@ function createPreprPreview(opts = {}) {
2322
2120
  bridge.stop();
2323
2121
  }
2324
2122
  el?.remove();
2325
- debug9.log("preview destroyed");
2123
+ debug6.log("preview destroyed");
2326
2124
  }
2327
2125
  const controller = { destroy };
2328
2126
  controllerStores.set(controller, store);
@@ -2395,8 +2193,6 @@ function setTrackingParam(key, value) {
2395
2193
  }
2396
2194
 
2397
2195
  export {
2398
- VERSION,
2399
- resolveFeatures,
2400
2196
  COOKIE_PREVIEW_MODE,
2401
2197
  COOKIE_SEGMENT,
2402
2198
  COOKIE_VARIANT,
@@ -2406,7 +2202,6 @@ export {
2406
2202
  PARAM_VARIANT,
2407
2203
  PARAM_HIDE_BAR,
2408
2204
  ONE_YEAR_SECONDS,
2409
- stegaClean,
2410
2205
  createToolbarStore,
2411
2206
  PreprToolbarElement,
2412
2207
  definePreprToolbar,