@weaverse/next 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var react = require('@weaverse/react');
4
3
  var schema = require('@weaverse/schema');
5
- var jsxRuntime = require('react/jsx-runtime');
6
- var react$1 = require('react');
7
- var navigation = require('next/navigation');
4
+ var clientBoundary_js = require('./client-boundary.js');
8
5
 
9
6
  // src/index.ts
10
7
 
@@ -25,513 +22,8 @@ function generateDataFromSchema(schema) {
25
22
  }
26
23
  return data;
27
24
  }
28
-
29
- // src/item.ts
30
- function flattenItemData(update) {
31
- let { data, ...rest } = update;
32
- if (!(data && typeof data === "object" && !Array.isArray(data))) {
33
- return rest;
34
- }
35
- return { ...data, ...rest };
36
- }
37
- var deferredItemUpdates = null;
38
- function collectDeferredItemUpdates(create) {
39
- let previousQueue = deferredItemUpdates;
40
- let queue = /* @__PURE__ */ new Set();
41
- deferredItemUpdates = queue;
42
- try {
43
- return [create(), [...queue]];
44
- } finally {
45
- deferredItemUpdates = previousQueue;
46
- }
47
- }
48
- var WeaverseNextItem = class extends react.WeaverseItemStore {
49
- /**
50
- * Cached merged snapshot (base `_store` + translations). Reset whenever the
51
- * `_store` ref or the item's translation entry ref changes, so
52
- * `useSyncExternalStore` sees a stable object between unrelated re-renders.
53
- */
54
- _cachedSnapshot = null;
55
- _snapshotStoreRef = null;
56
- _snapshotTranslationRef = null;
57
- /** Create an item store from serialized component data and its runtime. */
58
- constructor(initialData, weaverse) {
59
- super(initialData, weaverse);
60
- let schemaData = generateDataFromSchema(this.Element?.schema);
61
- Object.assign(this._store, schemaData, flattenItemData(initialData));
62
- }
63
- /**
64
- * Flatten nested `data` on updates exactly like the constructor does. Core's
65
- * `initProject()` calls `setData(item)` when a new runtime serves a page
66
- * whose item instances already exist (e.g. locale/client navigation).
67
- *
68
- * A complete serialized item (it carries `id` and `type`; core's
69
- * `initProject()` always passes one) replaces the store the way the
70
- * constructor builds it: the schema defaults of the item's own `type` — the
71
- * Builder can replace a section in place, keeping its id — then the item's
72
- * settings. A payload omits a setting — or the whole optional `data` — when
73
- * its value equals the schema default, so merging into the previous store
74
- * would keep the previous locale's value visible. Partial updates still
75
- * merge. Either way the `_store` ref changes, which invalidates the memoized
76
- * snapshot below. The subscriber emit is queued instead of fired when a
77
- * render-phase deferral is active (see `collectDeferredItemUpdates`).
78
- */
79
- setData = (update) => {
80
- if ("id" in update && "type" in update) {
81
- let { data, type } = update;
82
- let schema = this.weaverse.elementRegistry.get(type)?.schema;
83
- this._store = {
84
- ...generateDataFromSchema(schema),
85
- ...data === void 0 ? {} : { data },
86
- ...flattenItemData(update)
87
- };
88
- } else {
89
- this.data = flattenItemData(update);
90
- }
91
- if (deferredItemUpdates) {
92
- deferredItemUpdates.add(this);
93
- } else {
94
- this.triggerUpdate();
95
- }
96
- return this.data;
97
- };
98
- /**
99
- * Overlay item-level translations onto the base store when the runtime is in
100
- * translation mode. Mirrors Hydrogen's `WeaverseHydrogenItem.getSnapShot()`:
101
- * memoized by `_store` ref + translation entry ref so the returned object is
102
- * referentially stable, and a fast path that returns the base store untouched
103
- * when the item has no translations.
104
- */
105
- getSnapShot = () => {
106
- let base = this._store;
107
- let translations = this.weaverse.translationMap[this._id];
108
- if (!translations) {
109
- return base;
110
- }
111
- if (this._cachedSnapshot && this._snapshotStoreRef === base && this._snapshotTranslationRef === translations) {
112
- return this._cachedSnapshot;
113
- }
114
- let merged = { ...base };
115
- for (let [key, entry] of Object.entries(translations)) {
116
- if (entry.translatedValue !== void 0) {
117
- merged[key] = entry.translatedValue;
118
- }
119
- }
120
- this._cachedSnapshot = merged;
121
- this._snapshotStoreRef = base;
122
- this._snapshotTranslationRef = translations;
123
- return merged;
124
- };
125
- };
126
- function ensureNextItemConstructor() {
127
- if (!react.Weaverse.ItemConstructor || react.Weaverse.ItemConstructor === react.WeaverseItemStore || react.Weaverse.ItemConstructor === WeaverseNextItem) {
128
- react.Weaverse.ItemConstructor = WeaverseNextItem;
129
- }
130
- }
131
- function Main(props) {
132
- let { children, loaderData, ...rest } = props;
133
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ...rest, children });
134
- }
135
- Main.displayName = "main";
136
- var mainSchema = schema.createSchema({
137
- type: "main",
138
- title: "Main"
139
- });
140
- var defaultMainComponent = {
141
- default: Main,
142
- schema: mainSchema
143
- };
144
-
145
- // src/registry.ts
146
- var MAIN_TYPE = "main";
147
- var registeredComponentTypes = /* @__PURE__ */ new Set();
148
- function registerWeaverseNextComponents(components) {
149
- ensureNextItemConstructor();
150
- let hasUserMain = components.some(
151
- (component) => component.schema?.type === MAIN_TYPE
152
- );
153
- let effectiveComponents = hasUserMain ? components : [defaultMainComponent, ...components];
154
- for (let component of effectiveComponents) {
155
- let type = component.schema.type;
156
- let element = {
157
- type,
158
- Component: component.default,
159
- schema: component.schema,
160
- loader: component.loader
161
- };
162
- if (type === MAIN_TYPE && hasUserMain) {
163
- react.Weaverse.elementRegistry.set(type, element);
164
- registeredComponentTypes.add(type);
165
- continue;
166
- }
167
- if (type && !registeredComponentTypes.has(type)) {
168
- react.Weaverse.registerElement(element);
169
- registeredComponentTypes.add(type);
170
- }
171
- }
172
- }
173
-
174
- // src/client.ts
175
- var NextClient = class {
176
- projectId;
177
- components;
178
- themeSchema;
179
- themeSettings;
180
- requestContext;
181
- commerce;
182
- data = null;
183
- dataContext = {};
184
- _fetchPage;
185
- _fetchThemeSettings;
186
- constructor(config) {
187
- this.projectId = config.projectId;
188
- this.components = config.components;
189
- registerWeaverseNextComponents(this.components);
190
- this.themeSchema = config.themeSchema;
191
- this.themeSettings = {
192
- ...generateDataFromSchema(config.themeSchema),
193
- ...config.themeSettings
194
- };
195
- this.requestContext = config.requestContext;
196
- this.commerce = config.commerce;
197
- this._fetchPage = config.fetchPage;
198
- this._fetchThemeSettings = config.fetchThemeSettings;
199
- }
200
- /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */
201
- get storefront() {
202
- return this.commerce?.storefront;
203
- }
204
- loadPage = (input = {}) => {
205
- if (!this._fetchPage) {
206
- throw new Error(
207
- "[WeaverseNextClient] loadPage requires a `fetchPage` function in client config."
208
- );
209
- }
210
- return this._fetchPage(input);
211
- };
212
- loadThemeSettings = (context) => {
213
- if (!this._fetchThemeSettings) {
214
- throw new Error(
215
- "[WeaverseNextClient] loadThemeSettings requires a `fetchThemeSettings` function in client config."
216
- );
217
- }
218
- return this._fetchThemeSettings(context ?? this.requestContext);
219
- };
220
- };
221
- function createWeaverseNextClient(config) {
222
- return new NextClient(config);
223
- }
224
-
225
- // src/theme-settings-store.ts
226
- function createWeaverseNextThemeSettingsStore(options = {}) {
227
- let listeners = /* @__PURE__ */ new Set();
228
- let store = {
229
- publicEnv: options.publicEnv,
230
- schema: options.schema,
231
- settings: { ...options.settings ?? {} },
232
- getServerSnapshot: () => store.settings,
233
- getSnapshot: () => store.settings,
234
- subscribe: (listener) => {
235
- listeners.add(listener);
236
- return () => {
237
- listeners.delete(listener);
238
- };
239
- },
240
- updateThemeSettings: (next) => {
241
- store.settings = { ...store.settings, ...next };
242
- for (let listener of listeners) {
243
- listener();
244
- }
245
- }
246
- };
247
- return store;
248
- }
249
- function getNestedKey(obj, path, fallback) {
250
- let keys = path.split(".");
251
- let current = obj;
252
- for (let key of keys) {
253
- if (current == null || typeof current !== "object") {
254
- return fallback;
255
- }
256
- current = current[key];
257
- }
258
- if (typeof current === "string") {
259
- return current;
260
- }
261
- return fallback;
262
- }
263
- function interpolate(template, variables) {
264
- if (!variables) {
265
- return template;
266
- }
267
- return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
268
- let value = variables[key];
269
- return value === void 0 ? match : String(value);
270
- });
271
- }
272
- var TranslationContext = react$1.createContext(null);
273
- TranslationContext.displayName = "WeaverseNextTranslationContext";
274
- function createTranslate(sources) {
275
- let { staticContent, merchantOverrides, designOverrides, externalT } = sources;
276
- return (key, variables) => {
277
- if (externalT) {
278
- let external = externalT(key, variables);
279
- if (external && external !== key) {
280
- return external;
281
- }
282
- }
283
- let design = designOverrides && Object.hasOwn(designOverrides, key) ? designOverrides[key] : void 0;
284
- let override = merchantOverrides ? getNestedKey(merchantOverrides, key) : void 0;
285
- let staticValue = getNestedKey(staticContent, key);
286
- let raw = design ?? override ?? staticValue ?? key;
287
- return interpolate(raw, variables);
288
- };
289
- }
290
- var EMPTY = {};
291
- var NOOP_SUBSCRIBE = () => () => {
292
- };
293
- var NOOP_SNAPSHOT = () => EMPTY;
294
- function TranslationProvider({
295
- staticContent,
296
- merchantOverrides,
297
- t: externalT,
298
- translationStore,
299
- themeTextStore,
300
- children
301
- }) {
302
- let store = translationStore ?? themeTextStore ?? null;
303
- let designOverrides = react.useSafeExternalStore(
304
- store?.subscribe ?? NOOP_SUBSCRIBE,
305
- store?.getSnapshot ?? NOOP_SNAPSHOT,
306
- store?.getServerSnapshot ?? NOOP_SNAPSHOT
307
- );
308
- let value = react$1.useMemo(
309
- () => ({
310
- t: createTranslate({
311
- staticContent,
312
- merchantOverrides,
313
- designOverrides,
314
- externalT
315
- }),
316
- translationStore: store,
317
- // Deprecated alias — same instance, kept for backward compatibility.
318
- themeTextStore: store,
319
- merchantOverrides: merchantOverrides ?? null
320
- }),
321
- [staticContent, merchantOverrides, designOverrides, externalT, store]
322
- );
323
- return /* @__PURE__ */ jsxRuntime.jsx(TranslationContext.Provider, { value, children });
324
- }
325
- function useTranslation() {
326
- let ctx = react$1.useContext(TranslationContext);
327
- if (!ctx) {
328
- throw new Error(
329
- "useTranslation must be used within <TranslationProvider>. Wrap your app with <WeaverseNextRootProvider>."
330
- );
331
- }
332
- return ctx;
333
- }
334
- var ThemeTextProvider = TranslationProvider;
335
- var useThemeText = useTranslation;
336
-
337
- // src/translation-store.ts
338
- var TranslationStore = class {
339
- /** Current flat translation overrides keyed by dot path. */
340
- overrides = {};
341
- listeners = /* @__PURE__ */ new Set();
342
- /** Replace every override and notify subscribers. */
343
- setOverrides = (overrides) => {
344
- this.overrides = { ...overrides };
345
- this.emit();
346
- };
347
- /** Merge changed overrides into the current values and notify subscribers. */
348
- updateOverrides = (newOverrides) => {
349
- this.overrides = { ...this.overrides, ...newOverrides };
350
- this.emit();
351
- };
352
- /** Return the current client-side override snapshot. */
353
- getSnapshot = () => this.overrides;
354
- /** Return the override snapshot used during server rendering. */
355
- getServerSnapshot = () => this.overrides;
356
- /** Subscribe to override changes and return an unsubscribe function. */
357
- subscribe = (callback) => {
358
- this.listeners.add(callback);
359
- return () => {
360
- this.listeners.delete(callback);
361
- };
362
- };
363
- emit = () => {
364
- for (const listener of Array.from(this.listeners)) {
365
- try {
366
- listener();
367
- } catch (error) {
368
- console.error("TranslationStore: Listener error", error);
369
- }
370
- }
371
- };
372
- };
373
- var ThemeTextStore = TranslationStore;
374
- var WeaverseNextRootContext = react$1.createContext(null);
375
- function WeaverseNextRootProvider(props) {
376
- let {
377
- children,
378
- initialThemeSettings,
379
- merchantOverrides,
380
- staticContent,
381
- t,
382
- themeSchema,
383
- publicEnv
384
- } = props;
385
- let storeRef = react$1.useRef(null);
386
- if (!storeRef.current) {
387
- storeRef.current = createWeaverseNextThemeSettingsStore({
388
- publicEnv,
389
- schema: themeSchema,
390
- settings: initialThemeSettings
391
- });
392
- }
393
- let themeSettingsStore = storeRef.current;
394
- let translationStoreRef = react$1.useRef(null);
395
- if (!translationStoreRef.current) {
396
- translationStoreRef.current = new TranslationStore();
397
- }
398
- let translationStore = translationStoreRef.current;
399
- let appliedThemeSettingsRef = react$1.useRef(initialThemeSettings);
400
- react$1.useEffect(() => {
401
- if (initialThemeSettings && appliedThemeSettingsRef.current !== initialThemeSettings) {
402
- themeSettingsStore.updateThemeSettings(initialThemeSettings);
403
- appliedThemeSettingsRef.current = initialThemeSettings;
404
- }
405
- }, [initialThemeSettings, themeSettingsStore]);
406
- let resolvedStaticContent = staticContent ?? getSchemaStaticContent(themeSchema);
407
- let rootContextValue = react$1.useMemo(
408
- () => ({
409
- merchantOverrides,
410
- staticContent: resolvedStaticContent,
411
- themeSettingsStore,
412
- translationStore
413
- }),
414
- [
415
- merchantOverrides,
416
- resolvedStaticContent,
417
- themeSettingsStore,
418
- translationStore
419
- ]
420
- );
421
- let contextValue = react$1.useMemo(
422
- () => ({
423
- merchantOverrides,
424
- themeSettings: themeSettingsStore.getSnapshot(),
425
- themeSettingsStore,
426
- translationStore
427
- }),
428
- [merchantOverrides, themeSettingsStore, translationStore]
429
- );
430
- return /* @__PURE__ */ jsxRuntime.jsx(WeaverseNextRootContext.Provider, { value: rootContextValue, children: /* @__PURE__ */ jsxRuntime.jsx(WeaverseNextContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
431
- TranslationProvider,
432
- {
433
- merchantOverrides,
434
- staticContent: resolvedStaticContent,
435
- t,
436
- translationStore,
437
- children
438
- }
439
- ) }) });
440
- }
441
- var EMPTY_THEME_SETTINGS = {};
442
- var EMPTY_STATIC_CONTENT = {};
443
- function getSchemaStaticContent(schema) {
444
- let i18n = schema?.i18n;
445
- return i18n?.staticContent ?? EMPTY_STATIC_CONTENT;
446
- }
447
- var WeaverseNextContext = react$1.createContext(null);
448
- function WeaverseNextProvider(props) {
449
- let { children, client, rootData, pageData, commerce, themeSettings } = props;
450
- let rootContext = react$1.useContext(WeaverseNextRootContext);
451
- let themeSettingsValue = themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS;
452
- let ownTranslationStoreRef = react$1.useRef(null);
453
- if (!(rootContext || ownTranslationStoreRef.current)) {
454
- ownTranslationStoreRef.current = new TranslationStore();
455
- }
456
- let translationStore = rootContext?.translationStore ?? ownTranslationStoreRef.current;
457
- let staticContent = props.staticContent ?? rootContext?.staticContent ?? getSchemaStaticContent(client?.themeSchema);
458
- let merchantOverrides = props.merchantOverrides ?? rootContext?.merchantOverrides;
459
- let ownThemeSettingsStore = react$1.useMemo(() => {
460
- if (rootContext) {
461
- return null;
462
- }
463
- return createWeaverseNextThemeSettingsStore({
464
- schema: client?.themeSchema,
465
- settings: themeSettingsValue
466
- });
467
- }, [rootContext, client?.themeSchema, themeSettingsValue]);
468
- let themeSettingsStore = rootContext?.themeSettingsStore ?? ownThemeSettingsStore;
469
- let mergedIntoRootRef = react$1.useRef(void 0);
470
- react$1.useEffect(() => {
471
- if (rootContext && themeSettingsValue !== EMPTY_THEME_SETTINGS && mergedIntoRootRef.current !== themeSettingsValue) {
472
- rootContext.themeSettingsStore.updateThemeSettings(themeSettingsValue);
473
- mergedIntoRootRef.current = themeSettingsValue;
474
- }
475
- }, [rootContext, themeSettingsValue]);
476
- let value = react$1.useMemo(
477
- () => ({
478
- client,
479
- rootData,
480
- pageData,
481
- commerce: commerce ?? client?.commerce,
482
- merchantOverrides,
483
- themeSettings: themeSettingsStore.getSnapshot(),
484
- themeSettingsStore,
485
- translationStore
486
- }),
487
- [
488
- client,
489
- rootData,
490
- pageData,
491
- commerce,
492
- merchantOverrides,
493
- themeSettingsStore,
494
- translationStore
495
- ]
496
- );
497
- return /* @__PURE__ */ jsxRuntime.jsx(WeaverseNextContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
498
- TranslationProvider,
499
- {
500
- merchantOverrides,
501
- staticContent,
502
- t: props.t,
503
- translationStore,
504
- children
505
- }
506
- ) });
507
- }
508
-
509
- // src/hooks.ts
510
- var OUTSIDE_PROVIDER_ERROR = "must be used inside a <WeaverseNextProvider>.";
511
- function useWeaverseNextContext(hookName) {
512
- let context = react$1.useContext(WeaverseNextContext);
513
- if (!context) {
514
- throw new Error(`[@weaverse/next] ${hookName} ${OUTSIDE_PROVIDER_ERROR}`);
515
- }
516
- return context;
517
- }
518
- function useWeaverseRootData() {
519
- return useWeaverseNextContext("useWeaverseRootData").rootData;
520
- }
521
- function useWeaversePageData() {
522
- return useWeaverseNextContext("useWeaversePageData").pageData;
523
- }
524
- function useWeaverseCommerce() {
525
- return useWeaverseNextContext("useWeaverseCommerce").commerce;
526
- }
527
- function useThemeSettings() {
528
- let { themeSettingsStore } = useWeaverseNextContext("useThemeSettings");
529
- return react$1.useSyncExternalStore(
530
- themeSettingsStore.subscribe,
531
- themeSettingsStore.getSnapshot,
532
- themeSettingsStore.getServerSnapshot
533
- );
534
- }
25
+ var isBrowser = typeof window !== "undefined";
26
+ var isIframe = isBrowser && window.top !== window.self;
535
27
 
