@sonordev/site-kit 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/AnalyticsProvider-GOLL2W6O.mjs +10 -0
  3. package/dist/{AnalyticsProvider-V5CWTWWO.mjs.map → AnalyticsProvider-GOLL2W6O.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-PK5E4TWJ.js +31 -0
  5. package/dist/{AnalyticsProvider-35EDQA5V.js.map → AnalyticsProvider-PK5E4TWJ.js.map} +1 -1
  6. package/dist/ChatWidget-5RMDVEJL.js +19 -0
  7. package/dist/{ChatWidget-2OK6DD66.js.map → ChatWidget-5RMDVEJL.js.map} +1 -1
  8. package/dist/ChatWidget-LOZDGIVP.mjs +10 -0
  9. package/dist/{ChatWidget-WNT6VNJK.mjs.map → ChatWidget-LOZDGIVP.mjs.map} +1 -1
  10. package/dist/EngageWidget-CYJK6RAJ.js +18 -0
  11. package/dist/{EngageWidget-7RZIC426.js.map → EngageWidget-CYJK6RAJ.js.map} +1 -1
  12. package/dist/EngageWidget-HLJMP7MR.mjs +9 -0
  13. package/dist/{EngageWidget-GWME22IP.mjs.map → EngageWidget-HLJMP7MR.mjs.map} +1 -1
  14. package/dist/{SignalCore-DK4HQBPY.js → SignalCore-7SB26IPW.js} +11 -11
  15. package/dist/{SignalCore-DK4HQBPY.js.map → SignalCore-7SB26IPW.js.map} +1 -1
  16. package/dist/{SignalCore-TW4YA3BW.mjs → SignalCore-JPQMRYMF.mjs} +5 -5
  17. package/dist/{SignalCore-TW4YA3BW.mjs.map → SignalCore-JPQMRYMF.mjs.map} +1 -1
  18. package/dist/SitemapSync-4UFM6LWW.mjs +8 -0
  19. package/dist/{SitemapSync-7PXQMF5A.mjs.map → SitemapSync-4UFM6LWW.mjs.map} +1 -1
  20. package/dist/SitemapSync-KIFK3OJO.js +17 -0
  21. package/dist/{SitemapSync-O3J2DPV7.js.map → SitemapSync-KIFK3OJO.js.map} +1 -1
  22. package/dist/analytics/index.js +12 -12
  23. package/dist/analytics/index.mjs +5 -5
  24. package/dist/{chunk-5WQHWBCW.mjs → chunk-253MGZYN.mjs} +8 -8
  25. package/dist/{chunk-5WQHWBCW.mjs.map → chunk-253MGZYN.mjs.map} +1 -1
  26. package/dist/{chunk-PE2A3ON5.js → chunk-3XQV5HDW.js} +12 -12
  27. package/dist/{chunk-PE2A3ON5.js.map → chunk-3XQV5HDW.js.map} +1 -1
  28. package/dist/chunk-5BC7I3KH.mjs +134 -0
  29. package/dist/chunk-5BC7I3KH.mjs.map +1 -0
  30. package/dist/{chunk-NBI5AV6U.mjs → chunk-5WRJRJSM.mjs} +3 -3
  31. package/dist/{chunk-NBI5AV6U.mjs.map → chunk-5WRJRJSM.mjs.map} +1 -1
  32. package/dist/{chunk-ZY3G7JGT.js → chunk-7F3RT2RX.js} +8 -8
  33. package/dist/{chunk-ZY3G7JGT.js.map → chunk-7F3RT2RX.js.map} +1 -1
  34. package/dist/{chunk-SQGDDITI.js → chunk-7J47WT5V.js} +14 -14
  35. package/dist/{chunk-SQGDDITI.js.map → chunk-7J47WT5V.js.map} +1 -1
  36. package/dist/{chunk-Y4U3OCKH.js → chunk-7ZY44LI4.js} +3 -3
  37. package/dist/{chunk-Y4U3OCKH.js.map → chunk-7ZY44LI4.js.map} +1 -1
  38. package/dist/{chunk-BNJH2RFU.mjs → chunk-BYW3MJ36.mjs} +3 -3
  39. package/dist/{chunk-BNJH2RFU.mjs.map → chunk-BYW3MJ36.mjs.map} +1 -1
  40. package/dist/{chunk-2NA5CAK5.mjs → chunk-C4JYWTI5.mjs} +3 -3
  41. package/dist/{chunk-2NA5CAK5.mjs.map → chunk-C4JYWTI5.mjs.map} +1 -1
  42. package/dist/{chunk-7FZWMAI2.mjs → chunk-C7MKSHRI.mjs} +3 -3
  43. package/dist/{chunk-7FZWMAI2.mjs.map → chunk-C7MKSHRI.mjs.map} +1 -1
  44. package/dist/{chunk-T3RPPS25.js → chunk-CPYUZSJN.js} +7 -7
  45. package/dist/{chunk-T3RPPS25.js.map → chunk-CPYUZSJN.js.map} +1 -1
  46. package/dist/{chunk-YKPAFEJ4.mjs → chunk-DAVE4PEM.mjs} +4 -4
  47. package/dist/{chunk-YKPAFEJ4.mjs.map → chunk-DAVE4PEM.mjs.map} +1 -1
  48. package/dist/{chunk-EH7QQU6P.js → chunk-DF3MIQNB.js} +15 -15
  49. package/dist/{chunk-EH7QQU6P.js.map → chunk-DF3MIQNB.js.map} +1 -1
  50. package/dist/{chunk-TJS6FPR7.js → chunk-DLZEFUKB.js} +9 -9
  51. package/dist/{chunk-TJS6FPR7.js.map → chunk-DLZEFUKB.js.map} +1 -1
  52. package/dist/{chunk-XY4NJJEX.js → chunk-FMUTOABC.js} +15 -15
  53. package/dist/{chunk-XY4NJJEX.js.map → chunk-FMUTOABC.js.map} +1 -1
  54. package/dist/{chunk-STTSIODQ.mjs → chunk-GJSNM2A3.mjs} +4 -4
  55. package/dist/{chunk-STTSIODQ.mjs.map → chunk-GJSNM2A3.mjs.map} +1 -1
  56. package/dist/{chunk-PWIBFSXK.js → chunk-JBRLJMXM.js} +14 -14
  57. package/dist/{chunk-PWIBFSXK.js.map → chunk-JBRLJMXM.js.map} +1 -1
  58. package/dist/{chunk-CTPE3G5W.js → chunk-JZAKTBKV.js} +5 -5
  59. package/dist/{chunk-CTPE3G5W.js.map → chunk-JZAKTBKV.js.map} +1 -1
  60. package/dist/chunk-K24NKI35.js +8 -0
  61. package/dist/{chunk-NME3SQCB.js.map → chunk-K24NKI35.js.map} +1 -1
  62. package/dist/{chunk-Q2SPOBHU.js → chunk-KIUNFFDD.js} +13 -13
  63. package/dist/{chunk-Q2SPOBHU.js.map → chunk-KIUNFFDD.js.map} +1 -1
  64. package/dist/{chunk-TBMFLLRV.js → chunk-KJD5UJ4C.js} +9 -9
  65. package/dist/{chunk-TBMFLLRV.js.map → chunk-KJD5UJ4C.js.map} +1 -1
  66. package/dist/chunk-KRZL6VYP.mjs +6 -0
  67. package/dist/{chunk-QGPYFC6G.mjs.map → chunk-KRZL6VYP.mjs.map} +1 -1
  68. package/dist/{chunk-UXEB6UAR.js → chunk-KTHQKVGZ.js} +4 -4
  69. package/dist/{chunk-UXEB6UAR.js.map → chunk-KTHQKVGZ.js.map} +1 -1
  70. package/dist/{chunk-DWVF7SEK.mjs → chunk-N5H6ORXN.mjs} +3 -3
  71. package/dist/{chunk-DWVF7SEK.mjs.map → chunk-N5H6ORXN.mjs.map} +1 -1
  72. package/dist/{chunk-IMDSDDRU.js → chunk-OIAAYRGO.js} +4 -4
  73. package/dist/{chunk-IMDSDDRU.js.map → chunk-OIAAYRGO.js.map} +1 -1
  74. package/dist/{chunk-V37Z65NF.mjs → chunk-QLBNK6WJ.mjs} +3 -3
  75. package/dist/{chunk-V37Z65NF.mjs.map → chunk-QLBNK6WJ.mjs.map} +1 -1
  76. package/dist/{chunk-3KEZ2YHQ.js → chunk-QO45Q7KW.js} +6 -6
  77. package/dist/{chunk-3KEZ2YHQ.js.map → chunk-QO45Q7KW.js.map} +1 -1
  78. package/dist/{chunk-UFOOVODL.mjs → chunk-RHKFINCS.mjs} +3 -3
  79. package/dist/{chunk-UFOOVODL.mjs.map → chunk-RHKFINCS.mjs.map} +1 -1
  80. package/dist/{chunk-INGAARGC.mjs → chunk-RQV3FO33.mjs} +3 -3
  81. package/dist/{chunk-INGAARGC.mjs.map → chunk-RQV3FO33.mjs.map} +1 -1
  82. package/dist/{chunk-VX3WK77I.mjs → chunk-S32BEPZM.mjs} +4 -4
  83. package/dist/{chunk-VX3WK77I.mjs.map → chunk-S32BEPZM.mjs.map} +1 -1
  84. package/dist/{chunk-YSDJ7HI3.mjs → chunk-SOPPUXR3.mjs} +4 -4
  85. package/dist/{chunk-YSDJ7HI3.mjs.map → chunk-SOPPUXR3.mjs.map} +1 -1
  86. package/dist/chunk-T3LOHTC6.js +136 -0
  87. package/dist/chunk-T3LOHTC6.js.map +1 -0
  88. package/dist/{chunk-HRJ65XKY.mjs → chunk-V4LF47AS.mjs} +3 -3
  89. package/dist/{chunk-HRJ65XKY.mjs.map → chunk-V4LF47AS.mjs.map} +1 -1
  90. package/dist/{chunk-TRTT4PND.js → chunk-VELBKUIM.js} +5 -5
  91. package/dist/{chunk-TRTT4PND.js.map → chunk-VELBKUIM.js.map} +1 -1
  92. package/dist/{chunk-LZSHZVBE.mjs → chunk-VN3TGLT3.mjs} +3 -3
  93. package/dist/{chunk-LZSHZVBE.mjs.map → chunk-VN3TGLT3.mjs.map} +1 -1
  94. package/dist/{chunk-6JVDIW5L.mjs → chunk-ZTEQXVQF.mjs} +4 -4
  95. package/dist/{chunk-6JVDIW5L.mjs.map → chunk-ZTEQXVQF.mjs.map} +1 -1
  96. package/dist/cli/index.js +2 -2
  97. package/dist/cli/index.mjs +1 -1
  98. package/dist/client/index.js +4 -4
  99. package/dist/client/index.mjs +3 -3
  100. package/dist/commerce/index.js +51 -51
  101. package/dist/commerce/index.mjs +6 -6
  102. package/dist/engage/index.js +9 -9
  103. package/dist/engage/index.mjs +6 -6
  104. package/dist/fleet/index.js +8 -8
  105. package/dist/fleet/index.mjs +4 -4
  106. package/dist/forms/index.js +13 -13
  107. package/dist/forms/index.mjs +5 -5
  108. package/dist/images/index.js +11 -11
  109. package/dist/images/index.mjs +4 -4
  110. package/dist/index.js +64 -64
  111. package/dist/index.mjs +10 -10
  112. package/dist/layout/client.js +8 -8
  113. package/dist/layout/client.mjs +7 -7
  114. package/dist/layout/index.js +10 -10
  115. package/dist/layout/index.mjs +8 -8
  116. package/dist/maps/index.js +5 -5
  117. package/dist/maps/index.mjs +3 -3
  118. package/dist/seo/client.js +5 -5
  119. package/dist/seo/client.mjs +4 -4
  120. package/dist/seo/index.js +5 -5
  121. package/dist/seo/index.mjs +4 -4
  122. package/dist/server/index.d.mts +20 -9
  123. package/dist/server/index.d.ts +20 -9
  124. package/dist/server/index.js +3 -3
  125. package/dist/server/index.mjs +2 -2
  126. package/dist/signal/index.js +11 -11
  127. package/dist/signal/index.mjs +2 -2
  128. package/dist/sync/index.js +16 -16
  129. package/dist/sync/index.mjs +4 -4
  130. package/package.json +1 -1
  131. package/dist/AnalyticsProvider-35EDQA5V.js +0 -31
  132. package/dist/AnalyticsProvider-V5CWTWWO.mjs +0 -10
  133. package/dist/ChatWidget-2OK6DD66.js +0 -19
  134. package/dist/ChatWidget-WNT6VNJK.mjs +0 -10
  135. package/dist/EngageWidget-7RZIC426.js +0 -18
  136. package/dist/EngageWidget-GWME22IP.mjs +0 -9
  137. package/dist/SitemapSync-7PXQMF5A.mjs +0 -8
  138. package/dist/SitemapSync-O3J2DPV7.js +0 -17
  139. package/dist/chunk-CXDIWBIQ.js +0 -78
  140. package/dist/chunk-CXDIWBIQ.js.map +0 -1
  141. package/dist/chunk-MJDYY6S3.mjs +0 -76
  142. package/dist/chunk-MJDYY6S3.mjs.map +0 -1
  143. package/dist/chunk-NME3SQCB.js +0 -8
  144. package/dist/chunk-QGPYFC6G.mjs +0 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":["useSignalExperiment","useSignalEvent","useEffect","jsx","Fragment","React"],"mappings":";;;;;;;;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAIA,qCAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAGlC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,6DAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,6DAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOD,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAOJ,qCAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,oCAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAOK,sBAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-ZY3G7JGT.js","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":["useSignalExperiment","useSignalEvent","useEffect","jsx","Fragment","React"],"mappings":";;;;;;;;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAIA,qCAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAGlC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,6DAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,6DAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOD,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAOJ,qCAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,oCAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAOK,sBAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-7F3RT2RX.js","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkQ2SPOBHU_js = require('./chunk-Q2SPOBHU.js');
5
- var chunkXY4NJJEX_js = require('./chunk-XY4NJJEX.js');
4
+ var chunkKIUNFFDD_js = require('./chunk-KIUNFFDD.js');
5
+ var chunkFMUTOABC_js = require('./chunk-FMUTOABC.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var React5 = require('react');
8
8
 
@@ -112,7 +112,7 @@ async function apiPost(endpoint, body = {}) {
112
112
  return null;
113
113
  }
114
114
  try {
115
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}${endpoint}`, {
115
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}${endpoint}`, {
116
116
  method: "POST",
117
117
  headers: { "Content-Type": "application/json" },
118
118
  body: JSON.stringify(body)
@@ -270,7 +270,7 @@ async function fetchActiveProcessor() {
270
270
  const { apiUrl, apiKey } = getApiConfig();
271
271
  if (!apiKey) return null;
272
272
  try {
273
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
273
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
274
274
  method: "POST",
275
275
  headers: { "Content-Type": "application/json" },
276
276
  body: JSON.stringify({})
@@ -286,7 +286,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
286
286
  const { apiUrl, apiKey } = getApiConfig();
287
287
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
288
288
  try {
289
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
289
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
290
290
  method: "POST",
291
291
  headers: { "Content-Type": "application/json" },
292
292
  body: JSON.stringify({
@@ -314,7 +314,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
314
314
  async function validateDiscountCode(code, subtotal, offeringIds = []) {
315
315
  const { apiUrl, apiKey } = getApiConfig();
316
316
  try {
317
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
317
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
318
318
  method: "POST",
319
319
  headers: { "Content-Type": "application/json" },
320
320
  body: JSON.stringify({ code, subtotal, offeringIds })
@@ -332,7 +332,7 @@ async function fetchProcessorConfig() {
332
332
  const { apiUrl, apiKey } = getApiConfig();
333
333
  if (!apiKey) return null;
334
334
  try {
335
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
335
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
336
336
  method: "POST",
337
337
  headers: { "Content-Type": "application/json" },
338
338
  body: JSON.stringify({})
@@ -348,7 +348,7 @@ async function createPaymentIntent(options) {
348
348
  const apiKey = getApiKey();
349
349
  const sessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
350
350
  try {
351
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
351
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
352
352
  method: "POST",
353
353
  headers: { "Content-Type": "application/json" },
354
354
  body: JSON.stringify({
@@ -368,7 +368,7 @@ async function createCheckoutSession(optionsOrOfferingId, legacyOptions) {
368
368
  const options = typeof optionsOrOfferingId === "string" ? { offeringId: optionsOrOfferingId, ...legacyOptions } : optionsOrOfferingId;
369
369
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
370
370
  try {
371
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
371
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
372
372
  method: "POST",
373
373
  headers: { "Content-Type": "application/json" },
374
374
  body: JSON.stringify({
@@ -3087,7 +3087,7 @@ function ProductDetail({
3087
3087
  const [checkoutError, setCheckoutError] = React5.useState(null);
3088
3088
  const [showStickyBar, setShowStickyBar] = React5.useState(false);
3089
3089
  const buyButtonRef = React5.useRef(null);
3090
- const analytics = chunkQ2SPOBHU_js.useAnalyticsOptional();
3090
+ const analytics = chunkKIUNFFDD_js.useAnalyticsOptional();
3091
3091
  React5.useEffect(() => {
3092
3092
  if (propProduct) {
3093
3093
  setProduct(propProduct);
@@ -4458,7 +4458,7 @@ function CheckoutForm({
4458
4458
  const [discountResult, setDiscountResult] = React5.useState(null);
4459
4459
  const [applyingDiscount, setApplyingDiscount] = React5.useState(false);
4460
4460
  const isProduct = offering.type === "product";
4461
- const analytics = chunkQ2SPOBHU_js.useAnalyticsOptional();
4461
+ const analytics = chunkKIUNFFDD_js.useAnalyticsOptional();
4462
4462
  React5.useEffect(() => {
4463
4463
  fetchProcessorConfig().then((config) => {
4464
4464
  if (config?.processor) setProcessor(config.processor);
@@ -7107,7 +7107,7 @@ function EventsWidget({
7107
7107
  setLoading(true);
7108
7108
  setError(null);
7109
7109
  try {
7110
- const response = await chunkXY4NJJEX_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7110
+ const response = await chunkFMUTOABC_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7111
7111
  method: "POST",
7112
7112
  headers: { "Content-Type": "application/json" },
7113
7113
  body: JSON.stringify({
@@ -7786,5 +7786,5 @@ exports.registerForEvent = registerForEvent;
7786
7786
  exports.useEventModal = useEventModal;
7787
7787
  exports.validateAddress = validateAddress;
7788
7788
  exports.validateDiscountCode = validateDiscountCode;
7789
- //# sourceMappingURL=chunk-SQGDDITI.js.map
7790
- //# sourceMappingURL=chunk-SQGDDITI.js.map
7789
+ //# sourceMappingURL=chunk-7J47WT5V.js.map
7790
+ //# sourceMappingURL=chunk-7J47WT5V.js.map