@kotao/storefront 0.2.4 → 0.2.6

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 (69) hide show
  1. package/README.md +50 -2
  2. package/dist/bridge-ZKbKqgFd.d.ts +239 -0
  3. package/dist/cart-documents-BLavRDiu.d.ts +89 -0
  4. package/dist/cart-documents.d.ts +1 -2
  5. package/dist/cart-documents.js +1 -1
  6. package/dist/{chunk-M7BPQ54D.js → chunk-2MRB6SMP.js} +4 -3
  7. package/dist/chunk-2MRB6SMP.js.map +1 -0
  8. package/dist/chunk-CKGI3Y7L.js +19 -0
  9. package/dist/chunk-CKGI3Y7L.js.map +1 -0
  10. package/dist/{chunk-4TEFGD42.js → chunk-EG34HLSX.js} +209 -162
  11. package/dist/chunk-EG34HLSX.js.map +1 -0
  12. package/dist/chunk-O6YZEY7X.js +1382 -0
  13. package/dist/chunk-O6YZEY7X.js.map +1 -0
  14. package/dist/{chunk-7MTCGXIG.js → chunk-R4N565GX.js} +8 -4
  15. package/dist/chunk-R4N565GX.js.map +1 -0
  16. package/dist/{chunk-XMTWFJCZ.js → chunk-RFM27BKZ.js} +31 -7
  17. package/dist/chunk-RFM27BKZ.js.map +1 -0
  18. package/dist/{chunk-MYDKIJRH.js → chunk-SVMYFYIA.js} +2 -2
  19. package/dist/{chunk-MYDKIJRH.js.map → chunk-SVMYFYIA.js.map} +1 -1
  20. package/dist/{chunk-H3D7BAOL.js → chunk-VOTBNOWH.js} +21 -3
  21. package/dist/chunk-VOTBNOWH.js.map +1 -0
  22. package/dist/{chunk-PXVDVUFX.js → chunk-W74FGUZH.js} +10 -3
  23. package/dist/chunk-W74FGUZH.js.map +1 -0
  24. package/dist/{chunk-2IWNUDSZ.js → chunk-WNXI3MPM.js} +2 -2
  25. package/dist/chunk-WNXI3MPM.js.map +1 -0
  26. package/dist/chunk-XXNCFWXT.js +2118 -0
  27. package/dist/chunk-XXNCFWXT.js.map +1 -0
  28. package/dist/{client-bsiNPHBi.d.ts → client-CwOPPpFF.d.ts} +11 -1
  29. package/dist/{createCartHandler-C4RrPwSG.d.ts → createCartHandler-7DdKB-GF.d.ts} +1 -1
  30. package/dist/custom-css-Bl7Ur3-H.d.ts +6 -0
  31. package/dist/editor.d.ts +57 -104
  32. package/dist/editor.js +270 -1
  33. package/dist/editor.js.map +1 -1
  34. package/dist/events-react.d.ts +1 -1
  35. package/dist/events-react.js +1 -1
  36. package/dist/events.d.ts +3 -3
  37. package/dist/events.js +1 -1
  38. package/dist/{fetch-M3Y-fQrW.d.ts → fetch-Bq_cc8_G.d.ts} +5 -0
  39. package/dist/hydrogen-Bu7k0kE4.d.ts +259 -0
  40. package/dist/index.d.ts +74 -51
  41. package/dist/index.js +19 -15
  42. package/dist/index.js.map +1 -1
  43. package/dist/react-router.d.ts +30 -9
  44. package/dist/react-router.js +16 -7
  45. package/dist/react-router.js.map +1 -1
  46. package/dist/react.d.ts +79 -11
  47. package/dist/react.js +279 -10
  48. package/dist/react.js.map +1 -1
  49. package/dist/{routing-sEonP93J.d.ts → routing-Bz3Cg0BW.d.ts} +36 -6
  50. package/dist/seo.d.ts +7 -4
  51. package/dist/seo.js +2 -2
  52. package/dist/settings.d.ts +14 -4
  53. package/dist/settings.js +2 -2
  54. package/dist/{shop-BJSvtmnV.d.ts → shop-CnrnSAJw.d.ts} +33 -6
  55. package/dist/{store-CtCWHI8H.d.ts → store-DO08fzJi.d.ts} +1 -1
  56. package/dist/storefront-api-types.d.ts +12 -0
  57. package/dist/{types-BDhHWZsP.d.ts → types-BkY0yET-.d.ts} +3 -3
  58. package/dist/{types-bcbQzx87.d.ts → types-DZX8ScsJ.d.ts} +2 -0
  59. package/package.json +4 -4
  60. package/dist/cart-documents-CwwRTvm8.d.ts +0 -21
  61. package/dist/chunk-2IWNUDSZ.js.map +0 -1
  62. package/dist/chunk-4TEFGD42.js.map +0 -1
  63. package/dist/chunk-7MTCGXIG.js.map +0 -1
  64. package/dist/chunk-H3D7BAOL.js.map +0 -1
  65. package/dist/chunk-M7BPQ54D.js.map +0 -1
  66. package/dist/chunk-PXVDVUFX.js.map +0 -1
  67. package/dist/chunk-PXZ737N3.js +0 -439
  68. package/dist/chunk-PXZ737N3.js.map +0 -1
  69. package/dist/chunk-XMTWFJCZ.js.map +0 -1
