@weaverse/next 0.1.0-alpha.6 → 0.1.0-alpha.8

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.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Weaverse } from '@weaverse/react';
2
2
  export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  export { InspectorGroup, PageType, SchemaType, createSchema } from '@weaverse/schema';
4
- import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, v as WeaverseNextRequestContext, s as WeaverseNextLoaderData, w as WeaverseNextRequestInfo, j as WeaverseNextComponentData, G as WeaverseNextThemeSettingsStore, y as WeaverseNextRuntimeInternal, x as WeaverseNextRuntimeConfig } from './seo-kwaliD-K.mjs';
5
- export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageData, z as WeaverseNextSeoMetadata, D as WeaverseNextStorefront, H as WeaverseProduct, I as formatWeaverseNextSeoMetadata, J as getWeaverseNextSeoMetadata } from './seo-kwaliD-K.mjs';
4
+ import { h as WeaverseNextClientConfig, g as WeaverseNextClient, i as WeaverseNextCommerceContext, x as WeaverseNextRequestContext, t as WeaverseNextLoaderData, a as TranslationStore, y as WeaverseNextRequestInfo, k as WeaverseNextComponentData, I as WeaverseNextThemeSettingsStore, A as WeaverseNextRuntimeInternal, M as WeaverseNextTranslationMap, z as WeaverseNextRuntimeConfig, J as WeaverseNextTranslationChanges, v as WeaverseNextPageData } from './seo-CpN6tC36.mjs';
5
+ export { T as ThemeTextStore, W as WeaverseArticle, b as WeaverseBlog, c as WeaverseCollection, d as WeaverseMetaObject, j as WeaverseNextComponent, l as WeaverseNextComponentLoaderArgs, m as WeaverseNextComponentProps, o as WeaverseNextCustomPageEntry, p as WeaverseNextFetchCustomPagesOptions, r as WeaverseNextI18n, s as WeaverseNextLoadPageInput, u as WeaverseNextPageAssignment, B as WeaverseNextSeoMetadata, F as WeaverseNextStorefront, K as WeaverseNextTranslationEntry, L as WeaverseNextTranslationItemEntry, N as WeaverseNextTranslationMapEntry, O as WeaverseProduct, P as formatWeaverseNextSeoMetadata, Q as getWeaverseNextSeoMetadata } from './seo-CpN6tC36.mjs';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import * as react from 'react';
8
8
  import { ReactNode } from 'react';
