@neowhale/storefront 0.2.28 → 0.2.30
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/{chunk-PXS2DPVL.js → chunk-MZO7BCGU.js} +8 -4
- package/dist/chunk-MZO7BCGU.js.map +1 -0
- package/dist/{chunk-7KXJLHGA.cjs → chunk-UW2U5BRY.cjs} +8 -4
- package/dist/chunk-UW2U5BRY.cjs.map +1 -0
- package/dist/{client-BWUWE_7m.d.cts → client-CwCSPAHp.d.cts} +1 -1
- package/dist/{client-BWUWE_7m.d.ts → client-CwCSPAHp.d.ts} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/next/index.d.cts +1 -1
- package/dist/next/index.d.ts +1 -1
- package/dist/{pixel-manager-CJaD49Xb.d.ts → pixel-manager-LiLpBmPy.d.ts} +1 -1
- package/dist/{pixel-manager-BRPU9JKk.d.cts → pixel-manager-ti1xc1eC.d.cts} +1 -1
- package/dist/react/index.cjs +91 -19
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +6 -4
- package/dist/react/index.d.ts +6 -4
- package/dist/react/index.js +90 -18
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-7KXJLHGA.cjs.map +0 -1
- package/dist/chunk-PXS2DPVL.js.map +0 -1
|
@@ -7,7 +7,9 @@ var EVENT_MAP = {
|
|
|
7
7
|
begin_checkout: "InitiateCheckout",
|
|
8
8
|
purchase: "Purchase",
|
|
9
9
|
search: "Search",
|
|
10
|
-
category_view: "ViewContent"
|
|
10
|
+
category_view: "ViewContent",
|
|
11
|
+
lead: "Lead",
|
|
12
|
+
cta_click: "ViewContent"
|
|
11
13
|
};
|
|
12
14
|
var MetaPixelProvider = class {
|
|
13
15
|
constructor(pixelId) {
|
|
@@ -71,7 +73,9 @@ var EVENT_MAP2 = {
|
|
|
71
73
|
begin_checkout: "begin_checkout",
|
|
72
74
|
purchase: "purchase",
|
|
73
75
|
search: "search",
|
|
74
|
-
category_view: "view_item_list"
|
|
76
|
+
category_view: "view_item_list",
|
|
77
|
+
lead: "generate_lead",
|
|
78
|
+
cta_click: "select_content"
|
|
75
79
|
};
|
|
76
80
|
var GooglePixelProvider = class {
|
|
77
81
|
constructor(measurementId) {
|
|
@@ -154,5 +158,5 @@ var PixelManager = class {
|
|
|
154
158
|
};
|
|
155
159
|
|
|
156
160
|
export { PixelManager };
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
158
|
-
//# sourceMappingURL=chunk-
|
|
161
|
+
//# sourceMappingURL=chunk-MZO7BCGU.js.map
|
|
162
|
+
//# sourceMappingURL=chunk-MZO7BCGU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pixels/meta-pixel.ts","../src/pixels/google-pixel.ts","../src/pixels/pixel-manager.ts"],"names":["EVENT_MAP"],"mappings":"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","file":"chunk-MZO7BCGU.js","sourcesContent":["import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → Meta standard event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'PageView',\n product_view: 'ViewContent',\n add_to_cart: 'AddToCart',\n remove_from_cart: 'RemoveFromCart',\n begin_checkout: 'InitiateCheckout',\n purchase: 'Purchase',\n search: 'Search',\n category_view: 'ViewContent',\n lead: 'Lead',\n cta_click: 'ViewContent',\n}\n\nexport class MetaPixelProvider implements PixelProvider {\n readonly name = 'meta'\n private pixelId: string\n private loaded = false\n\n constructor(pixelId: string) {\n this.pixelId = pixelId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n // Initialize fbq queue\n const w = window as any\n if (!w.fbq) {\n const n: any = (w.fbq = function (...args: any[]) {\n n.callMethod ? n.callMethod.apply(n, args) : n.queue.push(args)\n })\n if (!w._fbq) w._fbq = n\n n.push = n\n n.loaded = true\n n.version = '2.0'\n n.queue = []\n }\n\n // Inject script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = 'https://connect.facebook.net/en_US/fbevents.js'\n script.onload = () => resolve()\n script.onerror = () => resolve() // don't block on load failure\n const first = document.getElementsByTagName('script')[0]\n first?.parentNode?.insertBefore(script, first)\n })\n\n w.fbq('init', this.pixelId)\n w.fbq('track', 'PageView')\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.fbq !== 'function') return\n\n const metaEvent = EVENT_MAP[event]\n if (!metaEvent) return\n\n // Extract eventID for Meta dedup (fbq 4th arg), pass remaining as event params\n const { eventID, ...rest } = params ?? {}\n const hasParams = Object.keys(rest).length > 0\n const options = eventID ? { eventID } : undefined\n\n if (hasParams) {\n w.fbq('track', metaEvent, rest, options)\n } else {\n w.fbq('track', metaEvent, {}, options)\n }\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → GA4 recommended event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'page_view',\n product_view: 'view_item',\n add_to_cart: 'add_to_cart',\n remove_from_cart: 'remove_from_cart',\n begin_checkout: 'begin_checkout',\n purchase: 'purchase',\n search: 'search',\n category_view: 'view_item_list',\n lead: 'generate_lead',\n cta_click: 'select_content',\n}\n\nexport class GooglePixelProvider implements PixelProvider {\n readonly name = 'google'\n private measurementId: string\n private loaded = false\n\n constructor(measurementId: string) {\n this.measurementId = measurementId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n const w = window as any\n\n // Initialize dataLayer\n w.dataLayer = w.dataLayer || []\n if (!w.gtag) {\n w.gtag = function (...args: any[]) {\n w.dataLayer.push(arguments)\n }\n w.gtag('js', new Date())\n w.gtag('config', this.measurementId)\n }\n\n // Inject gtag.js script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = `https://www.googletagmanager.com/gtag/js?id=${this.measurementId}`\n script.onload = () => resolve()\n script.onerror = () => resolve()\n document.head.appendChild(script)\n })\n\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.gtag !== 'function') return\n\n const ga4Event = EVENT_MAP[event]\n if (!ga4Event) return\n\n // Strip eventID (Meta-specific), map to GA4 params\n const { eventID, product_id, product_name, quantity, price, tier, total, order_id, order_number, cart_id, item_count, query, result_count, ...rest } = params ?? {}\n\n const ga4Params: Record<string, unknown> = { ...rest }\n\n if (total !== undefined) ga4Params.value = total\n if (order_id) ga4Params.transaction_id = order_id\n if (query) ga4Params.search_term = query\n\n // Build items array for e-commerce events\n if (product_id) {\n ga4Params.items = [{\n item_id: product_id,\n item_name: product_name,\n quantity: quantity ?? 1,\n price,\n item_variant: tier,\n }]\n }\n\n ga4Params.currency = 'USD'\n\n w.gtag('event', ga4Event, ga4Params)\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelConfig, PixelProvider } from './types.js'\nimport { MetaPixelProvider } from './meta-pixel.js'\nimport { GooglePixelProvider } from './google-pixel.js'\n\nexport class PixelManager {\n private providers: PixelProvider[] = []\n\n constructor(configs: PixelConfig[]) {\n for (const config of configs) {\n if (config.provider === 'meta' && config.pixel_id) {\n this.providers.push(new MetaPixelProvider(config.pixel_id))\n } else if (config.provider === 'google' && config.measurement_id) {\n this.providers.push(new GooglePixelProvider(config.measurement_id))\n }\n }\n }\n\n async initialize(): Promise<void> {\n await Promise.all(this.providers.map((p) => p.load()))\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n for (const provider of this.providers) {\n if (provider.isLoaded()) {\n provider.track(event, params)\n }\n }\n }\n}\n"]}
|
|
@@ -9,7 +9,9 @@ var EVENT_MAP = {
|
|
|
9
9
|
begin_checkout: "InitiateCheckout",
|
|
10
10
|
purchase: "Purchase",
|
|
11
11
|
search: "Search",
|
|
12
|
-
category_view: "ViewContent"
|
|
12
|
+
category_view: "ViewContent",
|
|
13
|
+
lead: "Lead",
|
|
14
|
+
cta_click: "ViewContent"
|
|
13
15
|
};
|
|
14
16
|
var MetaPixelProvider = class {
|
|
15
17
|
constructor(pixelId) {
|
|
@@ -73,7 +75,9 @@ var EVENT_MAP2 = {
|
|
|
73
75
|
begin_checkout: "begin_checkout",
|
|
74
76
|
purchase: "purchase",
|
|
75
77
|
search: "search",
|
|
76
|
-
category_view: "view_item_list"
|
|
78
|
+
category_view: "view_item_list",
|
|
79
|
+
lead: "generate_lead",
|
|
80
|
+
cta_click: "select_content"
|
|
77
81
|
};
|
|
78
82
|
var GooglePixelProvider = class {
|
|
79
83
|
constructor(measurementId) {
|
|
@@ -156,5 +160,5 @@ var PixelManager = class {
|
|
|
156
160
|
};
|
|
157
161
|
|
|
158
162
|
exports.PixelManager = PixelManager;
|
|
159
|
-
//# sourceMappingURL=chunk-
|
|
160
|
-
//# sourceMappingURL=chunk-
|
|
163
|
+
//# sourceMappingURL=chunk-UW2U5BRY.cjs.map
|
|
164
|
+
//# sourceMappingURL=chunk-UW2U5BRY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pixels/meta-pixel.ts","../src/pixels/google-pixel.ts","../src/pixels/pixel-manager.ts"],"names":["EVENT_MAP"],"mappings":"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","file":"chunk-UW2U5BRY.cjs","sourcesContent":["import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → Meta standard event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'PageView',\n product_view: 'ViewContent',\n add_to_cart: 'AddToCart',\n remove_from_cart: 'RemoveFromCart',\n begin_checkout: 'InitiateCheckout',\n purchase: 'Purchase',\n search: 'Search',\n category_view: 'ViewContent',\n lead: 'Lead',\n cta_click: 'ViewContent',\n}\n\nexport class MetaPixelProvider implements PixelProvider {\n readonly name = 'meta'\n private pixelId: string\n private loaded = false\n\n constructor(pixelId: string) {\n this.pixelId = pixelId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n // Initialize fbq queue\n const w = window as any\n if (!w.fbq) {\n const n: any = (w.fbq = function (...args: any[]) {\n n.callMethod ? n.callMethod.apply(n, args) : n.queue.push(args)\n })\n if (!w._fbq) w._fbq = n\n n.push = n\n n.loaded = true\n n.version = '2.0'\n n.queue = []\n }\n\n // Inject script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = 'https://connect.facebook.net/en_US/fbevents.js'\n script.onload = () => resolve()\n script.onerror = () => resolve() // don't block on load failure\n const first = document.getElementsByTagName('script')[0]\n first?.parentNode?.insertBefore(script, first)\n })\n\n w.fbq('init', this.pixelId)\n w.fbq('track', 'PageView')\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.fbq !== 'function') return\n\n const metaEvent = EVENT_MAP[event]\n if (!metaEvent) return\n\n // Extract eventID for Meta dedup (fbq 4th arg), pass remaining as event params\n const { eventID, ...rest } = params ?? {}\n const hasParams = Object.keys(rest).length > 0\n const options = eventID ? { eventID } : undefined\n\n if (hasParams) {\n w.fbq('track', metaEvent, rest, options)\n } else {\n w.fbq('track', metaEvent, {}, options)\n }\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → GA4 recommended event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'page_view',\n product_view: 'view_item',\n add_to_cart: 'add_to_cart',\n remove_from_cart: 'remove_from_cart',\n begin_checkout: 'begin_checkout',\n purchase: 'purchase',\n search: 'search',\n category_view: 'view_item_list',\n lead: 'generate_lead',\n cta_click: 'select_content',\n}\n\nexport class GooglePixelProvider implements PixelProvider {\n readonly name = 'google'\n private measurementId: string\n private loaded = false\n\n constructor(measurementId: string) {\n this.measurementId = measurementId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n const w = window as any\n\n // Initialize dataLayer\n w.dataLayer = w.dataLayer || []\n if (!w.gtag) {\n w.gtag = function (...args: any[]) {\n w.dataLayer.push(arguments)\n }\n w.gtag('js', new Date())\n w.gtag('config', this.measurementId)\n }\n\n // Inject gtag.js script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = `https://www.googletagmanager.com/gtag/js?id=${this.measurementId}`\n script.onload = () => resolve()\n script.onerror = () => resolve()\n document.head.appendChild(script)\n })\n\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.gtag !== 'function') return\n\n const ga4Event = EVENT_MAP[event]\n if (!ga4Event) return\n\n // Strip eventID (Meta-specific), map to GA4 params\n const { eventID, product_id, product_name, quantity, price, tier, total, order_id, order_number, cart_id, item_count, query, result_count, ...rest } = params ?? {}\n\n const ga4Params: Record<string, unknown> = { ...rest }\n\n if (total !== undefined) ga4Params.value = total\n if (order_id) ga4Params.transaction_id = order_id\n if (query) ga4Params.search_term = query\n\n // Build items array for e-commerce events\n if (product_id) {\n ga4Params.items = [{\n item_id: product_id,\n item_name: product_name,\n quantity: quantity ?? 1,\n price,\n item_variant: tier,\n }]\n }\n\n ga4Params.currency = 'USD'\n\n w.gtag('event', ga4Event, ga4Params)\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelConfig, PixelProvider } from './types.js'\nimport { MetaPixelProvider } from './meta-pixel.js'\nimport { GooglePixelProvider } from './google-pixel.js'\n\nexport class PixelManager {\n private providers: PixelProvider[] = []\n\n constructor(configs: PixelConfig[]) {\n for (const config of configs) {\n if (config.provider === 'meta' && config.pixel_id) {\n this.providers.push(new MetaPixelProvider(config.pixel_id))\n } else if (config.provider === 'google' && config.measurement_id) {\n this.providers.push(new GooglePixelProvider(config.measurement_id))\n }\n }\n }\n\n async initialize(): Promise<void> {\n await Promise.all(this.providers.map((p) => p.load()))\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n for (const provider of this.providers) {\n if (provider.isLoaded()) {\n provider.track(event, params)\n }\n }\n }\n}\n"]}
|
|
@@ -331,7 +331,7 @@ interface WhaleStorefrontConfig {
|
|
|
331
331
|
*/
|
|
332
332
|
recordingRate?: number;
|
|
333
333
|
}
|
|
334
|
-
type EventType = 'page_view' | 'product_view' | 'add_to_cart' | 'remove_from_cart' | 'begin_checkout' | 'purchase' | 'category_view' | 'search';
|
|
334
|
+
type EventType = 'page_view' | 'product_view' | 'add_to_cart' | 'remove_from_cart' | 'begin_checkout' | 'purchase' | 'category_view' | 'search' | 'lead' | 'cta_click';
|
|
335
335
|
interface QRLandingPage {
|
|
336
336
|
title: string | null;
|
|
337
337
|
description: string | null;
|
|
@@ -331,7 +331,7 @@ interface WhaleStorefrontConfig {
|
|
|
331
331
|
*/
|
|
332
332
|
recordingRate?: number;
|
|
333
333
|
}
|
|
334
|
-
type EventType = 'page_view' | 'product_view' | 'add_to_cart' | 'remove_from_cart' | 'begin_checkout' | 'purchase' | 'category_view' | 'search';
|
|
334
|
+
type EventType = 'page_view' | 'product_view' | 'add_to_cart' | 'remove_from_cart' | 'begin_checkout' | 'purchase' | 'category_view' | 'search' | 'lead' | 'cta_click';
|
|
335
335
|
interface QRLandingPage {
|
|
336
336
|
title: string | null;
|
|
337
337
|
description: string | null;
|
package/dist/index.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkUW2U5BRY_cjs = require('./chunk-UW2U5BRY.cjs');
|
|
4
4
|
var chunkV5KCIYKG_cjs = require('./chunk-V5KCIYKG.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "PixelManager", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkUW2U5BRY_cjs.PixelManager; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "WhaleClient", {
|
|
13
13
|
enumerable: true,
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { A as Address, C as Cart, a as CartItem, b as Category, c as CategoryTreeNode, d as CheckoutSession, e as CouponValidation, f as Customer, g as CustomerAnalytics, D as DealValidation, E as EventType, L as LandingPageConfig, h as LandingPageRenderData, i as LandingSection, j as ListResponse, k as Location, l as LoyaltyAccount, m as LoyaltyReward, n as LoyaltyTransaction, O as Order, o as OrderItem, P as PaymentData, p as PixelConfig, q as PricingTier, r as Product, s as ProductVariation, Q as QRLandingData, t as QRLandingPage, u as QRLandingStore, R as Recommendation, v as Review, w as ReviewSummary, S as SendCodeResponse, x as ShippingMethod, y as ShippingRate, z as StorefrontConfig, B as StorefrontSession, T as TaxBreakdown, V as VerifyCodeResponse, W as WhaleClient, F as WhaleStorefrontConfig, G as WishlistItem } from './client-
|
|
2
|
-
export { P as PixelManager } from './pixel-manager-
|
|
1
|
+
export { A as Address, C as Cart, a as CartItem, b as Category, c as CategoryTreeNode, d as CheckoutSession, e as CouponValidation, f as Customer, g as CustomerAnalytics, D as DealValidation, E as EventType, L as LandingPageConfig, h as LandingPageRenderData, i as LandingSection, j as ListResponse, k as Location, l as LoyaltyAccount, m as LoyaltyReward, n as LoyaltyTransaction, O as Order, o as OrderItem, P as PaymentData, p as PixelConfig, q as PricingTier, r as Product, s as ProductVariation, Q as QRLandingData, t as QRLandingPage, u as QRLandingStore, R as Recommendation, v as Review, w as ReviewSummary, S as SendCodeResponse, x as ShippingMethod, y as ShippingRate, z as StorefrontConfig, B as StorefrontSession, T as TaxBreakdown, V as VerifyCodeResponse, W as WhaleClient, F as WhaleStorefrontConfig, G as WishlistItem } from './client-CwCSPAHp.cjs';
|
|
2
|
+
export { P as PixelManager } from './pixel-manager-ti1xc1eC.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Resilient HTTP sender for analytics/event payloads.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { A as Address, C as Cart, a as CartItem, b as Category, c as CategoryTreeNode, d as CheckoutSession, e as CouponValidation, f as Customer, g as CustomerAnalytics, D as DealValidation, E as EventType, L as LandingPageConfig, h as LandingPageRenderData, i as LandingSection, j as ListResponse, k as Location, l as LoyaltyAccount, m as LoyaltyReward, n as LoyaltyTransaction, O as Order, o as OrderItem, P as PaymentData, p as PixelConfig, q as PricingTier, r as Product, s as ProductVariation, Q as QRLandingData, t as QRLandingPage, u as QRLandingStore, R as Recommendation, v as Review, w as ReviewSummary, S as SendCodeResponse, x as ShippingMethod, y as ShippingRate, z as StorefrontConfig, B as StorefrontSession, T as TaxBreakdown, V as VerifyCodeResponse, W as WhaleClient, F as WhaleStorefrontConfig, G as WishlistItem } from './client-
|
|
2
|
-
export { P as PixelManager } from './pixel-manager-
|
|
1
|
+
export { A as Address, C as Cart, a as CartItem, b as Category, c as CategoryTreeNode, d as CheckoutSession, e as CouponValidation, f as Customer, g as CustomerAnalytics, D as DealValidation, E as EventType, L as LandingPageConfig, h as LandingPageRenderData, i as LandingSection, j as ListResponse, k as Location, l as LoyaltyAccount, m as LoyaltyReward, n as LoyaltyTransaction, O as Order, o as OrderItem, P as PaymentData, p as PixelConfig, q as PricingTier, r as Product, s as ProductVariation, Q as QRLandingData, t as QRLandingPage, u as QRLandingStore, R as Recommendation, v as Review, w as ReviewSummary, S as SendCodeResponse, x as ShippingMethod, y as ShippingRate, z as StorefrontConfig, B as StorefrontSession, T as TaxBreakdown, V as VerifyCodeResponse, W as WhaleClient, F as WhaleStorefrontConfig, G as WishlistItem } from './client-CwCSPAHp.js';
|
|
2
|
+
export { P as PixelManager } from './pixel-manager-LiLpBmPy.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Resilient HTTP sender for analytics/event payloads.
|
package/dist/index.js
CHANGED
package/dist/next/index.d.cts
CHANGED
package/dist/next/index.d.ts
CHANGED
package/dist/react/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkUW2U5BRY_cjs = require('../chunk-UW2U5BRY.cjs');
|
|
4
4
|
var chunkV5KCIYKG_cjs = require('../chunk-V5KCIYKG.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var navigation = require('next/navigation');
|
|
@@ -674,7 +674,7 @@ function PixelInitializer({ onReady, onTheme }) {
|
|
|
674
674
|
onTheme(config.theme);
|
|
675
675
|
}
|
|
676
676
|
if (ctx.config.trackingEnabled && config.pixels && config.pixels.length > 0) {
|
|
677
|
-
const manager = new
|
|
677
|
+
const manager = new chunkUW2U5BRY_cjs.PixelManager(config.pixels);
|
|
678
678
|
await manager.initialize();
|
|
679
679
|
onReady(manager);
|
|
680
680
|
}
|
|
@@ -2454,6 +2454,68 @@ function useReferral() {
|
|
|
2454
2454
|
referredBy: status?.referred_by ?? null
|
|
2455
2455
|
};
|
|
2456
2456
|
}
|
|
2457
|
+
var NUM_PATTERN = /(\$?[\d,]+\.?\d*[+★%]?)/g;
|
|
2458
|
+
function easeOutQuart(t) {
|
|
2459
|
+
return 1 - Math.pow(1 - t, 4);
|
|
2460
|
+
}
|
|
2461
|
+
function useCountUp(target, duration, start) {
|
|
2462
|
+
const [value, setValue] = react.useState(0);
|
|
2463
|
+
const raf = react.useRef(0);
|
|
2464
|
+
react.useEffect(() => {
|
|
2465
|
+
if (!start) return;
|
|
2466
|
+
const t0 = performance.now();
|
|
2467
|
+
function tick(now2) {
|
|
2468
|
+
const elapsed = now2 - t0;
|
|
2469
|
+
const progress = Math.min(elapsed / duration, 1);
|
|
2470
|
+
setValue(Math.round(easeOutQuart(progress) * target));
|
|
2471
|
+
if (progress < 1) raf.current = requestAnimationFrame(tick);
|
|
2472
|
+
}
|
|
2473
|
+
raf.current = requestAnimationFrame(tick);
|
|
2474
|
+
return () => cancelAnimationFrame(raf.current);
|
|
2475
|
+
}, [target, duration, start]);
|
|
2476
|
+
return value;
|
|
2477
|
+
}
|
|
2478
|
+
function AnimatedNumber({ raw }) {
|
|
2479
|
+
const ref = react.useRef(null);
|
|
2480
|
+
const [visible, setVisible] = react.useState(false);
|
|
2481
|
+
react.useEffect(() => {
|
|
2482
|
+
const el = ref.current;
|
|
2483
|
+
if (!el || typeof IntersectionObserver === "undefined") {
|
|
2484
|
+
setVisible(true);
|
|
2485
|
+
return;
|
|
2486
|
+
}
|
|
2487
|
+
const obs = new IntersectionObserver(([entry]) => {
|
|
2488
|
+
if (entry.isIntersecting) {
|
|
2489
|
+
setVisible(true);
|
|
2490
|
+
obs.disconnect();
|
|
2491
|
+
}
|
|
2492
|
+
}, { threshold: 0.3 });
|
|
2493
|
+
obs.observe(el);
|
|
2494
|
+
return () => obs.disconnect();
|
|
2495
|
+
}, []);
|
|
2496
|
+
const prefix = raw.startsWith("$") ? "$" : "";
|
|
2497
|
+
const suffix = raw.match(/[+★%]$/)?.[0] || "";
|
|
2498
|
+
const numeric = parseFloat(raw.replace(/[\$,+★%]/g, ""));
|
|
2499
|
+
const hasCommas = raw.includes(",");
|
|
2500
|
+
const decimals = raw.includes(".") ? raw.split(".")[1]?.replace(/[+★%]/g, "").length || 0 : 0;
|
|
2501
|
+
const count = useCountUp(
|
|
2502
|
+
decimals > 0 ? Math.round(numeric * Math.pow(10, decimals)) : numeric,
|
|
2503
|
+
1400,
|
|
2504
|
+
visible
|
|
2505
|
+
);
|
|
2506
|
+
const display = decimals > 0 ? (count / Math.pow(10, decimals)).toFixed(decimals) : hasCommas ? count.toLocaleString() : String(count);
|
|
2507
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("span", { ref, children: [
|
|
2508
|
+
prefix,
|
|
2509
|
+
display,
|
|
2510
|
+
suffix
|
|
2511
|
+
] });
|
|
2512
|
+
}
|
|
2513
|
+
function AnimatedText({ text }) {
|
|
2514
|
+
const parts = text.split(NUM_PATTERN);
|
|
2515
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: parts.map(
|
|
2516
|
+
(part, i) => NUM_PATTERN.test(part) ? /* @__PURE__ */ jsxRuntime.jsx(AnimatedNumber, { raw: part }, i) : part
|
|
2517
|
+
) });
|
|
2518
|
+
}
|
|
2457
2519
|
function trackClick(tracking, label, url, position) {
|
|
2458
2520
|
if (!tracking?.gatewayUrl || !tracking?.code) return;
|
|
2459
2521
|
const body = JSON.stringify({ label, url, position });
|
|
@@ -2468,13 +2530,14 @@ function SectionRenderer({
|
|
|
2468
2530
|
section,
|
|
2469
2531
|
data,
|
|
2470
2532
|
theme,
|
|
2471
|
-
tracking
|
|
2533
|
+
tracking,
|
|
2534
|
+
onEvent
|
|
2472
2535
|
}) {
|
|
2473
2536
|
const [showCOA, setShowCOA] = react.useState(false);
|
|
2474
2537
|
const el = (() => {
|
|
2475
2538
|
switch (section.type) {
|
|
2476
2539
|
case "hero":
|
|
2477
|
-
return /* @__PURE__ */ jsxRuntime.jsx(HeroSection, { section, theme, tracking });
|
|
2540
|
+
return /* @__PURE__ */ jsxRuntime.jsx(HeroSection, { section, theme, tracking, onEvent });
|
|
2478
2541
|
case "text":
|
|
2479
2542
|
return /* @__PURE__ */ jsxRuntime.jsx(TextSection, { section, theme });
|
|
2480
2543
|
case "image":
|
|
@@ -2484,7 +2547,7 @@ function SectionRenderer({
|
|
|
2484
2547
|
case "gallery":
|
|
2485
2548
|
return /* @__PURE__ */ jsxRuntime.jsx(GallerySection, { section, theme });
|
|
2486
2549
|
case "cta":
|
|
2487
|
-
return /* @__PURE__ */ jsxRuntime.jsx(CTASection, { section, theme, tracking });
|
|
2550
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CTASection, { section, theme, tracking, onEvent });
|
|
2488
2551
|
case "stats":
|
|
2489
2552
|
return /* @__PURE__ */ jsxRuntime.jsx(StatsSection, { section, theme });
|
|
2490
2553
|
case "product_card":
|
|
@@ -2494,7 +2557,7 @@ function SectionRenderer({
|
|
|
2494
2557
|
case "social_links":
|
|
2495
2558
|
return /* @__PURE__ */ jsxRuntime.jsx(SocialLinksSection, { section, theme });
|
|
2496
2559
|
case "lead_capture":
|
|
2497
|
-
return /* @__PURE__ */ jsxRuntime.jsx(LeadCaptureSection, { section, data, theme });
|
|
2560
|
+
return /* @__PURE__ */ jsxRuntime.jsx(LeadCaptureSection, { section, data, theme, onEvent });
|
|
2498
2561
|
case "divider":
|
|
2499
2562
|
return /* @__PURE__ */ jsxRuntime.jsx(DividerSection, { theme });
|
|
2500
2563
|
default:
|
|
@@ -2506,7 +2569,7 @@ function SectionRenderer({
|
|
|
2506
2569
|
showCOA && data?.coa && /* @__PURE__ */ jsxRuntime.jsx(COAModal, { coa: data.coa, theme, onClose: () => setShowCOA(false) })
|
|
2507
2570
|
] });
|
|
2508
2571
|
}
|
|
2509
|
-
function HeroSection({ section, theme, tracking }) {
|
|
2572
|
+
function HeroSection({ section, theme, tracking, onEvent }) {
|
|
2510
2573
|
const { title, subtitle, background_image, cta_text, cta_url } = section.content;
|
|
2511
2574
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2512
2575
|
"div",
|
|
@@ -2535,7 +2598,7 @@ function HeroSection({ section, theme, tracking }) {
|
|
|
2535
2598
|
lineHeight: 1.15,
|
|
2536
2599
|
letterSpacing: "-0.02em",
|
|
2537
2600
|
color: theme.fg
|
|
2538
|
-
}, children: title }),
|
|
2601
|
+
}, children: /* @__PURE__ */ jsxRuntime.jsx(AnimatedText, { text: title }) }),
|
|
2539
2602
|
subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { style: {
|
|
2540
2603
|
fontSize: "0.85rem",
|
|
2541
2604
|
color: theme.accent,
|
|
@@ -2548,7 +2611,10 @@ function HeroSection({ section, theme, tracking }) {
|
|
|
2548
2611
|
"a",
|
|
2549
2612
|
{
|
|
2550
2613
|
href: cta_url,
|
|
2551
|
-
onClick: () =>
|
|
2614
|
+
onClick: () => {
|
|
2615
|
+
trackClick(tracking, cta_text, cta_url);
|
|
2616
|
+
onEvent?.("cta_click", { label: cta_text, url: cta_url });
|
|
2617
|
+
},
|
|
2552
2618
|
style: {
|
|
2553
2619
|
display: "inline-block",
|
|
2554
2620
|
padding: "0.875rem 2rem",
|
|
@@ -2634,7 +2700,7 @@ function GallerySection({ section, theme }) {
|
|
|
2634
2700
|
}
|
|
2635
2701
|
) }, i)) }) });
|
|
2636
2702
|
}
|
|
2637
|
-
function CTASection({ section, theme, tracking }) {
|
|
2703
|
+
function CTASection({ section, theme, tracking, onEvent }) {
|
|
2638
2704
|
const { title, subtitle, buttons } = section.content;
|
|
2639
2705
|
if (!buttons || buttons.length === 0) return null;
|
|
2640
2706
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "2rem 1.5rem", maxWidth: 480, margin: "0 auto", display: "flex", flexDirection: "column", gap: "0.75rem" }, children: [
|
|
@@ -2663,7 +2729,10 @@ function CTASection({ section, theme, tracking }) {
|
|
|
2663
2729
|
"a",
|
|
2664
2730
|
{
|
|
2665
2731
|
href: btn.url,
|
|
2666
|
-
onClick: () =>
|
|
2732
|
+
onClick: () => {
|
|
2733
|
+
trackClick(tracking, btn.text, btn.url, i);
|
|
2734
|
+
onEvent?.("cta_click", { label: btn.text, url: btn.url });
|
|
2735
|
+
},
|
|
2667
2736
|
style: {
|
|
2668
2737
|
display: "block",
|
|
2669
2738
|
width: "100%",
|
|
@@ -2704,7 +2773,7 @@ function StatsSection({ section, theme }) {
|
|
|
2704
2773
|
letterSpacing: "0.15em",
|
|
2705
2774
|
color: `${theme.fg}66`
|
|
2706
2775
|
}, children: stat.label }),
|
|
2707
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 14, fontWeight: 300, color: `${theme.fg}CC` }, children: stat.value })
|
|
2776
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 14, fontWeight: 300, color: `${theme.fg}CC` }, children: /* @__PURE__ */ jsxRuntime.jsx(AnimatedText, { text: stat.value }) })
|
|
2708
2777
|
] }),
|
|
2709
2778
|
i < stats.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("hr", { style: { border: "none", borderTop: `1px solid ${theme.fg}0A`, margin: 0 } })
|
|
2710
2779
|
] }, i)) });
|
|
@@ -2725,7 +2794,7 @@ function StatsSection({ section, theme }) {
|
|
|
2725
2794
|
fontWeight: 300,
|
|
2726
2795
|
lineHeight: 1,
|
|
2727
2796
|
color: theme.fg
|
|
2728
|
-
}, children: stat.value }),
|
|
2797
|
+
}, children: /* @__PURE__ */ jsxRuntime.jsx(AnimatedText, { text: stat.value }) }),
|
|
2729
2798
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: {
|
|
2730
2799
|
fontSize: 11,
|
|
2731
2800
|
fontWeight: 500,
|
|
@@ -2818,7 +2887,7 @@ function COAViewerSection({
|
|
|
2818
2887
|
onShowCOA();
|
|
2819
2888
|
}, style: buttonStyle, children: buttonLabel }) });
|
|
2820
2889
|
}
|
|
2821
|
-
function LeadCaptureSection({ section, data, theme }) {
|
|
2890
|
+
function LeadCaptureSection({ section, data, theme, onEvent }) {
|
|
2822
2891
|
const c = section.content;
|
|
2823
2892
|
const [firstName, setFirstName] = react.useState("");
|
|
2824
2893
|
const [email, setEmail] = react.useState("");
|
|
@@ -2855,6 +2924,7 @@ function LeadCaptureSection({ section, data, theme }) {
|
|
|
2855
2924
|
throw new Error(body?.error?.message || "Something went wrong. Please try again.");
|
|
2856
2925
|
}
|
|
2857
2926
|
setStatus("success");
|
|
2927
|
+
onEvent?.("lead", { email, first_name: firstName || void 0, source: c.source || "landing_page", landing_page_slug: slug || void 0 });
|
|
2858
2928
|
} catch (err) {
|
|
2859
2929
|
setErrorMsg(err instanceof Error ? err.message : "Something went wrong. Please try again.");
|
|
2860
2930
|
setStatus("error");
|
|
@@ -3391,7 +3461,8 @@ function LandingPage({
|
|
|
3391
3461
|
gatewayUrl = "https://whale-gateway.fly.dev",
|
|
3392
3462
|
renderSection,
|
|
3393
3463
|
onDataLoaded,
|
|
3394
|
-
onError
|
|
3464
|
+
onError,
|
|
3465
|
+
onEvent
|
|
3395
3466
|
}) {
|
|
3396
3467
|
const [state, setState] = react.useState("loading");
|
|
3397
3468
|
const [data, setData] = react.useState(null);
|
|
@@ -3439,12 +3510,13 @@ function LandingPage({
|
|
|
3439
3510
|
if (state === "expired") return /* @__PURE__ */ jsxRuntime.jsx(DefaultExpired2, {});
|
|
3440
3511
|
if (state === "error") return /* @__PURE__ */ jsxRuntime.jsx(DefaultError2, { message: errorMsg });
|
|
3441
3512
|
if (!data) return null;
|
|
3442
|
-
return /* @__PURE__ */ jsxRuntime.jsx(PageLayout, { data, gatewayUrl, renderSection });
|
|
3513
|
+
return /* @__PURE__ */ jsxRuntime.jsx(PageLayout, { data, gatewayUrl, renderSection, onEvent });
|
|
3443
3514
|
}
|
|
3444
3515
|
function PageLayout({
|
|
3445
3516
|
data,
|
|
3446
3517
|
gatewayUrl,
|
|
3447
|
-
renderSection
|
|
3518
|
+
renderSection,
|
|
3519
|
+
onEvent
|
|
3448
3520
|
}) {
|
|
3449
3521
|
const { landing_page: lp, store } = data;
|
|
3450
3522
|
const theme = {
|
|
@@ -3464,11 +3536,11 @@ function PageLayout({
|
|
|
3464
3536
|
lp.custom_css && /* @__PURE__ */ jsxRuntime.jsx("style", { children: lp.custom_css }),
|
|
3465
3537
|
logoUrl && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "1.5rem", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: logoUrl, alt: store?.name || "Store", style: { height: 40, objectFit: "contain" } }) }),
|
|
3466
3538
|
sorted.map((section) => {
|
|
3467
|
-
const defaultRenderer = () => /* @__PURE__ */ jsxRuntime.jsx(SectionRenderer, { section, data: sectionData, theme }, section.id);
|
|
3539
|
+
const defaultRenderer = () => /* @__PURE__ */ jsxRuntime.jsx(SectionRenderer, { section, data: sectionData, theme, onEvent }, section.id);
|
|
3468
3540
|
if (renderSection) {
|
|
3469
3541
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { children: renderSection(section, defaultRenderer) }, section.id);
|
|
3470
3542
|
}
|
|
3471
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SectionRenderer, { section, data: sectionData, theme }, section.id);
|
|
3543
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SectionRenderer, { section, data: sectionData, theme, onEvent }, section.id);
|
|
3472
3544
|
}),
|
|
3473
3545
|
store?.name && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "2rem 1.5rem", borderTop: `1px solid ${theme.surface}`, textAlign: "center" }, children: /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "0.75rem", color: theme.muted, margin: 0 }, children: [
|
|
3474
3546
|
"Powered by ",
|