@@ -0,0 +1,259 @@
1
+ import { HydrogenEditorManifest, HydrogenDocument, HydrogenBreakpoint, HydrogenComponentDefinition, HydrogenInstance, HydrogenEditCapability, HydrogenSourceLocation, HydrogenUnsupportedFinding, HydrogenContentBinding, HydrogenInstanceStyles } from '@kotao/storefront-contracts';
2
+ import { S as StorefrontEditorMessageSource, a as StorefrontEditorMessageTarget } from './bridge-ZKbKqgFd.js';
3
+
4
+ declare const HYDROGEN_EDITOR_PROTOCOL_VERSION: 1;
5
+ declare const HYDROGEN_EDITOR_BRIDGE_LIMITS: {
6
+ readonly maxMessageBytes: 131072;
7
+ readonly maxMessageDepth: 32;
8
+ readonly maxBufferedMessages: 100;
9
+ readonly maxDraftOperations: 1000;
10
+ readonly maxProcessedMessages: 2048;
11
+ };
12
+ type HydrogenEditorReconciliationReason = 'route' | 'loader' | 'suspense' | 'hmr';
13
+ type HydrogenEditorOperationFailureCode = 'CAPABILITY_DENIED' | 'COMPONENT_NOT_FOUND' | 'DOCUMENT_MISMATCH' | 'DUPLICATE_OPERATION_CONFLICT' | 'INSTANCE_NOT_FOUND' | 'INVALID_OPERATION' | 'OPERATION_LIMIT_EXCEEDED' | 'REVISION_MISMATCH' | 'SLOT_CONSTRAINT' | 'UNSUPPORTED_BOUNDARY';
14
+ type HydrogenEditorProtocolFailureCode = 'AUTH_CONTEXT_MISMATCH' | 'BUFFER_LIMIT_EXCEEDED' | 'DUPLICATE_MESSAGE_CONFLICT' | 'MESSAGE_EXPIRED' | 'MESSAGE_TOO_DEEP' | 'MESSAGE_TOO_LARGE' | 'SEQUENCE_STALE' | 'UNKNOWN_MESSAGE' | 'UNSUPPORTED_PROTOCOL';
15
+ interface HydrogenEditorSecurityContext {
16
+ readonly sessionId: string;
17
+ readonly baseSha: string;
18
+ readonly manifestHash: string;
19
+ readonly channelNonce: string;
20
+ /**
21
+ * A short-lived, audience-bound token minted by the trusted Web module. The bridge compares the
22
+ * exact opaque token and expiry; it never parses claims or accepts a token from a message as
23
+ * authority.
24
+ */
25
+ readonly previewToken: string;
26
+ readonly expiresAt: number;
27
+ }
28
+ interface HydrogenEditorOperationBase {
29
+ readonly operationId: string;
30
+ readonly revision: number;
31
+ }
32
+ type HydrogenEditorPreviewOperation = (HydrogenEditorOperationBase & {
33
+ readonly type: 'prop.patch';
34
+ readonly instanceId: string;
35
+ readonly propName: string;
36
+ readonly binding: HydrogenContentBinding;
37
+ }) | (HydrogenEditorOperationBase & {
38
+ readonly type: 'styles.patch';
39
+ readonly instanceId: string;
40
+ readonly styles: HydrogenInstanceStyles;
41
+ }) | (HydrogenEditorOperationBase & {
42
+ readonly type: 'variant.set';
43
+ readonly instanceId: string;
44
+ readonly variantId: string | null;
45
+ }) | (HydrogenEditorOperationBase & {
46
+ readonly type: 'slot.insert';
47
+ readonly parentInstanceId: string;
48
+ readonly slotId: string;
49
+ readonly index: number;
50
+ readonly instance: Omit<HydrogenInstance, 'parent'>;
51
+ }) | (HydrogenEditorOperationBase & {
52
+ readonly type: 'instance.move';
53
+ readonly instanceId: string;
54
+ readonly parentInstanceId: string;
55
+ readonly slotId: string;
56
+ readonly index: number;
57
+ }) | (HydrogenEditorOperationBase & {
58
+ readonly type: 'instance.remove';
59
+ readonly instanceId: string;
60
+ });
61
+ type HydrogenEditorCanvasIntent = {
62
+ readonly type: 'instance.move';
63
+ readonly instanceId: string;
64
+ readonly parentInstanceId: string;
65
+ readonly slotId: string;
66
+ readonly index: number;
67
+ } | {
68
+ readonly type: 'prop.inline';
69
+ readonly instanceId: string;
70
+ readonly propName: string;
71
+ readonly value: string;
72
+ } | {
73
+ readonly type: 'styles.adjust';
74
+ readonly instanceId: string;
75
+ readonly controlId: string;
76
+ readonly value: number;
77
+ readonly breakpointId?: string;
78
+ } | {
79
+ readonly type: 'slot.insert.request';
80
+ readonly parentInstanceId: string;
81
+ readonly slotId: string;
82
+ readonly index: number;
83
+ };
84
+ interface HydrogenEditorOperationFailure {
85
+ readonly code: HydrogenEditorOperationFailureCode;
86
+ readonly message: string;
87
+ readonly instanceId?: string;
88
+ readonly capability?: HydrogenEditCapability;
89
+ readonly source?: HydrogenSourceLocation;
90
+ }
91
+ type HydrogenEditorApplyResult = {
92
+ readonly status: 'applied' | 'duplicate';
93
+ readonly revision: number;
94
+ readonly operationId: string;
95
+ } | {
96
+ readonly status: 'rejected';
97
+ readonly revision: number;
98
+ readonly operationId: string;
99
+ readonly failure: HydrogenEditorOperationFailure;
100
+ };
101
+ type HydrogenEditorCanvasDispatchResult = {
102
+ readonly status: 'operation';
103
+ readonly intent: Exclude<HydrogenEditorCanvasIntent, {
104
+ readonly type: 'slot.insert.request';
105
+ }>;
106
+ readonly operation: HydrogenEditorPreviewOperation;
107
+ readonly result: HydrogenEditorApplyResult;
108
+ } | {
109
+ readonly status: 'insert-requested';
110
+ readonly intent: Extract<HydrogenEditorCanvasIntent, {
111
+ readonly type: 'slot.insert.request';
112
+ }>;
113
+ readonly revision: number;
114
+ } | {
115
+ readonly status: 'rejected';
116
+ readonly failure: HydrogenEditorOperationFailure;
117
+ readonly revision: number;
118
+ };
119
+ interface HydrogenEditorCapabilityReason {
120
+ readonly code: string;
121
+ readonly severity: 'warning' | 'blocking';
122
+ readonly message: string;
123
+ readonly capability?: HydrogenEditCapability;
124
+ readonly source?: HydrogenSourceLocation;
125
+ }
126
+ interface HydrogenEditorInstanceSnapshot {
127
+ readonly instance: HydrogenInstance;
128
+ readonly component: HydrogenComponentDefinition;
129
+ readonly childInstanceIds: Readonly<Record<string, readonly string[]>>;
130
+ readonly resolvedProps: Readonly<Record<string, unknown>>;
131
+ readonly mounted: boolean;
132
+ readonly editable: boolean;
133
+ readonly capabilityReasons: readonly HydrogenEditorCapabilityReason[];
134
+ }
135
+ interface HydrogenEditorPreviewSnapshot {
136
+ readonly document: HydrogenDocument;
137
+ readonly route?: string;
138
+ readonly revision: number;
139
+ readonly selectedInstanceId: string | null;
140
+ readonly hoveredInstanceId: string | null;
141
+ readonly selectionStatus: 'active' | 'out-of-route' | 'none';
142
+ readonly instanceIds: readonly string[];
143
+ readonly mountedInstanceIds: readonly string[];
144
+ }
145
+ interface HydrogenEditorReadyInstance {
146
+ readonly instance: HydrogenInstance;
147
+ readonly mounted: boolean;
148
+ readonly editable: boolean;
149
+ readonly capabilityReasons: readonly HydrogenEditorCapabilityReason[];
150
+ }
151
+ interface HydrogenEditorReadyDocument {
152
+ readonly protocolVersion: typeof HYDROGEN_EDITOR_PROTOCOL_VERSION;
153
+ readonly document: HydrogenDocument;
154
+ readonly breakpoints: readonly HydrogenBreakpoint[];
155
+ readonly route?: string;
156
+ readonly revision: number;
157
+ readonly selectedInstanceId: string | null;
158
+ readonly hoveredInstanceId: string | null;
159
+ readonly selectionStatus: HydrogenEditorPreviewSnapshot['selectionStatus'];
160
+ readonly components: readonly HydrogenComponentDefinition[];
161
+ readonly instances: readonly HydrogenEditorReadyInstance[];
162
+ readonly unsupportedFindings: readonly HydrogenUnsupportedFinding[];
163
+ }
164
+ interface HydrogenEditorReconciliation {
165
+ readonly reason: HydrogenEditorReconciliationReason;
166
+ readonly documentId: string;
167
+ readonly route?: string;
168
+ readonly revision: number;
169
+ readonly selectedInstanceId: string | null;
170
+ readonly selectionStatus: HydrogenEditorPreviewSnapshot['selectionStatus'];
171
+ readonly mountedInstanceIds: readonly string[];
172
+ }
173
+ interface HydrogenEditorProtocolFailure {
174
+ readonly code: HydrogenEditorProtocolFailureCode;
175
+ readonly message: string;
176
+ }
177
+ interface HydrogenEditorPreviewStore {
178
+ getSnapshot(): HydrogenEditorPreviewSnapshot;
179
+ getInstanceSnapshot(instanceId: string): HydrogenEditorInstanceSnapshot | null;
180
+ subscribe(listener: () => void): () => void;
181
+ subscribeInstance(instanceId: string, listener: () => void): () => void;
182
+ }
183
+ interface HydrogenEditorPreviewRuntime {
184
+ readonly manifest: HydrogenEditorManifest;
185
+ readonly store: HydrogenEditorPreviewStore;
186
+ ready(): void;
187
+ reconcile(documentId: string, reason: HydrogenEditorReconciliationReason, route?: string): void;
188
+ registerInstance(instanceId: string): () => void;
189
+ hoverInstance(instanceId: string | null): void;
190
+ selectInstance(instanceId: string | null): void;
191
+ dispatchCanvasIntent(intent: unknown): HydrogenEditorCanvasDispatchResult;
192
+ dispose(): void;
193
+ }
194
+ interface CreateHydrogenEditorPreviewRuntimeArgs {
195
+ readonly adminOrigin: string;
196
+ readonly security: HydrogenEditorSecurityContext;
197
+ readonly manifest: HydrogenEditorManifest;
198
+ readonly documentId: string;
199
+ readonly route?: string;
200
+ readonly transport: StorefrontEditorMessageSource;
201
+ readonly target: StorefrontEditorMessageTarget;
202
+ readonly now?: () => number;
203
+ readonly onProtocolFailure?: (failure: HydrogenEditorProtocolFailure) => void;
204
+ }
205
+ interface CreateHydrogenEditorSourceProjectionArgs {
206
+ readonly manifest: HydrogenEditorManifest;
207
+ readonly documentId: string;
208
+ readonly route?: string;
209
+ readonly revision?: number;
210
+ readonly selectedInstanceId?: string | null;
211
+ }
212
+ interface HydrogenEditorHostBridge {
213
+ requestReady(): void;
214
+ hoverInstance(instanceId: string | null): void;
215
+ selectInstance(instanceId: string | null): void;
216
+ applyOperation(operation: HydrogenEditorPreviewOperation): void;
217
+ dispose(): void;
218
+ }
219
+ interface CreateHydrogenEditorHostBridgeArgs {
220
+ readonly previewOrigin: string;
221
+ readonly security: HydrogenEditorSecurityContext;
222
+ readonly manifest: HydrogenEditorManifest;
223
+ readonly transport: StorefrontEditorMessageSource;
224
+ readonly target: StorefrontEditorMessageTarget;
225
+ readonly resolveTarget?: () => StorefrontEditorMessageTarget | null;
226
+ readonly now?: () => number;
227
+ readonly onReady?: (ready: HydrogenEditorReadyDocument) => void;
228
+ readonly onSelectInstance?: (instanceId: string | null) => void;
229
+ readonly onHoverInstance?: (instanceId: string | null) => void;
230
+ readonly onOperationResult?: (result: HydrogenEditorApplyResult) => void;
231
+ readonly onCanvasOperation?: (intent: Exclude<HydrogenEditorCanvasIntent, {
232
+ readonly type: 'slot.insert.request';
233
+ }>, operation: HydrogenEditorPreviewOperation, result: HydrogenEditorApplyResult) => void;
234
+ readonly onCanvasInsertRequest?: (request: Extract<HydrogenEditorCanvasIntent, {
235
+ readonly type: 'slot.insert.request';
236
+ }>) => void;
237
+ readonly onReconcile?: (reconciliation: HydrogenEditorReconciliation) => void;
238
+ readonly onProtocolFailure?: (failure: HydrogenEditorProtocolFailure) => void;
239
+ }
240
+ declare class HydrogenEditorConfigurationError extends Error {
241
+ constructor(message: string);
242
+ }
243
+ declare function parseHydrogenEditorCanvasIntent(value: unknown): HydrogenEditorCanvasIntent | null;
244
+ /**
245
+ * Produces the bounded editor document that can be shown before a secured preview runtime
246
+ * connects. Source extraction establishes editability, but every instance remains unmounted until
247
+ * the authenticated ADR-0047 bridge reports the live DOM boundary.
248
+ */
249
+ declare function createHydrogenEditorSourceProjection({ manifest, documentId, route, revision, selectedInstanceId, }: CreateHydrogenEditorSourceProjectionArgs): HydrogenEditorReadyDocument;
250
+ declare function createHydrogenEditorPreviewRuntime({ adminOrigin, documentId, manifest, now, onProtocolFailure, route, security, target, transport, }: CreateHydrogenEditorPreviewRuntimeArgs): HydrogenEditorPreviewRuntime;
251
+ declare function createHydrogenEditorHostBridge({ manifest, now, onCanvasInsertRequest, onCanvasOperation, onHoverInstance, onOperationResult, onProtocolFailure, onReady, onReconcile, onSelectInstance, previewOrigin, resolveTarget, security, target, transport, }: CreateHydrogenEditorHostBridgeArgs): HydrogenEditorHostBridge;
252
+ /**
253
+ * Resolves manifest-authorized style controls to CSS properties. The largest matching breakpoint
254
+ * wins. Values that cannot be represented as a CSS string/number remain visible in editor state
255
+ * but are not applied to the rendered element.
256
+ */
257
+ declare function resolveHydrogenEditorStyles(manifest: HydrogenEditorManifest, instance: HydrogenInstance, viewportWidth?: number): Readonly<Record<string, string | number>>;
258
+
259
+ export { createHydrogenEditorSourceProjection as A, parseHydrogenEditorCanvasIntent as B, type CreateHydrogenEditorPreviewRuntimeArgs as C, resolveHydrogenEditorStyles as D, type HydrogenEditorSecurityContext as H, type HydrogenEditorPreviewRuntime as a, type CreateHydrogenEditorHostBridgeArgs as b, type CreateHydrogenEditorSourceProjectionArgs as c, HYDROGEN_EDITOR_BRIDGE_LIMITS as d, HYDROGEN_EDITOR_PROTOCOL_VERSION as e, type HydrogenEditorApplyResult as f, type HydrogenEditorCanvasDispatchResult as g, type HydrogenEditorCanvasIntent as h, type HydrogenEditorCapabilityReason as i, HydrogenEditorConfigurationError as j, type HydrogenEditorHostBridge as k, type HydrogenEditorInstanceSnapshot as l, type HydrogenEditorOperationBase as m, type HydrogenEditorOperationFailure as n, type HydrogenEditorOperationFailureCode as o, type HydrogenEditorPreviewOperation as p, type HydrogenEditorPreviewSnapshot as q, type HydrogenEditorPreviewStore as r, type HydrogenEditorProtocolFailure as s, type HydrogenEditorProtocolFailureCode as t, type HydrogenEditorReadyDocument as u, type HydrogenEditorReadyInstance as v, type HydrogenEditorReconciliation as w, type HydrogenEditorReconciliationReason as x, createHydrogenEditorHostBridge as y, createHydrogenEditorPreviewRuntime as z };
package/dist/index.d.ts CHANGED
@@ -1,27 +1,29 @@
1
1
  export { c as CacheCustom, d as CacheLong, e as CacheNone, f as CacheShort, C as CacheStrategy, H as HydrogenStorefrontClientOptions, K as KotaoCache, g as StaleIfErrorFallback, h as Storefront, a as StorefrontAuthHeader, i as StorefrontCache, b as StorefrontCacheInput, j as StorefrontCacheQueryOptions, k as StorefrontCacheRequest, S as StorefrontClient, l as StorefrontClientOptions, m as StorefrontClientResult, n as StorefrontDefaultCache, o as StorefrontQueryOptions, p as StorefrontQueryTimeoutError, q as StorefrontUpstreamError, r as createCache, s as createStorefrontClient, t as generateCacheControlHeader } from './client-D51WdvYR.js';
2
- import { C as Cart } from './types-bcbQzx87.js';
3
- export { k as CART_FORM_ACTIONS, b as CartAttribute, l as CartBuyerIdentity, c as CartBuyerIdentityInput, h as CartDeliveryAddress, j as CartFormAction, m as CartLine, a as CartLineInput, e as CartLineUpdateInput, f as CartMetafield, g as CartMetafieldIdentifier, d as CartMutationResult, i as CartSelectedDeliveryOption, n as CartUserError, o as HydrogenCart, p as HydrogenCartCreateInput, q as HydrogenCartMutationResult, H as HydrogenSession, r as HydrogenSessionData } from './types-bcbQzx87.js';
4
- import { c as ConsentBucket, C as ConsentState, B as BoundNonceProvider } from './shop-BJSvtmnV.js';
5
- export { d as ANALYTICS_EVENTS, b as AnalyticsBus, e as AnalyticsBusOptions, A as AnalyticsContext, a as AnalyticsEmitter, f as AnalyticsEventMap, h as AnalyticsEventName, i as AnalyticsGeo, j as CONSENT_BUCKETS, k as CONSENT_COOKIE, l as CartForm, m as CartFormProps, n as CartViewedPayload, o as CollectionViewedPayload, D as DENIED_CONSENT, E as EventHandler, G as GRANTED_CONSENT, p as GetShopAnalyticsOptions, P as PageViewedPayload, q as PixelEvent, r as PixelSend, s as PixelTransport, t as PixelTransportOptions, v as ProductAddedToCartPayload, w as ProductViewedPayload, x as SearchViewedPayload, S as ShopAnalytics, y as buildConsentCookie, z as createAnalyticsBus, F as createAnalyticsEmitter, H as createPixelTransport, I as getShopAnalytics, J as isGranted, K as mergeConsent, L as parseConsent, M as readConsentCookie, N as serializeConsent } from './shop-BJSvtmnV.js';
6
- import { a as CartDispatchAction } from './createCartHandler-C4RrPwSG.js';
7
- export { b as CartGetId, C as CartHandler, c as CartSetId, d as CreateCartHandlerOptions, H as HydrogenCartHandlerOptions, R as RequestCartHandlerOptions, e as cartGetIdDefault, f as cartSetIdDefault, g as createCartHandler } from './createCartHandler-C4RrPwSG.js';
8
- import { a as ThemeSettingsSnapshot, R as ResolvedSettings } from './store-CtCWHI8H.js';
9
- export { b as ResolvedBlock, c as ResolvedSection, T as ThemeSettingsStore, d as createThemeSettingsStore } from './store-CtCWHI8H.js';
10
- import { C as CustomerAccountClient } from './routing-sEonP93J.js';
11
- export { A as Address, c as AddressConnection, d as CustomerAccount, e as CustomerAccountError, f as CustomerAccountErrorCode, G as GEO_HEADER, g as GEO_SIGNATURE_HEADER, h as Geo, a as KotaoContext, K as KotaoEnv, b as KotaoSession, L as LocalizePathOptions, M as Money, O as Order, i as OrderConnection, j as OrderPageInfo, k as OrdersOptions, R as ROUTING_LOCALE_HEADER, l as ROUTING_ORIGINAL_PATHNAME_HEADER, m as RequestLoginCodeInput, n as RequestLoginCodeResult, S as StorefrontExecutionContext, o as StrippedLocalePath, V as VerifyLoginCodeInput, W as WithCache, p as createKotaoContext, q as createWithCache, r as isLocalePathSegment, t as localeFromAcceptLanguage, u as localeFromPathname, v as localeFromRequest, w as localizePath, x as originalPathnameFromRequest, y as signGeo, z as stripLocalePrefixFromPathname, s as stripLocalePrefixFromRequest, B as trustedShopOriginFromHeaders, D as verifyGeo } from './routing-sEonP93J.js';
2
+ import { C as Cart } from './types-DZX8ScsJ.js';
3
+ export { k as CART_FORM_ACTIONS, b as CartAttribute, l as CartBuyerIdentity, c as CartBuyerIdentityInput, h as CartDeliveryAddress, j as CartFormAction, m as CartLine, a as CartLineInput, e as CartLineUpdateInput, f as CartMetafield, g as CartMetafieldIdentifier, d as CartMutationResult, i as CartSelectedDeliveryOption, n as CartUserError, o as HydrogenCart, p as HydrogenCartCreateInput, q as HydrogenCartMutationResult, H as HydrogenSession, r as HydrogenSessionData } from './types-DZX8ScsJ.js';
4
+ import { c as ConsentBucket, C as ConsentState, B as BoundNonceProvider, A as AnalyticsContext } from './shop-CnrnSAJw.js';
5
+ export { d as ANALYTICS_EVENTS, b as AnalyticsBus, e as AnalyticsBusOptions, f as AnalyticsDeviceClass, a as AnalyticsEmitter, h as AnalyticsEventMap, i as AnalyticsEventName, j as AnalyticsGeo, k as CONSENT_BUCKETS, l as CONSENT_COOKIE, m as CartForm, n as CartFormProps, o as CartViewedPayload, p as CollectionViewedPayload, D as DENIED_CONSENT, E as EventHandler, G as GRANTED_CONSENT, q as GetShopAnalyticsOptions, P as PageViewedPayload, r as PixelEvent, s as PixelSend, t as PixelTransport, v as PixelTransportOptions, w as ProductAddedToCartPayload, x as ProductViewedPayload, y as SearchViewedPayload, S as ShopAnalytics, z as buildConsentCookie, F as createAnalyticsBus, H as createAnalyticsEmitter, I as createPixelTransport, J as getShopAnalytics, K as isGranted, L as mergeConsent, M as parseConsent, N as readConsentCookie, O as serializeConsent } from './shop-CnrnSAJw.js';
6
+ import { a as CartDispatchAction } from './createCartHandler-7DdKB-GF.js';
7
+ export { b as CartGetId, C as CartHandler, c as CartSetId, d as CreateCartHandlerOptions, H as HydrogenCartHandlerOptions, R as RequestCartHandlerOptions, e as cartGetIdDefault, f as cartSetIdDefault, g as createCartHandler } from './createCartHandler-7DdKB-GF.js';
8
+ import { c as ThemeSettingsSnapshot, R as ResolvedSettings } from './store-DO08fzJi.js';
9
+ export { b as ResolvedBlock, a as ResolvedSection, T as ThemeSettingsStore, d as createThemeSettingsStore } from './store-DO08fzJi.js';
10
+ import { C as CustomerAccountClient } from './routing-Bz3Cg0BW.js';
11
+ export { A as Address, c as AddressConnection, d as CustomerAccount, e as CustomerAccountError, f as CustomerAccountErrorCode, G as GEO_HEADER, g as GEO_SIGNATURE_HEADER, h as Geo, K as KotaoContext, a as KotaoEnv, b as KotaoSession, L as LocalizePathOptions, M as Money, O as Order, i as OrderConnection, j as OrderPageInfo, k as OrdersOptions, R as ROUTING_LOCALE_HEADER, l as ROUTING_ORIGINAL_PATHNAME_HEADER, m as RequestLoginCodeInput, n as RequestLoginCodeResult, S as StorefrontExecutionContext, o as StorefrontMarketContext, p as StrippedLocalePath, V as VerifyLoginCodeInput, W as WithCache, q as createKotaoContext, r as createWithCache, t as isLocalePathSegment, u as localeFromAcceptLanguage, v as localeFromPathname, w as localeFromRequest, x as localizePath, y as marketContextFromHeaders, z as originalPathnameFromRequest, B as signGeo, D as stripLocalePrefixFromPathname, s as stripLocalePrefixFromRequest, E as trustedShopOriginFromHeaders, F as verifyGeo } from './routing-Bz3Cg0BW.js';
12
+ export { AUTO_REDIRECT_LANGUAGE_HEADER, MARKET_ALTERNATE_LOCALES_HEADER, MARKET_CANONICAL_URL_HEADER, MARKET_DEFAULT_LOCALE_HEADER, MARKET_ID_HEADER, MARKET_PATH_PREFIX_HEADER, MARKET_ROOT_URLS_HEADER, MARKET_SETTINGS_ENVIRONMENT_HEADER, MARKET_THEME_ID_HEADER, autoRedirectEnabled } from '@kotao/storefront-contracts';
12
13
  export { ImageAttrs, ImageAttrsOptions, ImageCrop, ImageData, ImageFit, ImageFormat, ImageSrcSetOptions, ImageUrlOptions, buildImageAttrs, imageSrcSet, imageUrl } from './image.js';