@@ -61,15 +61,157 @@ interface RunComponentLoadersArgs {
61
61
  */
62
62
  declare function runWeaverseComponentLoaders(args: RunComponentLoadersArgs): Promise<WeaverseNextLoaderData | null>;
63
63
 
64
+ /**
65
+ * Traverse a nested object by dot-path.
66
+ *
67
+ * @example
68
+ * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'
69
+ * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'
70
+ */
71
+ declare function getNestedKey(obj: Record<string, unknown>, path: string, fallback?: string): string | undefined;
72
+ /**
73
+ * Replace `{{variable}}` patterns in a string with provided values.
74
+ *
75
+ * @example
76
+ * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'
77
+ * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'
78
+ */
79
+ declare function interpolate(template: string, variables?: Record<string, string | number>): string;
80
+ /**
81
+ * Signature for a translation function.
82
+ */
83
+ type TranslateFunction = (key: string, variables?: Record<string, string | number>) => string;
84
+ interface TranslationValue {
85
+ /** Active-locale translated keys loaded from the storefront API. */
86
+ merchantOverrides: Record<string, unknown> | null;
87
+ /**
88
+ * Translate a key with optional variable interpolation.
89
+ *
90
+ * Priority chain (highest wins):
91
+ * 1. External `t` (passed into `WeaverseNextRootProvider` / `TranslationProvider`)
92
+ * 2. Design overrides (live Builder edits from `TranslationStore`)
93
+ * 3. `merchantOverrides` (DB/API overrides for the current locale)
94
+ * 4. `staticContent` (theme default JSON)
95
+ * 5. The key itself (fallback)
96
+ *
97
+ * @example
98
+ * t('cart.title') // => "Cart"
99
+ * t('badge.sale', { percentage: 15 }) // => "-15% Off"
100
+ */
101
+ t: TranslateFunction;
102
+ /**
103
+ * @deprecated Use {@link TranslationValue.translationStore} instead. Kept as a
104
+ * backward-compatible alias pointing at the same store instance.
105
+ */
106
+ themeTextStore: TranslationStore | null;
107
+ /** Exposed so the runtime/Studio bridge can attach it to `internal`. */
108
+ translationStore: TranslationStore | null;
109
+ }
110
+ interface TranslationProviderProps {
111
+ children: ReactNode;
112
+ merchantOverrides?: Record<string, unknown>;
113
+ staticContent: Record<string, unknown>;
114
+ /**
115
+ * Optional external translation function.
116
+ * When provided it becomes the **highest-priority** source:
117
+ * if it returns a non-empty string that differs from the raw key,
118
+ * that value is used; otherwise the internal resolution chain continues.
119
+ */
120
+ t?: TranslateFunction;
121
+ /**
122
+ * @deprecated Use {@link TranslationProviderProps.translationStore} instead.
123
+ * Still accepted for backward compatibility; ignored when `translationStore`
124
+ * is also provided.
125
+ */
126
+ themeTextStore?: TranslationStore | null;
127
+ /** Optional store for live design-mode text overrides from the builder. */
128
+ translationStore?: TranslationStore | null;
129
+ }
130
+ /**
131
+ * Build the `t()` translation function over a fixed set of sources.
132
+ *
133
+ * Resolution order, highest priority first:
134
+ * 1. `externalT` – host i18n (e.g. Shopify), unless it echoes the key
135
+ * 2. `designOverrides` – live design-mode edits, flat dot-path keys
136
+ * 3. `merchantOverrides` – locale overrides from the API, nested
137
+ * 4. `staticContent` – the theme's default locale JSON
138
+ * 5. the key itself
139
+ *
140
+ * Design overrides are looked up per-key (own properties only) rather than
141
+ * merged into `merchantOverrides`: a flat key like `cart.title` must override
142
+ * exactly that leaf without wiping sibling keys (`cart.subtitle`), and a
143
+ * per-key own-property lookup never builds nested objects from
144
+ * merchant-controlled keys, so it cannot pollute `Object.prototype`.
145
+ */
146
+ declare function createTranslate(sources: {
147
+ staticContent: Record<string, unknown>;
148
+ merchantOverrides?: Record<string, unknown>;
149
+ designOverrides?: Record<string, string>;
150
+ externalT?: TranslateFunction;
151
+ }): TranslateFunction;
152
+ /**
153
+ * Provider that wraps the app to expose the `t()` function.
154
+ *
155
+ * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)
156
+ * - `merchantOverrides` – locale-specific overrides fetched from the API
157
+ * - `translationStore` – optional store for live design-mode text overrides
158
+ * (the deprecated `themeTextStore` prop is accepted as a fallback)
159
+ */
160
+ declare function TranslationProvider({ staticContent, merchantOverrides, t: externalT, translationStore, themeTextStore, children, }: TranslationProviderProps): react_jsx_runtime.JSX.Element;
161
+ /**
162
+ * Hook to access the translation `t()` function.
163
+ *
164
+ * Must be used inside a component wrapped by `WeaverseNextRootProvider` or
165
+ * `TranslationProvider`.
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * function CartTitle() {
170
+ * let { t } = useTranslation()
171
+ * return <h2>{t('cart.title')}</h2>
172
+ * }
173
+ * ```
174
+ */
175
+ declare function useTranslation(): TranslationValue;
176
+ /**
177
+ * @deprecated Use {@link TranslationProvider} instead.
178
+ */
179
+ declare const ThemeTextProvider: typeof TranslationProvider;
180
+ /**
181
+ * @deprecated Use {@link useTranslation} instead.
182
+ */
183
+ declare const useThemeText: typeof useTranslation;
184
+ /**
185
+ * @deprecated Use {@link TranslationValue} instead.
186
+ */
187
+ type ThemeTextValue = TranslationValue;
188
+ /**
189
+ * @deprecated Use {@link TranslationProviderProps} instead.
190
+ */
191
+ type ThemeTextProviderProps = TranslationProviderProps;
192
+
64
193
  interface WeaverseNextProviderProps {
65
194
  children: ReactNode;
66
195
  client?: WeaverseNextClient;
67
196
  /** App-provided commerce context (storefront/cart/customer). */
68
197
  commerce?: WeaverseNextCommerceContext;
198
+ /**
199
+ * Active-locale static-text overrides (nested, from `loadThemeSettings()`).
200
+ * Adopts the root provider's `merchantOverrides` when omitted.
201
+ */
202
+ merchantOverrides?: Record<string, unknown>;
69
203
  /** Explicit page/route commerce data (replaces section-level `useLoaderData`). */
70
204
  pageData?: unknown;
71
205
  /** Explicit root/global data (replaces `useRouteLoaderData('root')`). */
72
206
  rootData?: unknown;
207
+ /**
208
+ * Theme default locale JSON (`loadThemeSettings().staticContent`). Adopts the
209
+ * root provider's `staticContent` when omitted, then falls back to
210
+ * `client.themeSchema.i18n.staticContent`.
211
+ */
212
+ staticContent?: Record<string, unknown>;
213
+ /** Optional external translation function (host i18n); highest priority in `t()`. */
214
+ t?: TranslateFunction;
73
215
  /** Theme settings override; falls back to `client.themeSettings`. */
74
216
  themeSettings?: Record<string, unknown>;
75
217
  }
@@ -144,13 +286,28 @@ interface RevalidateItemRuntimeLike {
144
286
  declare function revalidateWeaverseNextItem(runtime: RevalidateItemRuntimeLike, draftItem: WeaverseNextComponentData, endpoint?: string): Promise<void>;
145
287
 
146
288
  interface WeaverseNextRootContextValue {
289
+ /** Active-locale static-text overrides shared with route-level providers. */
290
+ merchantOverrides?: Record<string, unknown>;
291
+ /** Theme default locale JSON shared with route-level providers. */
292
+ staticContent: Record<string, unknown>;
147
293
  themeSettingsStore: WeaverseNextThemeSettingsStore;
294
+ /** Single live design-mode static-text override store for the whole session. */
295
+ translationStore: TranslationStore;
148
296
  }
149
297
  interface WeaverseNextRootProviderProps {
150
298
  children: ReactNode;
151
299
  /** Root-loaded theme settings (published-mode fetch, no design-mode context). */
152
300
  initialThemeSettings?: Record<string, unknown>;
301
+ /** Active-locale static-text overrides from `loadThemeSettings().merchantOverrides`. */
302
+ merchantOverrides?: Record<string, unknown>;
153
303
  publicEnv?: Record<string, string | undefined>;
304
+ /**
305
+ * Theme default locale JSON (`loadThemeSettings().staticContent`). Falls back
306
+ * to `themeSchema.i18n.staticContent` when omitted.
307
+ */
308
+ staticContent?: Record<string, unknown>;
309
+ /** Optional external translation function (host i18n); highest priority in `t()`. */
310
+ t?: TranslateFunction;
154
311
  themeSchema?: unknown;
155
312
  }
156
313
  /**
@@ -187,14 +344,50 @@ declare class WeaverseNextRuntime extends Weaverse {
187
344
  isPreviewMode: boolean;
188
345
  isRevisionPreview: boolean;
189
346
  sectionType?: string;
190
- translationMap: Record<string, unknown>;
347
+ /**
348
+ * Translation map received from Builder in design mode, keyed by item ID.
349
+ * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to
350
+ * components, so translations render without mutating the base `_store`.
351
+ */
352
+ translationMap: WeaverseNextTranslationMap;
191
353
  translationLocale: string;
192
354
  translationLanguageId: string;
193
355
  constructor(config: WeaverseNextRuntimeConfig);
194
- extractTranslationSidecar: () => undefined;
195
- setTranslationSidecar: (map?: Record<string, unknown>, locale?: string, languageId?: string) => void;
196
- updateTranslation: () => undefined;
197
- getTranslationChanges: () => undefined;
356
+ /**
357
+ * Pull `translationMap` / `translationLocale` / `translationLanguageId` off
358
+ * the current page data (Builder attaches them in design mode). Unlike
359
+ * Hydrogen, this also clears the sidecar to defaults when the new page data
360
+ * carries none, so a reused runtime / project-data swap can't leave a stale
361
+ * map overlaying the fresh tree.
362
+ */
363
+ extractTranslationSidecar: () => void;
364
+ /**
365
+ * Replace the translation sidecar (Builder pushes this when translation data
366
+ * arrives or the active language changes) and refresh every item so their
367
+ * merged snapshots recompute.
368
+ */
369
+ setTranslationSidecar: (map?: WeaverseNextTranslationMap, locale?: string, languageId?: string) => void;
370
+ /**
371
+ * Update a single translatable field for one item. Assigns a new per-item
372
+ * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
373
+ * invalidates, then triggers only that item's subscribers.
374
+ */
375
+ updateTranslation: (itemId: string, key: string, originalValue: string, translatedValue: string) => void;
376
+ /**
377
+ * Collect translation changes for the save flow. Returns `undefined` unless
378
+ * both the locale and language ID are set and at least one entry exists;
379
+ * each entry key is namespaced as `data.<field>` to match Builder.
380
+ */
381
+ getTranslationChanges: () => WeaverseNextTranslationChanges | undefined;
382
+ /**
383
+ * Re-extract the translation sidecar whenever project data is replaced (route
384
+ * change / non-design reuse), before rebuilding item stores. Takes the
385
+ * renderable page shape (`rootId` resolved) that `getRenderablePage()` and
386
+ * the reuse branch pass in.
387
+ */
388
+ setProjectData: (data: WeaverseNextPageData & {
389
+ rootId: string;
390
+ }) => void;
198
391
  }
199
392
  declare function createWeaverseNextRuntime(config: WeaverseNextRuntimeConfig): WeaverseNextRuntime;
200
393
  declare function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime): boolean;