536
28
  // src/loader.ts
537
29
  function isItemNode(node) {
@@ -685,344 +177,6 @@ function buildWeaverseNextRequestInfo(context) {
685
177
  ...context?.handle ? { handle: context.handle } : {}
686
178
  };
687
179
  }
688
-
689
- // src/runtime.ts
690
- function getRuntimeWindow() {
691
- return typeof window === "undefined" ? void 0 : window;
692
- }
693
- function getRenderablePage(data) {
694
- let page = data.page;
695
- let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
696
- return { ...page, rootId };
697
- }
698
- function getConfigString(configs, key) {
699
- let value = configs?.[key];
700
- return typeof value === "string" ? value : void 0;
701
- }
702
- function resolveModeFlag(config, key) {
703
- return config.client?.requestContext?.[key] === true || config.data.configs?.[key] === true;
704
- }
705
- function resolveSectionType(config) {
706
- return config.client?.requestContext?.sectionType || getConfigString(config.data.configs, "sectionType") || void 0;
707
- }
708
- function getRecordString(record, key) {
709
- let value = record?.[key];
710
- return typeof value === "string" ? value : void 0;
711
- }
712
- function resolveProjectId(client, data, fallback) {
713
- let projectId = client?.projectId;
714
- if (projectId) {
715
- return projectId;
716
- }
717
- let configProjectId = getConfigString(data.configs, "projectId");
718
- if (configProjectId) {
719
- return configProjectId;
720
- }
721
- return getRecordString(data.project, "id") ?? fallback;
722
- }
723
- function resolveDataContext(config) {
724
- if (config.dataContext) {
725
- return config.dataContext;
726
- }
727
- if (config.client?.dataContext) {
728
- return config.client.dataContext;
729
- }
730
- return {};
731
- }
732
- function getRuntimeKey(pageId, requestInfo) {
733
- return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`;
734
- }
735
- function registerRuntime(runtime) {
736
- let runtimeWindow = getRuntimeWindow();
737
- if (!runtimeWindow) {
738
- return;
739
- }
740
- runtimeWindow.__weaverses ??= {};
741
- runtimeWindow.__weaverses[runtime.pageId] = runtime;
742
- runtimeWindow.__weaverse = runtime;
743
- }
744
- function rebindPageItemsToRuntime(runtime) {
745
- let items = runtime.data?.items;
746
- if (!items) {
747
- return;
748
- }
749
- for (let { id } of items) {
750
- let instance = runtime.itemInstances.get(id);
751
- if (instance && instance.weaverse !== runtime) {
752
- instance.weaverse = runtime;
753
- }
754
- }
755
- }
756
- var WeaverseNextRuntime = class extends react.Weaverse {
757
- /** Stable ID of the page owned by this runtime. */
758
- pageId;
759
- /** Mutable callbacks and stores consumed by the Studio bridge. */
760
- internal;
761
- /** Path, query, and locale metadata for Studio navigation. */
762
- requestInfo;
763
- /** Whether this runtime renders a component preview. */
764
- isPreviewMode;
765
- /** Whether this runtime renders a saved revision. */
766
- isRevisionPreview;
767
- /** Component type rendered in section preview mode. */
768
- sectionType;
769
- // ─── Item-level translation sidecar (design mode only) ─────────────
770
- /**
771
- * Translation map received from Builder in design mode, keyed by item ID.
772
- * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to
773
- * components, so translations render without mutating the base `_store`.
774
- */
775
- translationMap = {};
776
- /** Locale associated with the item-level translation sidecar. */
777
- translationLocale = String();
778
- /** Weaverse language ID used when saving translation changes. */
779
- translationLanguageId = String();
780
- /**
781
- * Fresh page data captured while React was rendering. Runtime reuse happens
782
- * inside the renderer's render phase (`useMemo`), where applying it through
783
- * `setProjectData()` would emit item updates to `useSyncExternalStore`
784
- * subscribers mid-render. The renderer applies it post-commit via
785
- * `flushRenderPhaseUpdates()`. Never set on design-mode runtimes — the live
786
- * Studio tree owns the page data there.
787
- */
788
- pendingProjectData;
789
- /**
790
- * Reused item instances whose data was refreshed while this runtime was
791
- * constructed during render (core `initProject()` calls `setData()` on
792
- * them). Their data is already fresh; only the subscriber notification was
793
- * deferred to `flushRenderPhaseUpdates()`.
794
- */
795
- pendingItemUpdates = [];
796
- /** Create a browser runtime from a loaded page and its request context. */
797
- constructor(config) {
798
- let { client, data } = config;
799
- let page = getRenderablePage(data);
800
- let configs = data.configs;
801
- let requestContext = client?.requestContext;
802
- let isDesignMode = resolveModeFlag(config, "isDesignMode");
803
- let isPreviewMode = resolveModeFlag(config, "isPreviewMode");
804
- let isRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
805
- let sectionType = resolveSectionType(config);
806
- let projectId = resolveProjectId(client, data, page.id);
807
- ensureNextItemConstructor();
808
- super({
809
- projectId,
810
- data: page,
811
- isDesignMode,
812
- weaverseHost: getConfigString(configs, "weaverseHost"),
813
- weaverseVersion: getConfigString(configs, "weaverseVersion")
814
- });
815
- this.pageId = page.id;
816
- this.dataContext = resolveDataContext(config);
817
- this.requestInfo = buildWeaverseNextRequestInfo(requestContext);
818
- this.isDesignMode = isDesignMode;
819
- this.isPreviewMode = isPreviewMode;
820
- this.isRevisionPreview = isRevisionPreview;
821
- this.sectionType = sectionType;
822
- let translationStore = config.translationStore ?? new TranslationStore();
823
- this.internal = {
824
- merchantOverrides: config.merchantOverrides,
825
- navigate: config.navigate,
826
- pageAssignment: data.pageAssignment,
827
- project: data.project,
828
- revalidate: config.revalidate,
829
- themeSettingsStore: config.themeSettingsStore ?? createWeaverseNextThemeSettingsStore({
830
- schema: client?.themeSchema,
831
- settings: client?.themeSettings
832
- }),
833
- translationStore,
834
- themeTextStore: translationStore
835
- };
836
- this.extractTranslationSidecar();
837
- }
838
- /**
839
- * Pull `translationMap` / `translationLocale` / `translationLanguageId` off
840
- * the current page data (Builder attaches them in design mode). Unlike
841
- * Hydrogen, this also clears the sidecar to defaults when the new page data
842
- * carries none, so a reused runtime / project-data swap can't leave a stale
843
- * map overlaying the fresh tree.
844
- */
845
- extractTranslationSidecar = () => {
846
- let pageData = this.data;
847
- let translationMap = pageData?.translationMap;
848
- if (translationMap) {
849
- this.translationMap = translationMap;
850
- this.translationLocale = pageData?.translationLocale || "";
851
- this.translationLanguageId = pageData?.translationLanguageId || "";
852
- } else {
853
- this.translationMap = {};
854
- this.translationLocale = "";
855
- this.translationLanguageId = "";
856
- }
857
- };
858
- /**
859
- * Replace the translation sidecar (Builder pushes this when translation data
860
- * arrives or the active language changes) and refresh every item so their
861
- * merged snapshots recompute.
862
- */
863
- setTranslationSidecar = (map = {}, locale = "", languageId = "") => {
864
- this.translationMap = map;
865
- this.translationLocale = locale;
866
- this.translationLanguageId = languageId;
867
- this.refreshAllItems();
868
- };
869
- /**
870
- * Update a single translatable field for one item. Assigns a new per-item
871
- * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
872
- * invalidates, then triggers only that item's subscribers.
873
- */
874
- updateTranslation = (itemId, key, originalValue, translatedValue) => {
875
- if (!this.translationMap[itemId]) {
876
- this.translationMap[itemId] = {};
877
- }
878
- this.translationMap[itemId] = {
879
- ...this.translationMap[itemId],
880
- [key]: { originalValue, translatedValue }
881
- };
882
- let instance = this.itemInstances.get(itemId);
883
- if (instance) {
884
- instance.triggerUpdate();
885
- }
886
- };
887
- /**
888
- * Collect translation changes for the save flow. Returns `undefined` unless
889
- * both the locale and language ID are set and at least one entry exists;
890
- * each entry key is namespaced as `data.<field>` to match Builder.
891
- */
892
- getTranslationChanges = () => {
893
- let languageId = this.translationLanguageId;
894
- if (!(this.translationLocale && languageId)) {
895
- return;
896
- }
897
- let entries = [];
898
- for (let [itemId, fields] of Object.entries(this.translationMap)) {
899
- for (let [key, entry] of Object.entries(fields)) {
900
- entries.push({
901
- itemId,
902
- key: `data.${key}`,
903
- originalValue: entry.originalValue,
904
- translatedValue: entry.translatedValue
905
- });
906
- }
907
- }
908
- if (entries.length === 0) {
909
- return;
910
- }
911
- return { languageId, entries };
912
- };
913
- /**
914
- * Re-extract the translation sidecar whenever project data is replaced (route
915
- * change / non-design reuse), before rebuilding item stores. Takes the
916
- * renderable page shape (`rootId` resolved) that `getRenderablePage()` and
917
- * the reuse branch pass in.
918
- */
919
- setProjectData = (data) => {
920
- this.data = data;
921
- this.extractTranslationSidecar();
922
- this.initProject();
923
- };
924
- /**
925
- * Apply updates deferred off the render phase: swap in any pending page data
926
- * captured on runtime reuse, then notify items whose data was refreshed
927
- * during construction. The renderer calls this from a layout effect right
928
- * after commit, so subscribers re-render before paint (no content flash) and
929
- * without React's setState-in-render warning.
930
- */
931
- flushRenderPhaseUpdates = () => {
932
- let pendingData = this.pendingProjectData;
933
- if (pendingData) {
934
- this.pendingProjectData = void 0;
935
- this.setProjectData(pendingData);
936
- }
937
- let pendingItems = this.pendingItemUpdates;
938
- if (pendingItems.length > 0) {
939
- this.pendingItemUpdates = [];
940
- for (let item of pendingItems) {
941
- item.triggerUpdate();
942
- }
943
- }
944
- };
945
- };
946
- function createWeaverseNextRuntime(config) {
947
- let requestInfo = buildWeaverseNextRequestInfo(config.client?.requestContext);
948
- let page = getRenderablePage(config.data);
949
- let runtimeWindow = getRuntimeWindow();
950
- let existing = runtimeWindow?.__weaverses?.[page.id];
951
- let requestKey = getRuntimeKey(page.id, requestInfo);
952
- if (existing?.__weaverseNextRequestKey === requestKey) {
953
- let configs = config.data.configs;
954
- let nextIsDesignMode = resolveModeFlag(config, "isDesignMode");
955
- let nextIsPreviewMode = resolveModeFlag(config, "isPreviewMode");
956
- let nextIsRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
957
- let nextSectionType = resolveSectionType(config);
958
- if (existing.isDesignMode || nextIsDesignMode) {
959
- existing.pendingProjectData = void 0;
960
- } else {
961
- existing.pendingProjectData = page;
962
- }
963
- existing.__weaverseNextLatestData = page;
964
- existing.dataContext = resolveDataContext(config);
965
- existing.requestInfo = requestInfo;
966
- existing.projectId = resolveProjectId(config.client, config.data, page.id);
967
- existing.isDesignMode = nextIsDesignMode;
968
- existing.isPreviewMode = nextIsPreviewMode;
969
- existing.isRevisionPreview = nextIsRevisionPreview;
970
- existing.sectionType = nextSectionType;
971
- existing.weaverseHost = getConfigString(configs, "weaverseHost") ?? existing.weaverseHost;
972
- existing.weaverseVersion = getConfigString(configs, "weaverseVersion") ?? existing.weaverseVersion;
973
- existing.internal.pageAssignment = config.data.pageAssignment;
974
- existing.internal.project = config.data.project;
975
- if (config.navigate) {
976
- existing.internal.navigate = config.navigate;
977
- }
978
- if (config.revalidate) {
979
- existing.internal.revalidate = config.revalidate;
980
- }
981
- if (config.themeSettingsStore) {
982
- existing.internal.themeSettingsStore = config.themeSettingsStore;
983
- }
984
- if (config.translationStore) {
985
- existing.internal.translationStore = config.translationStore;
986
- existing.internal.themeTextStore = config.translationStore;
987
- }
988
- existing.internal.merchantOverrides = config.merchantOverrides;
989
- registerRuntime(existing);
990
- return existing;
991
- }
992
- let [runtime, refreshedItems] = collectDeferredItemUpdates(
993
- () => new WeaverseNextRuntime(config)
994
- );
995
- runtime.pendingItemUpdates = refreshedItems;
996
- rebindPageItemsToRuntime(runtime);
997
- runtime.__weaverseNextRequestKey = requestKey;
998
- runtime.__weaverseNextLatestData = page;
999
- registerRuntime(runtime);
1000
- return runtime;
1001
- }
1002
- function bindWeaverseNextStudioRuntime(runtime) {
1003
- if (!runtime.isDesignMode) {
1004
- return false;
1005
- }
1006
- let studio = getRuntimeWindow()?.weaverseStudio;
1007
- if (!studio) {
1008
- return false;
1009
- }
1010
- let boundRuntime = runtime;
1011
- let activeRuntime = studio.weaverse;
1012
- let activeRequestInfo = activeRuntime?.requestInfo;
1013
- let isActiveUrl = !activeRequestInfo || activeRequestInfo.pathname === runtime.requestInfo.pathname && activeRequestInfo.search === runtime.requestInfo.search;
1014
- if (!(boundRuntime.__weaverseNextStudioBound && isActiveUrl)) {
1015
- studio.init?.(runtime);
1016
- boundRuntime.__weaverseNextStudioBound = true;
1017
- return true;
1018
- }
1019
- studio.refreshStudio?.({
1020
- data: boundRuntime.__weaverseNextLatestData ?? runtime.data,
1021
- pageId: runtime.pageId,
1022
- requestInfo: runtime.requestInfo
1023
- });
1024
- return true;
1025
- }
1026
180
  var DEFAULT_REVALIDATE_ENDPOINT = "/api/weaverse/revalidate";
1027
181
  var MAX_ROUTE_CONTEXT_HANDLE_LENGTH = 512;
1028
182
  var DENIED_ROUTE_CONTEXT_PARAMS = [
@@ -1108,156 +262,6 @@ async function revalidateWeaverseNextItem(runtime, draftItem, endpoint = DEFAULT
1108
262
  let { loaderData } = await response.json();
1109
263
  instance.setData({ loaderData: loaderData ?? null });
1110
264
  }
1111
- var STUDIO_BIND_RETRY_INTERVAL_MS = 50;
1112
- var STUDIO_BIND_MAX_ATTEMPTS = 100;
1113
- function WeaverseNextStudioBridge(props) {
1114
- let { runtime, navigate, revalidate, revalidateItem } = props;
1115
- let lastRuntimeRef = react$1.useRef(runtime);
1116
- let lastRuntimeDataRef = react$1.useRef(runtime.data);
1117
- let lastRequestInfoRef = react$1.useRef(runtime.requestInfo);
1118
- react$1.useEffect(() => {
1119
- if (navigate) {
1120
- runtime.internal.navigate = navigate;
1121
- }
1122
- if (revalidate) {
1123
- runtime.internal.revalidate = revalidate;
1124
- }
1125
- if (revalidateItem) {
1126
- runtime.internal.revalidateItem = revalidateItem;
1127
- }
1128
- if (bindWeaverseNextStudioRuntime(runtime) || !runtime.isDesignMode) {
1129
- return;
1130
- }
1131
- let attempts = 0;
1132
- let interval = window.setInterval(() => {
1133
- attempts += 1;
1134
- if (bindWeaverseNextStudioRuntime(runtime) || attempts >= STUDIO_BIND_MAX_ATTEMPTS) {
1135
- window.clearInterval(interval);
1136
- }
1137
- }, STUDIO_BIND_RETRY_INTERVAL_MS);
1138
- return () => window.clearInterval(interval);
1139
- }, [runtime, navigate, revalidate, revalidateItem]);
1140
- react$1.useEffect(() => {
1141
- if (lastRuntimeRef.current !== runtime) {
1142
- lastRuntimeRef.current = runtime;
1143
- lastRuntimeDataRef.current = runtime.data;
1144
- lastRequestInfoRef.current = runtime.requestInfo;
1145
- return;
1146
- }
1147
- if (lastRuntimeDataRef.current === runtime.data && lastRequestInfoRef.current === runtime.requestInfo) {
1148
- return;
1149
- }
1150
- lastRuntimeDataRef.current = runtime.data;
1151
- lastRequestInfoRef.current = runtime.requestInfo;
1152
- bindWeaverseNextStudioRuntime(runtime);
1153
- }, [runtime, runtime.data, runtime.requestInfo]);
1154
- return null;
1155
- }
1156
-
1157
- // src/studio-router.ts
1158
- function shouldResetScroll(options) {
1159
- if (!options || typeof options !== "object") {
1160
- return true;
1161
- }
1162
- return !options.preventScrollReset;
1163
- }
1164
- function createWeaverseNextStudioInternals(router, options = {}) {
1165
- return {
1166
- navigate: (to, navigateOptions) => {
1167
- let scroll = shouldResetScroll(navigateOptions);
1168
- if (options.replace) {
1169
- router.replace(to, { scroll });
1170
- } else {
1171
- router.push(to, { scroll });
1172
- }
1173
- },
1174
- revalidate: () => {
1175
- router.refresh();
1176
- }
1177
- };
1178
- }
1179
- function useWeaverseNextStudioInternals(options) {
1180
- let router = navigation.useRouter();
1181
- let ref = react$1.useRef(null);
1182
- if (!ref.current || ref.current.router !== router || ref.current.replace !== options?.replace) {
1183
- ref.current = {
1184
- internals: createWeaverseNextStudioInternals(router, options),
1185
- replace: options?.replace,
1186
- router
1187
- };
1188
- }
1189
- return ref.current.internals;
1190
- }
1191
- function WeaverseNextStudio(props) {
1192
- let { runtime, replace, revalidateEndpoint } = props;
1193
- let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace });
1194
- let endpoint = revalidateEndpoint ?? DEFAULT_REVALIDATE_ENDPOINT;
1195
- let revalidateItemRef = react$1.useRef(null);
1196
- if (revalidateItemRef.current?.endpoint !== endpoint || revalidateItemRef.current.runtime !== runtime) {
1197
- revalidateItemRef.current = {
1198
- endpoint,
1199
- revalidateItem: (draftItem) => revalidateWeaverseNextItem(runtime, draftItem, endpoint),
1200
- runtime
1201
- };
1202
- }
1203
- return /* @__PURE__ */ jsxRuntime.jsx(
1204
- WeaverseNextStudioBridge,
1205
- {
1206
- navigate,
1207
- revalidate,
1208
- revalidateItem: revalidateItemRef.current.revalidateItem,
1209
- runtime
1210
- }
1211
- );
1212
- }
1213
- var EMPTY_DATA_CONTEXT = {};
1214
- var useIsomorphicLayoutEffect = typeof window === "undefined" ? react$1.useEffect : react$1.useLayoutEffect;
1215
- function getRenderablePage2(data) {
1216
- let page = data?.page;
1217
- if (!page) {
1218
- return null;
1219
- }
1220
- let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
1221
- return { ...page, rootId };
1222
- }
1223
- var WeaverseNextRenderer = react$1.memo(function WeaverseNextRendererComponent(props) {
1224
- let context = react$1.useContext(WeaverseNextContext);
1225
- let client = props.client ?? context?.client;
1226
- let data = props.data ?? client?.data ?? null;
1227
- let dataContext = props.dataContext ?? client?.dataContext ?? EMPTY_DATA_CONTEXT;
1228
- let page = react$1.useMemo(() => getRenderablePage2(data), [data]);
1229
- let weaverse = react$1.useMemo(() => {
1230
- if (!page) {
1231
- return null;
1232
- }
1233
- return createWeaverseNextRuntime({
1234
- client,
1235
- data: { ...data, page },
1236
- dataContext,
1237
- merchantOverrides: context?.merchantOverrides,
1238
- themeSettingsStore: context?.themeSettingsStore,
1239
- translationStore: context?.translationStore
1240
- });
1241
- }, [
1242
- client,
1243
- page,
1244
- data,
1245
- dataContext,
1246
- context?.merchantOverrides,
1247
- context?.themeSettingsStore,
1248
- context?.translationStore
1249
- ]);
1250
- useIsomorphicLayoutEffect(() => {
1251
- weaverse?.flushRenderPhaseUpdates();
1252
- }, [weaverse]);
1253
- if (!weaverse) {
1254
- return null;
1255
- }
1256
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1257
- /* @__PURE__ */ jsxRuntime.jsx(react.WeaverseRoot, { context: weaverse }),
1258
- /* @__PURE__ */ jsxRuntime.jsx(WeaverseNextStudio, { runtime: weaverse })
1259
- ] });
1260
- });
1261
265
 
1262
266
  // src/seo.ts
1263
267
  function hasOpenGraphContent(seo) {
@@ -1324,6 +328,29 @@ function getWeaverseNextSeoMetadata(data) {
1324
328
  return formatWeaverseNextSeoMetadata(page?.seo ?? null);
1325
329
  }
1326
330
 
331
+ // src/studio-router.ts
332
+ function shouldResetScroll(options) {
333
+ if (!options || typeof options !== "object") {
334
+ return true;
335
+ }
336
+ return !options.preventScrollReset;
337
+ }
338
+ function createWeaverseNextStudioInternals(router, options = {}) {
339
+ return {
340
+ navigate: (to, navigateOptions) => {
341
+ let scroll = shouldResetScroll(navigateOptions);
342
+ if (options.replace) {
343
+ router.replace(to, { scroll });
344
+ } else {
345
+ router.push(to, { scroll });
346
+ }
347
+ },
348
+ revalidate: () => {
349
+ router.refresh();
350
+ }
351
+ };
352
+ }
353
+
1327
354
  // src/studio-script-src.ts
1328
355
  var TRUSTED_STUDIO_DOMAINS = ["weaverse.io", "weaverse.dev"];
1329
356
  function isLoopbackHostname(hostname) {
@@ -1393,92 +420,212 @@ function resolveWeaverseNextStudioScriptSrc(context, options = {}) {
1393
420
  return version ? `${url}?v=${encodeURIComponent(version)}` : url;
1394
421
  }
1395
422
 
1396
- // src/studio-connect.tsx
1397
- var loadedScriptSrcs = /* @__PURE__ */ new Set();
1398
- function loadScript(src) {
1399
- if (typeof document === "undefined") {
1400
- return;
1401
- }
1402
- if (loadedScriptSrcs.has(src)) {
1403
- return;
423
+ // src/theme-settings-store.ts
424
+ function createWeaverseNextThemeSettingsStore(options = {}) {
425
+ let listeners = /* @__PURE__ */ new Set();
426
+ let store = {
427
+ publicEnv: options.publicEnv,
428
+ schema: options.schema,
429
+ settings: { ...options.settings ?? {} },
430
+ getServerSnapshot: () => store.settings,
431
+ getSnapshot: () => store.settings,
432
+ subscribe: (listener) => {
433
+ listeners.add(listener);
434
+ return () => {
435
+ listeners.delete(listener);
436
+ };
437
+ },
438
+ updateThemeSettings: (next) => {
439
+ store.settings = { ...store.settings, ...next };
440
+ for (let listener of listeners) {
441
+ listener();
442
+ }
443
+ }
444
+ };
445
+ return store;
446
+ }
447
+
448
+ // src/translate.ts
449
+ function getNestedKey(obj, path, fallback) {
450
+ let keys = path.split(".");
451
+ let current = obj;
452
+ for (let key of keys) {
453
+ if (current == null || typeof current !== "object") {
454
+ return fallback;
455
+ }
456
+ current = current[key];
1404
457
  }
1405
- let existing = document.querySelector(`script[src="${src}"]`);
1406
- if (existing) {
1407
- loadedScriptSrcs.add(src);
1408
- return;
458
+ if (typeof current === "string") {
459
+ return current;
1409
460
  }
1410
- let script = document.createElement("script");
1411
- script.async = true;
1412
- script.src = src;
1413
- document.head.appendChild(script);
1414
- loadedScriptSrcs.add(src);
461
+ return fallback;
1415
462
  }
1416
- function loadWeaverseNextStudioScript(context, options = {}) {
1417
- let resolvedContext = context;
1418
- if (!resolvedContext && typeof window !== "undefined") {
1419
- resolvedContext = {
1420
- searchParams: new URLSearchParams(window.location.search),
1421
- url: window.location.href
1422
- };
463
+ function interpolate(template, variables) {
464
+ if (!variables) {
465
+ return template;
1423
466
  }
1424
- let src = resolveWeaverseNextStudioScriptSrc(resolvedContext, {
1425
- storefrontHostname: options.storefrontHostname ?? (typeof window === "undefined" ? void 0 : window.location.hostname)
467
+ return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
468
+ let value = variables[key];
469
+ return value === void 0 ? match : String(value);
1426
470
  });
1427
- if (src) {
1428
- loadScript(src);
1429
- }
1430
471
  }
1431
- function WeaverseNextStudioConnect(props) {
1432
- react$1.useEffect(() => {
1433
- loadWeaverseNextStudioScript(props.context, {
1434
- storefrontHostname: props.storefrontHostname
1435
- });
1436
- }, [props.context, props.storefrontHostname]);
1437
- return null;
472
+ function createTranslate(sources) {
473
+ let { staticContent, merchantOverrides, designOverrides, externalT } = sources;
474
+ return (key, variables) => {
475
+ if (externalT) {
476
+ let external = externalT(key, variables);
477
+ if (external && external !== key) {
478
+ return external;
479
+ }
480
+ }
481
+ let design = designOverrides && Object.hasOwn(designOverrides, key) ? designOverrides[key] : void 0;
482
+ let override = merchantOverrides ? getNestedKey(merchantOverrides, key) : void 0;
483
+ let staticValue = getNestedKey(staticContent, key);
484
+ let raw = design ?? override ?? staticValue ?? key;
485
+ return interpolate(raw, variables);
486
+ };
1438
487
  }
1439
488
 
1440
- Object.defineProperty(exports, "isBrowser", {
489
+ // src/translation-store.ts
490
+ var TranslationStore = class {
491
+ /** Current flat translation overrides keyed by dot path. */
492
+ overrides = {};
493
+ listeners = /* @__PURE__ */ new Set();
494
+ /** Replace every override and notify subscribers. */
495
+ setOverrides = (overrides) => {
496
+ this.overrides = { ...overrides };
497
+ this.emit();
498
+ };
499
+ /** Merge changed overrides into the current values and notify subscribers. */
500
+ updateOverrides = (newOverrides) => {
501
+ this.overrides = { ...this.overrides, ...newOverrides };
502
+ this.emit();
503
+ };
504
+ /** Return the current client-side override snapshot. */
505
+ getSnapshot = () => this.overrides;
506
+ /** Return the override snapshot used during server rendering. */
507
+ getServerSnapshot = () => this.overrides;
508
+ /** Subscribe to override changes and return an unsubscribe function. */
509
+ subscribe = (callback) => {
510
+ this.listeners.add(callback);
511
+ return () => {
512
+ this.listeners.delete(callback);
513
+ };
514
+ };
515
+ emit = () => {
516
+ for (const listener of Array.from(this.listeners)) {
517
+ try {
518
+ listener();
519
+ } catch (error) {
520
+ console.error("TranslationStore: Listener error", error);
521
+ }
522
+ }
523
+ };
524
+ };
525
+ var ThemeTextStore = TranslationStore;
526
+
527
+ Object.defineProperty(exports, "ThemeTextProvider", {
528
+ enumerable: true,
529
+ get: function () { return clientBoundary_js.ThemeTextProvider; }
530
+ });
531
+ Object.defineProperty(exports, "TranslationProvider", {
532
+ enumerable: true,
533
+ get: function () { return clientBoundary_js.TranslationProvider; }
534
+ });
535
+ Object.defineProperty(exports, "WeaverseNextProvider", {
536
+ enumerable: true,
537
+ get: function () { return clientBoundary_js.WeaverseNextProvider; }
538
+ });
539
+ Object.defineProperty(exports, "WeaverseNextRenderer", {
540
+ enumerable: true,
541
+ get: function () { return clientBoundary_js.WeaverseNextRenderer; }
542
+ });
543
+ Object.defineProperty(exports, "WeaverseNextRootProvider", {
544
+ enumerable: true,
545
+ get: function () { return clientBoundary_js.WeaverseNextRootProvider; }
546
+ });
547
+ Object.defineProperty(exports, "WeaverseNextRuntime", {
548
+ enumerable: true,
549
+ get: function () { return clientBoundary_js.WeaverseNextRuntime; }
550
+ });
551
+ Object.defineProperty(exports, "WeaverseNextStudio", {
552
+ enumerable: true,
553
+ get: function () { return clientBoundary_js.WeaverseNextStudio; }
554
+ });
555
+ Object.defineProperty(exports, "WeaverseNextStudioBridge", {
556
+ enumerable: true,
557
+ get: function () { return clientBoundary_js.WeaverseNextStudioBridge; }
558
+ });
559
+ Object.defineProperty(exports, "WeaverseNextStudioConnect", {
1441
560
  enumerable: true,
1442
- get: function () { return react.isBrowser; }
561
+ get: function () { return clientBoundary_js.WeaverseNextStudioConnect; }
1443
562
  });
1444
- Object.defineProperty(exports, "isIframe", {
563
+ Object.defineProperty(exports, "bindWeaverseNextStudioRuntime", {
1445
564
  enumerable: true,
1446
- get: function () { return react.isIframe; }
565
+ get: function () { return clientBoundary_js.bindWeaverseNextStudioRuntime; }
566
+ });
567
+ Object.defineProperty(exports, "createWeaverseNextClient", {
568
+ enumerable: true,
569
+ get: function () { return clientBoundary_js.createWeaverseNextClient; }
570
+ });
571
+ Object.defineProperty(exports, "createWeaverseNextRuntime", {
572
+ enumerable: true,
573
+ get: function () { return clientBoundary_js.createWeaverseNextRuntime; }
574
+ });
575
+ Object.defineProperty(exports, "loadWeaverseNextStudioScript", {
576
+ enumerable: true,
577
+ get: function () { return clientBoundary_js.loadWeaverseNextStudioScript; }
1447
578
  });
1448
579
  Object.defineProperty(exports, "useChildInstances", {
1449
580
  enumerable: true,
1450
- get: function () { return react.useChildInstances; }
581
+ get: function () { return clientBoundary_js.useChildInstances; }
1451
582
  });
1452
583
  Object.defineProperty(exports, "useItemInstance", {
1453
584
  enumerable: true,
1454
- get: function () { return react.useItemInstance; }
585
+ get: function () { return clientBoundary_js.useItemInstance; }
1455
586
  });
1456
587
  Object.defineProperty(exports, "useParentInstance", {
1457
588
  enumerable: true,
1458
- get: function () { return react.useParentInstance; }
589
+ get: function () { return clientBoundary_js.useParentInstance; }
590
+ });
591
+ Object.defineProperty(exports, "useThemeSettings", {
592
+ enumerable: true,
593
+ get: function () { return clientBoundary_js.useThemeSettings; }
594
+ });
595
+ Object.defineProperty(exports, "useThemeText", {
596
+ enumerable: true,
597
+ get: function () { return clientBoundary_js.useThemeText; }
598
+ });
599
+ Object.defineProperty(exports, "useTranslation", {
600
+ enumerable: true,
601
+ get: function () { return clientBoundary_js.useTranslation; }
1459
602
  });
1460
603
  Object.defineProperty(exports, "useWeaverse", {
1461
604
  enumerable: true,
1462
- get: function () { return react.useWeaverse; }
605
+ get: function () { return clientBoundary_js.useWeaverse; }
606
+ });
607
+ Object.defineProperty(exports, "useWeaverseCommerce", {
608
+ enumerable: true,
609
+ get: function () { return clientBoundary_js.useWeaverseCommerce; }
610
+ });
611
+ Object.defineProperty(exports, "useWeaverseNextStudioInternals", {
612
+ enumerable: true,
613
+ get: function () { return clientBoundary_js.useWeaverseNextStudioInternals; }
614
+ });
615
+ Object.defineProperty(exports, "useWeaversePageData", {
616
+ enumerable: true,
617
+ get: function () { return clientBoundary_js.useWeaversePageData; }
618
+ });
619
+ Object.defineProperty(exports, "useWeaverseRootData", {
620
+ enumerable: true,
621
+ get: function () { return clientBoundary_js.useWeaverseRootData; }
1463
622
  });
1464
623
  exports.DEFAULT_REVALIDATE_ENDPOINT = DEFAULT_REVALIDATE_ENDPOINT;
1465
- exports.ThemeTextProvider = ThemeTextProvider;
1466
624
  exports.ThemeTextStore = ThemeTextStore;
1467
- exports.TranslationProvider = TranslationProvider;
1468
625
  exports.TranslationStore = TranslationStore;
1469
- exports.WeaverseNextProvider = WeaverseNextProvider;
1470
- exports.WeaverseNextRenderer = WeaverseNextRenderer;
1471
- exports.WeaverseNextRootProvider = WeaverseNextRootProvider;
1472
- exports.WeaverseNextRuntime = WeaverseNextRuntime;
1473
- exports.WeaverseNextStudio = WeaverseNextStudio;
1474
- exports.WeaverseNextStudioBridge = WeaverseNextStudioBridge;
1475
- exports.WeaverseNextStudioConnect = WeaverseNextStudioConnect;
1476
- exports.bindWeaverseNextStudioRuntime = bindWeaverseNextStudioRuntime;
1477
626
  exports.buildWeaverseNextRequestInfo = buildWeaverseNextRequestInfo;
1478
627
  exports.buildWeaverseNextRevalidateRouteContext = buildWeaverseNextRevalidateRouteContext;
1479
628
  exports.createTranslate = createTranslate;
1480
- exports.createWeaverseNextClient = createWeaverseNextClient;
1481
- exports.createWeaverseNextRuntime = createWeaverseNextRuntime;
1482
629
  exports.createWeaverseNextStudioInternals = createWeaverseNextStudioInternals;
1483
630
  exports.createWeaverseNextThemeSettingsStore = createWeaverseNextThemeSettingsStore;
1484
631
  exports.formatWeaverseNextSeoMetadata = formatWeaverseNextSeoMetadata;
@@ -1486,17 +633,11 @@ exports.generateDataFromSchema = generateDataFromSchema;
1486
633
  exports.getNestedKey = getNestedKey;
1487
634
  exports.getWeaverseNextSeoMetadata = getWeaverseNextSeoMetadata;
1488
635
  exports.interpolate = interpolate;
1489
- exports.loadWeaverseNextStudioScript = loadWeaverseNextStudioScript;
636
+ exports.isBrowser = isBrowser;
637
+ exports.isIframe = isIframe;
1490
638
  exports.resolveWeaverseNextStudioScriptSrc = resolveWeaverseNextStudioScriptSrc;
1491
639
  exports.revalidateWeaverseNextItem = revalidateWeaverseNextItem;
1492
640
  exports.runWeaverseComponentLoaders = runWeaverseComponentLoaders;
1493
- exports.useThemeSettings = useThemeSettings;
1494
- exports.useThemeText = useThemeText;
1495
- exports.useTranslation = useTranslation;
1496
- exports.useWeaverseCommerce = useWeaverseCommerce;
1497
- exports.useWeaverseNextStudioInternals = useWeaverseNextStudioInternals;
1498
- exports.useWeaversePageData = useWeaversePageData;
1499
- exports.useWeaverseRootData = useWeaverseRootData;
1500
641
  Object.keys(schema).forEach(function (k) {
1501
642
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
1502
643
  enumerable: true,