13
14
  export { C as Connection, a as ConnectionEdge, F as FlattenableConnection, b as PageInfo, P as PaginationInfo, c as PaginationOptions, d as PaginationVariables, f as flattenConnection, g as getPaginationInfo, e as getPaginationVariables } from './pagination-DCrQk02Q.js';
14
15
  export { MappedProductOptions, ProductLike, ProductOptionDef, ProductOptionState, ProductOptionValueState, SelectedOption, SelectedOptionsMap, VariantLike, VariantSelectionLike, getAdjacentAndFirstAvailableVariants, getProductOptions, getSelectedProductOptions, getSelectedVariant, mapSelectedProductOptionToObject, useOptimisticVariant, useSelectedOptionInUrlParam } from './product.js';
15
- export { ResolveThemeSettingsArgs, mergeSection, mergeSettings, resolveThemeSettings } from './settings.js';
16
- export { F as FetchThemeSettingsOptions, S as StoredThemeSettings, f as fetchThemeSettings } from './fetch-M3Y-fQrW.js';
16
+ export { ResolveThemeSettingsArgs, mergeSection, mergeSettings, reconcileSyntheticSectionGroup, resolveThemeSettings } from './settings.js';
17
+ export { F as FetchThemeSettingsOptions, S as StoredThemeSettings, f as fetchThemeSettings } from './fetch-Bq_cc8_G.js';
17
18
  export { AddressInput, BreadcrumbItem, ChangeFreq, GeoInput, LocalBusinessInput, OfferInput, OrganizationInput, ProductJsonLdInput, RedirectLookup, RedirectOptions, RobotsOptions, SitemapEntry, SitemapIndexEntry, StorefrontRedirectOptions, URL_REDIRECT_QUERY, WebSiteInput, breadcrumbListJsonLd, buildRobotsTxt, buildSitemapIndexXml, buildSitemapXml, getSeoMeta, localBusinessJsonLd, organizationJsonLd, productJsonLd, resolveRedirect, resolveStorefrontRedirect, restaurantJsonLd, robotsResponse, serializeJsonLd, sitemapIndexResponse, sitemapResponse, storefrontRedirect, websiteJsonLd } from './seo.js';
18
- export { A as Alternate, J as JsonLd, O as OpenGraph, a as OpenGraphImage, S as SeoConfig, b as SeoDescriptor, T as TwitterCard } from './types-BDhHWZsP.js';
19
+ export { A as Alternate, J as JsonLd, O as OpenGraph, a as OpenGraphImage, S as SeoConfig, b as SeoDescriptor, T as TwitterCard } from './types-BkY0yET-.js';
19
20
  export { c as FormAnswer, a as FormAnswers, d as FormBlock, e as FormField, b as FormFieldErrors, f as FormLocalizedText, g as FormRenderState, h as FormSubmission, F as FormVersionSchema, i as FormVisibilityRule, P as PublicForm, j as PublicFormDefinition, k as PublicFormVersion } from './types-CSNXbGFW.js';
20
21
  export { ADDRESS_PROPERTIES, FORM_ANSWER_PREFIX, FormFetchOptions, RenderFormHtmlOptions, ShopifyContactCompatibility, ShopifyContactInput, StorefrontFormRequestError, SubmitFormInput, adaptShopifyContactForm, evaluateFormRule, formAnswerName, formFields, isFormFieldVisible, loadPublishedForm, parseFormAnswers, renderFormHtml, resolveFormText, submitPublishedForm } from './forms.js';
21
22
  export { EventCartPreparationError, eventCartToken, prepareEventCart } from './events.js';
22
- export { C as ClaimEventApprovalOffer, d as CreateEventApprovalRequest, e as CreateEventCheckoutSession, f as CreateEventWaitlistEntry, b as EventApprovalOfferResolution, g as EventApprovalRequestReceipt, a as EventCheckoutSession, h as EventFormAnswer, i as EventFormSubmissionInput, j as EventRegistrationMode, k as EventRegistrationResult, c as EventRegistrationSubmission, l as EventWaitlistReceipt, E as EventsClient, P as PublicEvent, m as PublicEventForm, n as PublicEventOccurrence, o as PublicEventTicketType, p as PublicEventVenue, S as StorefrontEventsRequestError, q as createEventsClient } from './client-bsiNPHBi.js';
23
+ export { C as ClaimEventApprovalOffer, d as CreateEventApprovalRequest, e as CreateEventCheckoutSession, f as CreateEventWaitlistEntry, b as EventApprovalOfferResolution, g as EventApprovalRequestReceipt, a as EventCheckoutSession, h as EventFormAnswer, i as EventFormSubmissionInput, j as EventRegistrationMode, k as EventRegistrationResult, c as EventRegistrationSubmission, l as EventWaitlistReceipt, E as EventsClient, P as PublicEvent, m as PublicEventForm, n as PublicEventOccurrence, o as PublicEventSummary, p as PublicEventTicketType, q as PublicEventVenue, S as StorefrontEventsRequestError, r as createEventsClient } from './client-CwOPPpFF.js';
23
24
  export { a as OfferTokenHistory, O as OfferTokenLocation, c as consumeOfferTokenFragment, o as offerTokenHrefMarker } from './offer-token-C-nk_nj8.js';
24
- export { CreateStorefrontEditorBridgeArgs, CreateStorefrontEditorHostBridgeArgs, StorefrontEditorBlockSchema, StorefrontEditorBridge, StorefrontEditorHostBridge, StorefrontEditorMessageEvent, StorefrontEditorMessageSource, StorefrontEditorMessageTarget, StorefrontEditorReady, StorefrontEditorSectionPreset, StorefrontEditorSectionPresetBlock, StorefrontEditorSectionSchema, StorefrontEditorSelection, StorefrontEditorSettingInput, StorefrontEditorSettingOption, createStorefrontEditorBridge, createStorefrontEditorHostBridge } from './editor.js';
25
+ export { C as CreateStorefrontEditorBridgeArgs, b as CreateStorefrontEditorHostBridgeArgs, c as StorefrontEditorAppExtensionPreview, d as StorefrontEditorBlockSchema, e as StorefrontEditorBridge, f as StorefrontEditorCanvasAction, g as StorefrontEditorCanvasBlockAction, h as StorefrontEditorCanvasPosition, i as StorefrontEditorCanvasSectionAction, j as StorefrontEditorDocument, k as StorefrontEditorHostBridge, l as StorefrontEditorMessageEvent, S as StorefrontEditorMessageSource, a as StorefrontEditorMessageTarget, m as StorefrontEditorReady, n as StorefrontEditorRect, o as StorefrontEditorSectionPreset, p as StorefrontEditorSectionPresetBlock, q as StorefrontEditorSectionSchema, r as StorefrontEditorSelection, s as StorefrontEditorSelectionScope, t as StorefrontEditorSettingInput, u as StorefrontEditorSettingOption, v as StorefrontEditorThemeStyle, x as createStorefrontEditorBridge, y as createStorefrontEditorHostBridge, z as positionStorefrontEditorCanvasToolbar } from './bridge-ZKbKqgFd.js';
26
+ export { S as STOREFRONT_SECTION_CUSTOM_CSS_SETTING, s as scopeStorefrontSectionCss } from './custom-css-Bl7Ur3-H.js';
25
27
  import './http-types-CGh8WGHB.js';
26
28
  import 'react';
27
29
  import './storefront-api-types.js';
@@ -66,41 +68,50 @@ interface CheckoutDesignTokens {
66
68
  readonly heading: string;
67
69
  };
68
70
  }
69
- declare const CHECKOUT_DESIGN_TOKEN_INPUTS: readonly [{
70
- readonly type: "url";
71
- readonly name: "checkoutLogoUrl";
72
- readonly label: "Checkout logo URL";
73
- }, {
74
- readonly type: "text";
75
- readonly name: "checkoutLogoAlt";
76
- readonly label: "Checkout logo alt text";
77
- readonly defaultValue: "";
78
- }, {
79
- readonly type: "color";
80
- readonly name: "checkoutColorAccent";
81
- readonly label: "Checkout accent color";
82
- readonly defaultValue: "#005bd3";
83
- }, {
84
- readonly type: "color";
85
- readonly name: "checkoutColorBackground";
86
- readonly label: "Checkout background color";
87
- readonly defaultValue: "#ffffff";
88
- }, {
89
- readonly type: "color";
90
- readonly name: "checkoutColorForeground";
91
- readonly label: "Checkout foreground color";
92
- readonly defaultValue: "#111827";
93
- }, {
94
- readonly type: "font";
95
- readonly name: "checkoutFontBody";
96
- readonly label: "Checkout body font";
97
- readonly defaultValue: "Inter";
98
- }, {
99
- readonly type: "font";
100
- readonly name: "checkoutFontHeading";
101
- readonly label: "Checkout heading font";
102
- readonly defaultValue: "Inter";
103
- }];
71
+ declare const CHECKOUT_DESIGN_TOKEN_INPUTS: ({
72
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
73
+ type: "url";
74
+ name: "checkoutLogoUrl";
75
+ label: "Logo URL";
76
+ group: "Account & checkout";
77
+ helpText: "Overrides the storefront logo on customer account and checkout pages.";
78
+ } | {
79
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
80
+ type: "text";
81
+ name: "checkoutLogoAlt";
82
+ label: "Logo alternative text";
83
+ group: "Account & checkout";
84
+ } | {
85
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
86
+ type: "color";
87
+ name: "checkoutColorAccent";
88
+ label: "Primary color";
89
+ group: "Account & checkout";
90
+ } | {
91
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
92
+ type: "color";
93
+ name: "checkoutColorBackground";
94
+ label: "Background color";
95
+ group: "Account & checkout";
96
+ } | {
97
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
98
+ type: "color";
99
+ name: "checkoutColorForeground";
100
+ label: "Text color";
101
+ group: "Account & checkout";
102
+ } | {
103
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
104
+ type: "font";
105
+ name: "checkoutFontBody";
106
+ label: "Body font";
107
+ group: "Account & checkout";
108
+ } | {
109
+ defaultValue?: "" | "#005bd3" | "#ffffff" | "#111827" | "Inter";
110
+ type: "font";
111
+ name: "checkoutFontHeading";
112
+ label: "Heading font";
113
+ group: "Account & checkout";
114
+ })[];
104
115
  declare function extractCheckoutDesignTokens(snapshot: Pick<ThemeSettingsSnapshot, 'global'>): CheckoutDesignTokens;
105
116
 
106
117
  interface ContentSecurityPolicyShop {
@@ -133,6 +144,18 @@ declare function buildLocalizationCookie(sel: {
133
144
 
134
145
  declare function handleLocalizationPost(request: Request): Promise<Response>;
135
146
 
147
+ interface AnalyticsAttributionEnvironment {
148
+ readonly referrer?: string;
149
+ readonly search?: string;
150
+ readonly matchMedia?: (query: string) => {
151
+ readonly matches: boolean;
152
+ };
153
+ }
154
+ type AttributionContext = Pick<AnalyticsContext, 'referrer' | 'utmSource' | 'utmMedium' | 'utmCampaign' | 'deviceClass'>;
155
+ /** Read static landing attribution plus the current responsive device class without retaining state
156
+ * or identifiers. All values stay optional so non-DOM/SSR emitters keep their existing payload. */
157
+ declare function collectAnalyticsAttribution(environment: AnalyticsAttributionEnvironment | null): AttributionContext;
158
+
136
159
  declare function encodeConsent(state: ConsentState): URLSearchParams;
137
160
  declare function decodeConsent(params: URLSearchParams): ConsentState;
138
161
  declare function appendConsentToCheckoutUrl(checkoutUrl: string, state: ConsentState): string;
@@ -243,4 +266,4 @@ interface HostedLocaleInput {
243
266
  */
244
267
  declare function resolveHostedLocale(input: HostedLocaleInput): string;
245
268
 
246
- export { CART_ID_COOKIE, CHECKOUT_CONSENT_CATEGORIES, CHECKOUT_CONSENT_PARAM_PREFIX, CHECKOUT_DESIGN_TOKEN_INPUTS, CUSTOMER_SESSION_COOKIE, Cart, CartDispatchAction, type CheckoutDesignTokens, ConsentBucket, ConsentState, type ContentSecurityPolicyResult, type ContentSecurityPolicyShop, type CreateContentSecurityPolicyOptions, CustomerAccountClient, type CustomerAccountClientOptions, DEFAULT_HOSTED_SESSION_MAX_AGE, DEFAULT_SESSION_MAX_AGE, HOSTED_CUSTOMER_CSRF_COOKIE, HOSTED_CUSTOMER_CSRF_HEADER, HOSTED_CUSTOMER_SESSION_COOKIE, type HostedLocaleInput, type HostedSessionCookieAttrs, LOCALIZATION_COOKIE, type LegacySessionReadOptions, MAX_HOSTED_SESSION_MAX_AGE, MAX_LEGACY_CUSTOMER_SESSION_TOKEN_LENGTH, type ResolveCheckoutUrlOptions, ResolvedSettings, type SessionCookieAttrs, ThemeSettingsSnapshot, appendConsentToCheckoutUrl, applyOptimisticCartAction, buildCartIdCookie, buildCustomerSessionCookie, buildHostedCustomerSessionCookie, buildLocalizationCookie, clearCustomerSessionCookie, clearHostedCustomerSessionCookie, clearLegacyCustomerSessionCookie, createContentSecurityPolicy, createCustomerAccountClient, decodeCheckoutConsent, decodeConsent, encodeCheckoutConsent, encodeConsent, escapeHostedHtml, extractCheckoutDesignTokens, handleLocalizationPost, readCartIdCookie, readCustomerSessionToken, readHostedCustomerCsrfToken, readHostedCustomerSessionToken, readLegacyCustomerSessionToken, readLocalizationCookie, resolveCheckoutUrl, resolveHostedBranding, resolveHostedLocale, sanitizeHostedCssValue, shopHostname, useOptimisticCart };
269
+ export { type AnalyticsAttributionEnvironment, AnalyticsContext, CART_ID_COOKIE, CHECKOUT_CONSENT_CATEGORIES, CHECKOUT_CONSENT_PARAM_PREFIX, CHECKOUT_DESIGN_TOKEN_INPUTS, CUSTOMER_SESSION_COOKIE, Cart, CartDispatchAction, type CheckoutDesignTokens, ConsentBucket, ConsentState, type ContentSecurityPolicyResult, type ContentSecurityPolicyShop, type CreateContentSecurityPolicyOptions, CustomerAccountClient, type CustomerAccountClientOptions, DEFAULT_HOSTED_SESSION_MAX_AGE, DEFAULT_SESSION_MAX_AGE, HOSTED_CUSTOMER_CSRF_COOKIE, HOSTED_CUSTOMER_CSRF_HEADER, HOSTED_CUSTOMER_SESSION_COOKIE, type HostedLocaleInput, type HostedSessionCookieAttrs, LOCALIZATION_COOKIE, type LegacySessionReadOptions, MAX_HOSTED_SESSION_MAX_AGE, MAX_LEGACY_CUSTOMER_SESSION_TOKEN_LENGTH, type ResolveCheckoutUrlOptions, ResolvedSettings, type SessionCookieAttrs, ThemeSettingsSnapshot, appendConsentToCheckoutUrl, applyOptimisticCartAction, buildCartIdCookie, buildCustomerSessionCookie, buildHostedCustomerSessionCookie, buildLocalizationCookie, clearCustomerSessionCookie, clearHostedCustomerSessionCookie, clearLegacyCustomerSessionCookie, collectAnalyticsAttribution, createContentSecurityPolicy, createCustomerAccountClient, decodeCheckoutConsent, decodeConsent, encodeCheckoutConsent, encodeConsent, escapeHostedHtml, extractCheckoutDesignTokens, handleLocalizationPost, readCartIdCookie, readCustomerSessionToken, readHostedCustomerCsrfToken, readHostedCustomerSessionToken, readLegacyCustomerSessionToken, readLocalizationCookie, resolveCheckoutUrl, resolveHostedBranding, resolveHostedLocale, sanitizeHostedCssValue, shopHostname, useOptimisticCart };
package/dist/index.js CHANGED
@@ -1,21 +1,24 @@
1
1
  export { getAdjacentAndFirstAvailableVariants, getProductOptions, getSelectedProductOptions, getSelectedVariant, mapSelectedProductOptionToObject, useOptimisticVariant, useSelectedOptionInUrlParam } from './chunk-QOEEUTHQ.js';
2
- import { createNonceProvider } from './chunk-XMTWFJCZ.js';
3
- export { CartForm, createAnalyticsBus, createAnalyticsEmitter, createPixelTransport } from './chunk-XMTWFJCZ.js';
2
+ import { createNonceProvider } from './chunk-RFM27BKZ.js';
3
+ export { CartForm, collectAnalyticsAttribution, createAnalyticsBus, createAnalyticsEmitter, createPixelTransport } from './chunk-RFM27BKZ.js';
4
4
  export { flattenConnection, getPaginationInfo, getPaginationVariables } from './chunk-5QOFKGKD.js';
5
- import { CHECKOUT_DESIGN_TOKEN_INPUTS, localizePath, buildLocalizationCookie, extractCheckoutDesignTokens, readLocalizationCookie } from './chunk-4TEFGD42.js';
6
- export { CART_ID_COOKIE, CHECKOUT_CONSENT_CATEGORIES, CHECKOUT_CONSENT_PARAM_PREFIX, CHECKOUT_DESIGN_TOKEN_INPUTS, CUSTOMER_SESSION_COOKIE, CacheCustom, CacheLong, CacheNone, CacheShort, CustomerAccountError, DEFAULT_HOSTED_SESSION_MAX_AGE, DEFAULT_SESSION_MAX_AGE, GEO_HEADER, GEO_SIGNATURE_HEADER, HOSTED_CUSTOMER_CSRF_COOKIE, HOSTED_CUSTOMER_CSRF_HEADER, HOSTED_CUSTOMER_SESSION_COOKIE, LOCALIZATION_COOKIE, MAX_HOSTED_SESSION_MAX_AGE, MAX_LEGACY_CUSTOMER_SESSION_TOKEN_LENGTH, ROUTING_LOCALE_HEADER, ROUTING_ORIGINAL_PATHNAME_HEADER, StorefrontDefaultCache, StorefrontQueryTimeoutError, StorefrontUpstreamError, buildCartIdCookie, buildCustomerSessionCookie, buildHostedCustomerSessionCookie, buildLocalizationCookie, cartGetIdDefault, cartSetIdDefault, clearCustomerSessionCookie, clearHostedCustomerSessionCookie, clearLegacyCustomerSessionCookie, createCache, createCartHandler, createCustomerAccountClient, createKotaoContext, createStorefrontClient, createWithCache, decodeCheckoutConsent, encodeCheckoutConsent, extractCheckoutDesignTokens, generateCacheControlHeader, isLocalePathSegment, localeFromAcceptLanguage, localeFromPathname, localeFromRequest, localizePath, originalPathnameFromRequest, readCartIdCookie, readCustomerSessionToken, readHostedCustomerCsrfToken, readHostedCustomerSessionToken, readLegacyCustomerSessionToken, readLocalizationCookie, resolveCheckoutUrl, shopHostname, signGeo, stripLocalePrefixFromPathname, stripLocalePrefixFromRequest, trustedShopOriginFromHeaders, verifyGeo } from './chunk-4TEFGD42.js';
5
+ import { CHECKOUT_DESIGN_TOKEN_INPUTS, localizePath, buildLocalizationCookie, extractCheckoutDesignTokens, readLocalizationCookie } from './chunk-EG34HLSX.js';
6
+ export { CART_ID_COOKIE, CHECKOUT_CONSENT_CATEGORIES, CHECKOUT_CONSENT_PARAM_PREFIX, CHECKOUT_DESIGN_TOKEN_INPUTS, CUSTOMER_SESSION_COOKIE, CacheCustom, CacheLong, CacheNone, CacheShort, CustomerAccountError, DEFAULT_HOSTED_SESSION_MAX_AGE, DEFAULT_SESSION_MAX_AGE, GEO_HEADER, GEO_SIGNATURE_HEADER, HOSTED_CUSTOMER_CSRF_COOKIE, HOSTED_CUSTOMER_CSRF_HEADER, HOSTED_CUSTOMER_SESSION_COOKIE, LOCALIZATION_COOKIE, MARKET_ALTERNATE_LOCALES_HEADER, MARKET_CANONICAL_URL_HEADER, MARKET_DEFAULT_LOCALE_HEADER, MARKET_ID_HEADER, MARKET_PATH_PREFIX_HEADER, MARKET_ROOT_URLS_HEADER, MARKET_SETTINGS_ENVIRONMENT_HEADER, MARKET_THEME_ID_HEADER, MAX_HOSTED_SESSION_MAX_AGE, MAX_LEGACY_CUSTOMER_SESSION_TOKEN_LENGTH, ROUTING_LOCALE_HEADER, ROUTING_ORIGINAL_PATHNAME_HEADER, StorefrontDefaultCache, StorefrontQueryTimeoutError, StorefrontUpstreamError, buildCartIdCookie, buildCustomerSessionCookie, buildHostedCustomerSessionCookie, buildLocalizationCookie, cartGetIdDefault, cartSetIdDefault, clearCustomerSessionCookie, clearHostedCustomerSessionCookie, clearLegacyCustomerSessionCookie, createCache, createCartHandler, createCustomerAccountClient, createKotaoContext, createStorefrontClient, createWithCache, decodeCheckoutConsent, encodeCheckoutConsent, extractCheckoutDesignTokens, generateCacheControlHeader, isLocalePathSegment, localeFromAcceptLanguage, localeFromPathname, localeFromRequest, localizePath, marketContextFromHeaders, originalPathnameFromRequest, readCartIdCookie, readCustomerSessionToken, readHostedCustomerCsrfToken, readHostedCustomerSessionToken, readLegacyCustomerSessionToken, readLocalizationCookie, resolveCheckoutUrl, shopHostname, signGeo, stripLocalePrefixFromPathname, stripLocalePrefixFromRequest, trustedShopOriginFromHeaders, verifyGeo } from './chunk-EG34HLSX.js';
7
7
  import { CART_FORM_ACTIONS, CONSENT_BUCKETS } from './chunk-OGWYTYYS.js';
8
8
  export { CART_FORM_ACTIONS, CONSENT_BUCKETS, CONSENT_COOKIE, DENIED_CONSENT, GRANTED_CONSENT, buildConsentCookie, isGranted, mergeConsent, parseConsent, readConsentCookie, serializeConsent } from './chunk-OGWYTYYS.js';
9
- export { URL_REDIRECT_QUERY, breadcrumbListJsonLd, buildRobotsTxt, buildSitemapIndexXml, buildSitemapXml, localBusinessJsonLd, organizationJsonLd, productJsonLd, resolveRedirect, resolveStorefrontRedirect, restaurantJsonLd, robotsResponse, sitemapIndexResponse, sitemapResponse, storefrontRedirect, websiteJsonLd } from './chunk-PXVDVUFX.js';
10
- export { getSeoMeta, serializeJsonLd } from './chunk-MYDKIJRH.js';
11
- export { createThemeSettingsStore, mergeSection, mergeSettings, resolveThemeSettings } from './chunk-H3D7BAOL.js';
12
- export { fetchThemeSettings } from './chunk-M7BPQ54D.js';
13
- export { createStorefrontEditorBridge, createStorefrontEditorHostBridge } from './chunk-PXZ737N3.js';
9
+ export { URL_REDIRECT_QUERY, breadcrumbListJsonLd, buildRobotsTxt, buildSitemapIndexXml, buildSitemapXml, localBusinessJsonLd, organizationJsonLd, productJsonLd, resolveRedirect, resolveStorefrontRedirect, restaurantJsonLd, robotsResponse, sitemapIndexResponse, sitemapResponse, storefrontRedirect, websiteJsonLd } from './chunk-W74FGUZH.js';
10
+ export { getSeoMeta, serializeJsonLd } from './chunk-SVMYFYIA.js';
11
+ export { createThemeSettingsStore, mergeSection, mergeSettings, reconcileSyntheticSectionGroup, resolveThemeSettings } from './chunk-VOTBNOWH.js';
12
+ export { fetchThemeSettings } from './chunk-2MRB6SMP.js';
13
+ export { STOREFRONT_SECTION_CUSTOM_CSS_SETTING, createStorefrontEditorBridge, createStorefrontEditorHostBridge, positionStorefrontEditorCanvasToolbar, scopeStorefrontSectionCss } from './chunk-O6YZEY7X.js';
14
+ import './chunk-CKGI3Y7L.js';
14
15
  export { EventCartPreparationError, eventCartToken, prepareEventCart } from './chunk-4OQYNUGM.js';
15
16
  export { consumeOfferTokenFragment, offerTokenHrefMarker } from './chunk-WG7HYVHJ.js';
16
- export { StorefrontEventsRequestError, createEventsClient } from './chunk-7MTCGXIG.js';
17
+ export { StorefrontEventsRequestError, createEventsClient } from './chunk-R4N565GX.js';
17
18
  export { ADDRESS_PROPERTIES, FORM_ANSWER_PREFIX, StorefrontFormRequestError, adaptShopifyContactForm, evaluateFormRule, formAnswerName, formFields, isFormFieldVisible, loadPublishedForm, parseFormAnswers, renderFormHtml, resolveFormText, submitPublishedForm } from './chunk-IIOHENCG.js';
18
19
  export { buildImageAttrs, imageSrcSet, imageUrl } from './chunk-3YQXJNR7.js';
20
+ import { MARKET_PATH_PREFIX_HEADER } from '@kotao/storefront-contracts';
21
+ export { AUTO_REDIRECT_LANGUAGE_HEADER, autoRedirectEnabled } from '@kotao/storefront-contracts';
19
22
 
20
23
  // src/cart/useOptimisticCart.ts
21
24
  var recalculate = (cart, lines) => ({
@@ -139,19 +142,20 @@ function normalizeSources(sources) {
139
142
  function uniqueSources(sources) {
140
143
  return Array.from(new Set(sources.filter((source) => source.length > 0)));
141
144
  }
142
-
143
- // src/localization/handler.ts
144
145
  function safeReturnTo(raw) {
145
146
  if (raw === null || raw === "") return { path: "/", safe: true };
146
147
  return /^\/(?![/\\])/.test(raw) ? { path: raw, safe: true } : { path: "/", safe: false };
147
148
  }
148
149
  async function handleLocalizationPost(request) {
149
150
  const form = await request.formData();
150
- const country = (form.get("country_code") ?? "").toString().trim().toUpperCase() || null;
151
- const locale = (form.get("locale_code") ?? "").toString().trim() || null;
151
+ const country = (form.getAll("country_code").at(-1) ?? "").toString().trim().toUpperCase() || null;
152
+ const locale = (form.getAll("locale_code").at(-1) ?? "").toString().trim() || null;
152
153
  const primaryLocale = (form.get("primary_locale") ?? "").toString().trim() || null;
153
154
  const returnTo = safeReturnTo((form.get("return_to") ?? "").toString());
154
- const location = returnTo.safe && primaryLocale !== null ? localizePath(returnTo.path, locale, { primaryLocale }) : returnTo.path;
155
+ const location = returnTo.safe && primaryLocale !== null ? localizePath(returnTo.path, locale, {
156
+ primaryLocale,
157
+ marketPathPrefix: request.headers.get(MARKET_PATH_PREFIX_HEADER)
158
+ }) : returnTo.path;
155
159
  return new Response(null, {
156
160
  status: 302,
157
161
  headers: { location, "set-cookie": buildLocalizationCookie({ country, locale }) }