@@ -321,4 +514,4 @@ interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptio
321
514
  */
322
515
  declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
323
516
 
324
- export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
517
+ export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, ThemeTextProvider, type ThemeTextProviderProps, type ThemeTextValue, type TranslateFunction, TranslationProvider, type TranslationProviderProps, TranslationStore, type TranslationValue, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextPageData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, WeaverseNextTranslationChanges, WeaverseNextTranslationMap, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createTranslate, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, getNestedKey, interpolate, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useThemeText, useTranslation, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Weaverse } from '@weaverse/react';
2
2
  export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  export { InspectorGroup, PageType, SchemaType, createSchema } from '@weaverse/schema';
4
- import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, v as WeaverseNextRequestContext, s as WeaverseNextLoaderData, w as WeaverseNextRequestInfo, j as WeaverseNextComponentData, G as WeaverseNextThemeSettingsStore, y as WeaverseNextRuntimeInternal, x as WeaverseNextRuntimeConfig } from './seo-kwaliD-K.js';
5
- export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageData, z as WeaverseNextSeoMetadata, D as WeaverseNextStorefront, H as WeaverseProduct, I as formatWeaverseNextSeoMetadata, J as getWeaverseNextSeoMetadata } from './seo-kwaliD-K.js';
4
+ import { h as WeaverseNextClientConfig, g as WeaverseNextClient, i as WeaverseNextCommerceContext, x as WeaverseNextRequestContext, t as WeaverseNextLoaderData, a as TranslationStore, y as WeaverseNextRequestInfo, k as WeaverseNextComponentData, I as WeaverseNextThemeSettingsStore, A as WeaverseNextRuntimeInternal, M as WeaverseNextTranslationMap, z as WeaverseNextRuntimeConfig, J as WeaverseNextTranslationChanges, v as WeaverseNextPageData } from './seo-CpN6tC36.js';
5
+ export { T as ThemeTextStore, W as WeaverseArticle, b as WeaverseBlog, c as WeaverseCollection, d as WeaverseMetaObject, j as WeaverseNextComponent, l as WeaverseNextComponentLoaderArgs, m as WeaverseNextComponentProps, o as WeaverseNextCustomPageEntry, p as WeaverseNextFetchCustomPagesOptions, r as WeaverseNextI18n, s as WeaverseNextLoadPageInput, u as WeaverseNextPageAssignment, B as WeaverseNextSeoMetadata, F as WeaverseNextStorefront, K as WeaverseNextTranslationEntry, L as WeaverseNextTranslationItemEntry, N as WeaverseNextTranslationMapEntry, O as WeaverseProduct, P as formatWeaverseNextSeoMetadata, Q as getWeaverseNextSeoMetadata } from './seo-CpN6tC36.js';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import * as react from 'react';
8
8
  import { ReactNode } from 'react';
@@ -61,15 +61,157 @@ interface RunComponentLoadersArgs {
61
61
  */
62
62
  declare function runWeaverseComponentLoaders(args: RunComponentLoadersArgs): Promise<WeaverseNextLoaderData | null>;
63
63
 
64
+ /**
65
+ * Traverse a nested object by dot-path.
66
+ *
67
+ * @example
68
+ * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'
69
+ * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'
70
+ */
71
+ declare function getNestedKey(obj: Record<string, unknown>, path: string, fallback?: string): string | undefined;
72
+ /**
73
+ * Replace `{{variable}}` patterns in a string with provided values.
74
+ *
75
+ * @example
76
+ * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'
77
+ * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'
78
+ */
79
+ declare function interpolate(template: string, variables?: Record<string, string | number>): string;
80
+ /**
81
+ * Signature for a translation function.
82
+ */
83
+ type TranslateFunction = (key: string, variables?: Record<string, string | number>) => string;
84
+ interface TranslationValue {
85
+ /** Active-locale translated keys loaded from the storefront API. */
86
+ merchantOverrides: Record<string, unknown> | null;
87
+ /**
88
+ * Translate a key with optional variable interpolation.
89
+ *
90
+ * Priority chain (highest wins):
91
+ * 1. External `t` (passed into `WeaverseNextRootProvider` / `TranslationProvider`)
92
+ * 2. Design overrides (live Builder edits from `TranslationStore`)
93
+ * 3. `merchantOverrides` (DB/API overrides for the current locale)
94
+ * 4. `staticContent` (theme default JSON)
95
+ * 5. The key itself (fallback)
96
+ *
97
+ * @example
98
+ * t('cart.title') // => "Cart"
99
+ * t('badge.sale', { percentage: 15 }) // => "-15% Off"
100
+ */
101
+ t: TranslateFunction;
102
+ /**
103
+ * @deprecated Use {@link TranslationValue.translationStore} instead. Kept as a
104
+ * backward-compatible alias pointing at the same store instance.
105
+ */
106
+ themeTextStore: TranslationStore | null;
107
+ /** Exposed so the runtime/Studio bridge can attach it to `internal`. */
108
+ translationStore: TranslationStore | null;
109
+ }
110
+ interface TranslationProviderProps {
111
+ children: ReactNode;
112
+ merchantOverrides?: Record<string, unknown>;
113
+ staticContent: Record<string, unknown>;
114
+ /**
115
+ * Optional external translation function.
116
+ * When provided it becomes the **highest-priority** source:
117
+ * if it returns a non-empty string that differs from the raw key,
118
+ * that value is used; otherwise the internal resolution chain continues.
119
+ */
120
+ t?: TranslateFunction;
121
+ /**
122
+ * @deprecated Use {@link TranslationProviderProps.translationStore} instead.
123
+ * Still accepted for backward compatibility; ignored when `translationStore`
124
+ * is also provided.
125
+ */
126
+ themeTextStore?: TranslationStore | null;
127
+ /** Optional store for live design-mode text overrides from the builder. */
128
+ translationStore?: TranslationStore | null;
129
+ }
130
+ /**
131
+ * Build the `t()` translation function over a fixed set of sources.
132
+ *
133
+ * Resolution order, highest priority first:
134
+ * 1. `externalT` – host i18n (e.g. Shopify), unless it echoes the key
135
+ * 2. `designOverrides` – live design-mode edits, flat dot-path keys
136
+ * 3. `merchantOverrides` – locale overrides from the API, nested
137
+ * 4. `staticContent` – the theme's default locale JSON
138
+ * 5. the key itself
139
+ *
140
+ * Design overrides are looked up per-key (own properties only) rather than
141
+ * merged into `merchantOverrides`: a flat key like `cart.title` must override
142
+ * exactly that leaf without wiping sibling keys (`cart.subtitle`), and a
143
+ * per-key own-property lookup never builds nested objects from
144
+ * merchant-controlled keys, so it cannot pollute `Object.prototype`.
145
+ */
146
+ declare function createTranslate(sources: {
147
+ staticContent: Record<string, unknown>;
148
+ merchantOverrides?: Record<string, unknown>;
149
+ designOverrides?: Record<string, string>;
150
+ externalT?: TranslateFunction;
151
+ }): TranslateFunction;
152
+ /**
153
+ * Provider that wraps the app to expose the `t()` function.
154
+ *
155
+ * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)
156
+ * - `merchantOverrides` – locale-specific overrides fetched from the API
157
+ * - `translationStore` – optional store for live design-mode text overrides
158
+ * (the deprecated `themeTextStore` prop is accepted as a fallback)
159
+ */
160
+ declare function TranslationProvider({ staticContent, merchantOverrides, t: externalT, translationStore, themeTextStore, children, }: TranslationProviderProps): react_jsx_runtime.JSX.Element;
161
+ /**
162
+ * Hook to access the translation `t()` function.
163
+ *
164
+ * Must be used inside a component wrapped by `WeaverseNextRootProvider` or
165
+ * `TranslationProvider`.
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * function CartTitle() {
170
+ * let { t } = useTranslation()
171
+ * return <h2>{t('cart.title')}</h2>
172
+ * }
173
+ * ```
174
+ */
175
+ declare function useTranslation(): TranslationValue;
176
+ /**
177
+ * @deprecated Use {@link TranslationProvider} instead.
178
+ */
179
+ declare const ThemeTextProvider: typeof TranslationProvider;
180
+ /**
181
+ * @deprecated Use {@link useTranslation} instead.
182
+ */
183
+ declare const useThemeText: typeof useTranslation;
184
+ /**
185
+ * @deprecated Use {@link TranslationValue} instead.
186
+ */
187
+ type ThemeTextValue = TranslationValue;
188
+ /**
189
+ * @deprecated Use {@link TranslationProviderProps} instead.
190
+ */
191
+ type ThemeTextProviderProps = TranslationProviderProps;
192
+
64
193
  interface WeaverseNextProviderProps {
65
194
  children: ReactNode;
66
195
  client?: WeaverseNextClient;
67
196
  /** App-provided commerce context (storefront/cart/customer). */
68
197
  commerce?: WeaverseNextCommerceContext;
198
+ /**
199
+ * Active-locale static-text overrides (nested, from `loadThemeSettings()`).
200
+ * Adopts the root provider's `merchantOverrides` when omitted.
201
+ */
202
+ merchantOverrides?: Record<string, unknown>;
69
203
  /** Explicit page/route commerce data (replaces section-level `useLoaderData`). */
70
204
  pageData?: unknown;
71
205
  /** Explicit root/global data (replaces `useRouteLoaderData('root')`). */
72
206
  rootData?: unknown;
207
+ /**
208
+ * Theme default locale JSON (`loadThemeSettings().staticContent`). Adopts the
209
+ * root provider's `staticContent` when omitted, then falls back to
210
+ * `client.themeSchema.i18n.staticContent`.
211
+ */
212
+ staticContent?: Record<string, unknown>;
213
+ /** Optional external translation function (host i18n); highest priority in `t()`. */
214
+ t?: TranslateFunction;
73
215
  /** Theme settings override; falls back to `client.themeSettings`. */
74
216
  themeSettings?: Record<string, unknown>;
75
217
  }
@@ -144,13 +286,28 @@ interface RevalidateItemRuntimeLike {
144
286
  declare function revalidateWeaverseNextItem(runtime: RevalidateItemRuntimeLike, draftItem: WeaverseNextComponentData, endpoint?: string): Promise<void>;
145
287
 
146
288
  interface WeaverseNextRootContextValue {
289
+ /** Active-locale static-text overrides shared with route-level providers. */
290
+ merchantOverrides?: Record<string, unknown>;
291
+ /** Theme default locale JSON shared with route-level providers. */
292
+ staticContent: Record<string, unknown>;
147
293
  themeSettingsStore: WeaverseNextThemeSettingsStore;
294
+ /** Single live design-mode static-text override store for the whole session. */
295
+ translationStore: TranslationStore;
148
296
  }
149
297
  interface WeaverseNextRootProviderProps {
150
298
  children: ReactNode;
151
299
  /** Root-loaded theme settings (published-mode fetch, no design-mode context). */
152
300
  initialThemeSettings?: Record<string, unknown>;
301
+ /** Active-locale static-text overrides from `loadThemeSettings().merchantOverrides`. */
302
+ merchantOverrides?: Record<string, unknown>;
153
303
  publicEnv?: Record<string, string | undefined>;
304
+ /**
305
+ * Theme default locale JSON (`loadThemeSettings().staticContent`). Falls back
306
+ * to `themeSchema.i18n.staticContent` when omitted.
307
+ */
308
+ staticContent?: Record<string, unknown>;
309
+ /** Optional external translation function (host i18n); highest priority in `t()`. */
310
+ t?: TranslateFunction;
154
311
  themeSchema?: unknown;
155
312
  }
156
313
  /**
@@ -187,14 +344,50 @@ declare class WeaverseNextRuntime extends Weaverse {
187
344
  isPreviewMode: boolean;
188
345
  isRevisionPreview: boolean;
189
346
  sectionType?: string;
190
- translationMap: Record<string, unknown>;
347
+ /**
348
+ * Translation map received from Builder in design mode, keyed by item ID.
349
+ * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to
350
+ * components, so translations render without mutating the base `_store`.
351
+ */
352
+ translationMap: WeaverseNextTranslationMap;
191
353
  translationLocale: string;
192
354
  translationLanguageId: string;
193
355
  constructor(config: WeaverseNextRuntimeConfig);
194
- extractTranslationSidecar: () => undefined;
195
- setTranslationSidecar: (map?: Record<string, unknown>, locale?: string, languageId?: string) => void;
196
- updateTranslation: () => undefined;
197
- getTranslationChanges: () => undefined;
356
+ /**
357
+ * Pull `translationMap` / `translationLocale` / `translationLanguageId` off
358
+ * the current page data (Builder attaches them in design mode). Unlike
359
+ * Hydrogen, this also clears the sidecar to defaults when the new page data
360
+ * carries none, so a reused runtime / project-data swap can't leave a stale
361
+ * map overlaying the fresh tree.
362
+ */
363
+ extractTranslationSidecar: () => void;
364
+ /**
365
+ * Replace the translation sidecar (Builder pushes this when translation data
366
+ * arrives or the active language changes) and refresh every item so their
367
+ * merged snapshots recompute.
368
+ */
369
+ setTranslationSidecar: (map?: WeaverseNextTranslationMap, locale?: string, languageId?: string) => void;
370
+ /**
371
+ * Update a single translatable field for one item. Assigns a new per-item
372
+ * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
373
+ * invalidates, then triggers only that item's subscribers.
374
+ */
375
+ updateTranslation: (itemId: string, key: string, originalValue: string, translatedValue: string) => void;
376
+ /**
377
+ * Collect translation changes for the save flow. Returns `undefined` unless
378
+ * both the locale and language ID are set and at least one entry exists;
379
+ * each entry key is namespaced as `data.<field>` to match Builder.
380
+ */
381
+ getTranslationChanges: () => WeaverseNextTranslationChanges | undefined;
382
+ /**
383
+ * Re-extract the translation sidecar whenever project data is replaced (route
384
+ * change / non-design reuse), before rebuilding item stores. Takes the
385
+ * renderable page shape (`rootId` resolved) that `getRenderablePage()` and
386
+ * the reuse branch pass in.
387
+ */
388
+ setProjectData: (data: WeaverseNextPageData & {
389
+ rootId: string;
390
+ }) => void;
198
391
  }
199
392
  declare function createWeaverseNextRuntime(config: WeaverseNextRuntimeConfig): WeaverseNextRuntime;
200
393
  declare function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime): boolean;
@@ -321,4 +514,4 @@ interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptio
321
514
  */
322
515
  declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
323
516
 
324
- export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
517
+ export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, ThemeTextProvider, type ThemeTextProviderProps, type ThemeTextValue, type TranslateFunction, TranslationProvider, type TranslationProviderProps, TranslationStore, type TranslationValue, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextPageData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, WeaverseNextTranslationChanges, WeaverseNextTranslationMap, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createTranslate, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, getNestedKey, interpolate, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useThemeText, useTranslation, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };