@sonordev/site-kit 3.0.2 → 3.0.4

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 (70) hide show
  1. package/dist/AnalyticsProvider-MLT26JRP.mjs +6 -0
  2. package/dist/{AnalyticsProvider-UKF7ESSP.mjs.map → AnalyticsProvider-MLT26JRP.mjs.map} +1 -1
  3. package/dist/AnalyticsProvider-WTOGN7LV.js +27 -0
  4. package/dist/{AnalyticsProvider-N3RNQXTK.js.map → AnalyticsProvider-WTOGN7LV.js.map} +1 -1
  5. package/dist/analytics/index.d.mts +1 -0
  6. package/dist/analytics/index.d.ts +1 -0
  7. package/dist/analytics/index.js +18 -9
  8. package/dist/analytics/index.mjs +3 -2
  9. package/dist/blog/index.d.mts +2 -2
  10. package/dist/blog/index.d.ts +2 -2
  11. package/dist/blog/index.js +10 -10
  12. package/dist/blog/index.mjs +1 -1
  13. package/dist/blog/server-ui.d.mts +18 -4
  14. package/dist/blog/server-ui.d.ts +18 -4
  15. package/dist/blog/server-ui.js +5 -5
  16. package/dist/blog/server-ui.mjs +1 -1
  17. package/dist/blog/server.d.mts +1 -1
  18. package/dist/blog/server.d.ts +1 -1
  19. package/dist/chunk-3DPXOZAU.mjs +26 -0
  20. package/dist/chunk-3DPXOZAU.mjs.map +1 -0
  21. package/dist/{chunk-7DW4SXNG.js → chunk-3GCEFS73.js} +5 -5
  22. package/dist/{chunk-7DW4SXNG.js.map → chunk-3GCEFS73.js.map} +1 -1
  23. package/dist/{chunk-ZDLBI3XX.mjs → chunk-65SMJBHW.mjs} +7 -2
  24. package/dist/chunk-65SMJBHW.mjs.map +1 -0
  25. package/dist/{chunk-S34XAPW2.mjs → chunk-AN4ATCYQ.mjs} +8 -8
  26. package/dist/chunk-AN4ATCYQ.mjs.map +1 -0
  27. package/dist/{chunk-XIGNKCHQ.js → chunk-EBJ4S5DU.js} +8 -8
  28. package/dist/chunk-EBJ4S5DU.js.map +1 -0
  29. package/dist/{chunk-EKJOYPPV.mjs → chunk-FT5JNCD4.mjs} +23 -7
  30. package/dist/chunk-FT5JNCD4.mjs.map +1 -0
  31. package/dist/chunk-HMFFAUCD.js +30 -0
  32. package/dist/chunk-HMFFAUCD.js.map +1 -0
  33. package/dist/{chunk-PBF2H23N.js → chunk-I5TJIESQ.js} +23 -7
  34. package/dist/chunk-I5TJIESQ.js.map +1 -0
  35. package/dist/{chunk-FLD5R2PT.js → chunk-IBDVZ6BF.js} +7 -2
  36. package/dist/{chunk-FLD5R2PT.js.map → chunk-IBDVZ6BF.js.map} +1 -1
  37. package/dist/{chunk-UZ63S7FE.mjs → chunk-KMZ527EM.mjs} +3 -3
  38. package/dist/{chunk-UZ63S7FE.mjs.map → chunk-KMZ527EM.mjs.map} +1 -1
  39. package/dist/{chunk-GBZHL2IT.js → chunk-NNZDHLXN.js} +3 -3
  40. package/dist/{chunk-GBZHL2IT.js.map → chunk-NNZDHLXN.js.map} +1 -1
  41. package/dist/{chunk-PAYGGILT.mjs → chunk-T4QBSRA4.mjs} +3 -3
  42. package/dist/{chunk-PAYGGILT.mjs.map → chunk-T4QBSRA4.mjs.map} +1 -1
  43. package/dist/client/index.d.mts +2 -0
  44. package/dist/client/index.d.ts +2 -0
  45. package/dist/client/index.js +9 -0
  46. package/dist/client/index.mjs +1 -0
  47. package/dist/commerce/index.js +49 -48
  48. package/dist/commerce/index.mjs +4 -3
  49. package/dist/dispatch-Cto83LLT.d.mts +28 -0
  50. package/dist/dispatch-DRQGcM8K.d.ts +28 -0
  51. package/dist/index.d.mts +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.js +29 -28
  54. package/dist/index.js.map +1 -1
  55. package/dist/index.mjs +4 -3
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/layout/client.js +2 -2
  58. package/dist/layout/client.mjs +1 -1
  59. package/dist/layout/index.js +2 -2
  60. package/dist/layout/index.mjs +1 -1
  61. package/dist/{types-5P5B9RgV.d.mts → types-DYOumpUT.d.mts} +3 -0
  62. package/dist/{types-5P5B9RgV.d.ts → types-DYOumpUT.d.ts} +3 -0
  63. package/package.json +1 -1
  64. package/dist/AnalyticsProvider-N3RNQXTK.js +0 -26
  65. package/dist/AnalyticsProvider-UKF7ESSP.mjs +0 -5
  66. package/dist/chunk-EKJOYPPV.mjs.map +0 -1
  67. package/dist/chunk-PBF2H23N.js.map +0 -1
  68. package/dist/chunk-S34XAPW2.mjs.map +0 -1
  69. package/dist/chunk-XIGNKCHQ.js.map +0 -1
  70. package/dist/chunk-ZDLBI3XX.mjs.map +0 -1
@@ -0,0 +1,6 @@
1
+ export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-65SMJBHW.mjs';
2
+ import './chunk-3DPXOZAU.mjs';
3
+ import './chunk-EE6SFAZP.mjs';
4
+ import './chunk-4XPGGLVP.mjs';
5
+ //# sourceMappingURL=AnalyticsProvider-MLT26JRP.mjs.map
6
+ //# sourceMappingURL=AnalyticsProvider-MLT26JRP.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"AnalyticsProvider-UKF7ESSP.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AnalyticsProvider-MLT26JRP.mjs"}
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var chunkIBDVZ6BF_js = require('./chunk-IBDVZ6BF.js');
4
+ require('./chunk-HMFFAUCD.js');
5
+ require('./chunk-3BNFUMLL.js');
6
+ require('./chunk-ZSMWDLMK.js');
7
+
8
+
9
+
10
+ Object.defineProperty(exports, "AnalyticsProvider", {
11
+ enumerable: true,
12
+ get: function () { return chunkIBDVZ6BF_js.AnalyticsProvider; }
13
+ });
14
+ Object.defineProperty(exports, "useAnalytics", {
15
+ enumerable: true,
16
+ get: function () { return chunkIBDVZ6BF_js.useAnalytics; }
17
+ });
18
+ Object.defineProperty(exports, "useAnalyticsOptional", {
19
+ enumerable: true,
20
+ get: function () { return chunkIBDVZ6BF_js.useAnalyticsOptional; }
21
+ });
22
+ Object.defineProperty(exports, "useTrackEvent", {
23
+ enumerable: true,
24
+ get: function () { return chunkIBDVZ6BF_js.useTrackEvent; }
25
+ });
26
+ //# sourceMappingURL=AnalyticsProvider-WTOGN7LV.js.map
27
+ //# sourceMappingURL=AnalyticsProvider-WTOGN7LV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"AnalyticsProvider-N3RNQXTK.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"AnalyticsProvider-WTOGN7LV.js"}
@@ -2,6 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
3
  import { A as AnalyticsContextValue, T as TrackEventOptions, a as TrackConversionOptions } from '../types-DNSYU7qI.mjs';
4
4
  export { c as AnalyticsConfig, b as AnalyticsEvent, C as Conversion, P as PageView, S as Session, W as WebVitalsData } from '../types-DNSYU7qI.mjs';
5
+ export { a as trackConversion, t as trackEvent } from '../dispatch-Cto83LLT.mjs';
5
6
 
6
7
  interface AnalyticsProviderProps {
7
8
  /**
@@ -2,6 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
3
  import { A as AnalyticsContextValue, T as TrackEventOptions, a as TrackConversionOptions } from '../types-DNSYU7qI.js';
4
4
  export { c as AnalyticsConfig, b as AnalyticsEvent, C as Conversion, P as PageView, S as Session, W as WebVitalsData } from '../types-DNSYU7qI.js';
5
+ export { a as trackConversion, t as trackEvent } from '../dispatch-DRQGcM8K.js';
5
6
 
6
7
  interface AnalyticsProviderProps {
7
8
  /**
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkXIGNKCHQ_js = require('../chunk-XIGNKCHQ.js');
5
- var chunkFLD5R2PT_js = require('../chunk-FLD5R2PT.js');
4
+ var chunkEBJ4S5DU_js = require('../chunk-EBJ4S5DU.js');
5
+ var chunkIBDVZ6BF_js = require('../chunk-IBDVZ6BF.js');
6
+ var chunkHMFFAUCD_js = require('../chunk-HMFFAUCD.js');
6
7
  require('../chunk-3BNFUMLL.js');
7
8
  require('../chunk-ZSMWDLMK.js');
8
9
 
@@ -10,31 +11,39 @@ require('../chunk-ZSMWDLMK.js');
10
11
 
11
12
  Object.defineProperty(exports, "ContactTracking", {
12
13
  enumerable: true,
13
- get: function () { return chunkXIGNKCHQ_js.ContactTracking; }
14
+ get: function () { return chunkEBJ4S5DU_js.ContactTracking; }
14
15
  });
15
16
  Object.defineProperty(exports, "useContactTracking", {
16
17
  enumerable: true,
17
- get: function () { return chunkXIGNKCHQ_js.useContactTracking; }
18
+ get: function () { return chunkEBJ4S5DU_js.useContactTracking; }
18
19
  });
19
20
  Object.defineProperty(exports, "AnalyticsProvider", {
20
21
  enumerable: true,
21
- get: function () { return chunkFLD5R2PT_js.AnalyticsProvider; }
22
+ get: function () { return chunkIBDVZ6BF_js.AnalyticsProvider; }
22
23
  });
23
24
  Object.defineProperty(exports, "WebVitals", {
24
25
  enumerable: true,
25
- get: function () { return chunkFLD5R2PT_js.WebVitals; }
26
+ get: function () { return chunkIBDVZ6BF_js.WebVitals; }
26
27
  });
27
28
  Object.defineProperty(exports, "useAnalytics", {
28
29
  enumerable: true,
29
- get: function () { return chunkFLD5R2PT_js.useAnalytics; }
30
+ get: function () { return chunkIBDVZ6BF_js.useAnalytics; }
30
31
  });
31
32
  Object.defineProperty(exports, "useAnalyticsOptional", {
32
33
  enumerable: true,
33
- get: function () { return chunkFLD5R2PT_js.useAnalyticsOptional; }
34
+ get: function () { return chunkIBDVZ6BF_js.useAnalyticsOptional; }
34
35
  });
35
36
  Object.defineProperty(exports, "useTrackEvent", {
36
37
  enumerable: true,
37
- get: function () { return chunkFLD5R2PT_js.useTrackEvent; }
38
+ get: function () { return chunkIBDVZ6BF_js.useTrackEvent; }
39
+ });
40
+ Object.defineProperty(exports, "trackConversion", {
41
+ enumerable: true,
42
+ get: function () { return chunkHMFFAUCD_js.trackConversion; }
43
+ });
44
+ Object.defineProperty(exports, "trackEvent", {
45
+ enumerable: true,
46
+ get: function () { return chunkHMFFAUCD_js.trackEvent; }
38
47
  });
39
48
  //# sourceMappingURL=index.js.map
40
49
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,7 @@
1
1
  'use client';
2
- export { ContactTracking, useContactTracking } from '../chunk-S34XAPW2.mjs';
3
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-ZDLBI3XX.mjs';
2
+ export { ContactTracking, useContactTracking } from '../chunk-AN4ATCYQ.mjs';
3
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-65SMJBHW.mjs';
4
+ export { trackConversion, trackEvent } from '../chunk-3DPXOZAU.mjs';
4
5
  import '../chunk-EE6SFAZP.mjs';
5
6
  import '../chunk-4XPGGLVP.mjs';
6
7
  //# sourceMappingURL=index.mjs.map
@@ -1,8 +1,8 @@
1
1
  export { BlogList, BlogListServerProps, BlogListStyles, BlogPost, BlogPostServerProps, BlogPostStyles, ClusterLandingPage, ClusterLandingPageProps, ClusterNavigation, ClusterNavigationProps } from './server-ui.mjs';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import React__default from 'react';
4
- import { A as AuthorCardProps, c as AuthorPageProps, B as BlogPost, d as TableOfContentsProps } from '../types-5P5B9RgV.mjs';
5
- export { m as BlogAnalytics, a as BlogAuthor, b as BlogCategory, f as BlogListOptions, j as BlogListProps, k as BlogListRenderProps, g as BlogListResult, h as BlogPostProps, i as BlogPostRenderProps, e as BlogTag, R as RelatedPostsProps, l as TocItem, T as TopicCluster } from '../types-5P5B9RgV.mjs';
4
+ import { A as AuthorCardProps, c as AuthorPageProps, B as BlogPost, d as TableOfContentsProps } from '../types-DYOumpUT.mjs';
5
+ export { m as BlogAnalytics, a as BlogAuthor, b as BlogCategory, f as BlogListOptions, j as BlogListProps, k as BlogListRenderProps, g as BlogListResult, h as BlogPostProps, i as BlogPostRenderProps, e as BlogTag, R as RelatedPostsProps, l as TocItem, T as TopicCluster } from '../types-DYOumpUT.mjs';
6
6
 
7
7
  interface BlogSidebarProps {
8
8
  /** Portal API URL */
@@ -1,8 +1,8 @@
1
1
  export { BlogList, BlogListServerProps, BlogListStyles, BlogPost, BlogPostServerProps, BlogPostStyles, ClusterLandingPage, ClusterLandingPageProps, ClusterNavigation, ClusterNavigationProps } from './server-ui.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import React__default from 'react';
4
- import { A as AuthorCardProps, c as AuthorPageProps, B as BlogPost, d as TableOfContentsProps } from '../types-5P5B9RgV.js';
5
- export { m as BlogAnalytics, a as BlogAuthor, b as BlogCategory, f as BlogListOptions, j as BlogListProps, k as BlogListRenderProps, g as BlogListResult, h as BlogPostProps, i as BlogPostRenderProps, e as BlogTag, R as RelatedPostsProps, l as TocItem, T as TopicCluster } from '../types-5P5B9RgV.js';
4
+ import { A as AuthorCardProps, c as AuthorPageProps, B as BlogPost, d as TableOfContentsProps } from '../types-DYOumpUT.js';
5
+ export { m as BlogAnalytics, a as BlogAuthor, b as BlogCategory, f as BlogListOptions, j as BlogListProps, k as BlogListRenderProps, g as BlogListResult, h as BlogPostProps, i as BlogPostRenderProps, e as BlogTag, R as RelatedPostsProps, l as TocItem, T as TopicCluster } from '../types-DYOumpUT.js';
6
6
 
7
7
  interface BlogSidebarProps {
8
8
  /** Portal API URL */
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkUJQYSVYV_js = require('../chunk-UJQYSVYV.js');
5
- var chunkPBF2H23N_js = require('../chunk-PBF2H23N.js');
5
+ var chunkI5TJIESQ_js = require('../chunk-I5TJIESQ.js');
6
6
  var chunkIB4FRJDV_js = require('../chunk-IB4FRJDV.js');
7
7
  var chunkJ7QI3GDX_js = require('../chunk-J7QI3GDX.js');
8
8
  require('../chunk-ZSMWDLMK.js');
@@ -884,39 +884,39 @@ Object.defineProperty(exports, "BlogFAQ", {
884
884
  });
885
885
  Object.defineProperty(exports, "BlogList", {
886
886
  enumerable: true,
887
- get: function () { return chunkPBF2H23N_js.BlogList; }
887
+ get: function () { return chunkI5TJIESQ_js.BlogList; }
888
888
  });
889
889
  Object.defineProperty(exports, "BlogPost", {
890
890
  enumerable: true,
891
- get: function () { return chunkPBF2H23N_js.BlogPost; }
891
+ get: function () { return chunkI5TJIESQ_js.BlogPost; }
892
892
  });
893
893
  Object.defineProperty(exports, "ClusterLandingPage", {
894
894
  enumerable: true,
895
- get: function () { return chunkPBF2H23N_js.ClusterLandingPage; }
895
+ get: function () { return chunkI5TJIESQ_js.ClusterLandingPage; }
896
896
  });
897
897
  Object.defineProperty(exports, "ClusterNavigation", {
898
898
  enumerable: true,
899
- get: function () { return chunkPBF2H23N_js.ClusterNavigation; }
899
+ get: function () { return chunkI5TJIESQ_js.ClusterNavigation; }
900
900
  });
901
901
  Object.defineProperty(exports, "ServiceCallout", {
902
902
  enumerable: true,
903
- get: function () { return chunkPBF2H23N_js.ServiceCallout; }
903
+ get: function () { return chunkI5TJIESQ_js.ServiceCallout; }
904
904
  });
905
905
  Object.defineProperty(exports, "ServiceCallouts", {
906
906
  enumerable: true,
907
- get: function () { return chunkPBF2H23N_js.ServiceCallouts; }
907
+ get: function () { return chunkI5TJIESQ_js.ServiceCallouts; }
908
908
  });
909
909
  Object.defineProperty(exports, "addExternalLinkTargets", {
910
910
  enumerable: true,
911
- get: function () { return chunkPBF2H23N_js.addExternalLinkTargets; }
911
+ get: function () { return chunkI5TJIESQ_js.addExternalLinkTargets; }
912
912
  });
913
913
  Object.defineProperty(exports, "normalizeSiteHost", {
914
914
  enumerable: true,
915
- get: function () { return chunkPBF2H23N_js.normalizeSiteHost; }
915
+ get: function () { return chunkI5TJIESQ_js.normalizeSiteHost; }
916
916
  });
917
917
  Object.defineProperty(exports, "resolveBlogSiteUrl", {
918
918
  enumerable: true,
919
- get: function () { return chunkPBF2H23N_js.resolveBlogSiteUrl; }
919
+ get: function () { return chunkI5TJIESQ_js.resolveBlogSiteUrl; }
920
920
  });
921
921
  exports.AuthorCard = AuthorCard;
922
922
  exports.AuthorPage = AuthorPage;
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  export { BlogFAQ } from '../chunk-PST3NOEM.mjs';
3
- export { BlogList, BlogPost, ClusterLandingPage, ClusterNavigation, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl } from '../chunk-EKJOYPPV.mjs';
3
+ export { BlogList, BlogPost, ClusterLandingPage, ClusterNavigation, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl } from '../chunk-FT5JNCD4.mjs';
4
4
  import { generateAuthorSchema } from '../chunk-SH4VZDVX.mjs';
5
5
  import { safeJsonLd } from '../chunk-662YHKWW.mjs';
6
6
  import '../chunk-4XPGGLVP.mjs';
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
- import { B as BlogPost$1, l as TocItem, g as BlogListResult, b as BlogCategory, C as ClusterNavigation$1, T as TopicCluster } from '../types-5P5B9RgV.mjs';
3
+ import { B as BlogPost$1, l as TocItem, g as BlogListResult, b as BlogCategory, C as ClusterNavigation$1, T as TopicCluster } from '../types-DYOumpUT.mjs';
4
4
 
5
5
  interface BlogPostStyles {
6
6
  article?: string;
@@ -113,20 +113,34 @@ interface ClusterNavigationProps {
113
113
  navigation: ClusterNavigation$1;
114
114
  /** Base path for blog URLs (default: /blog) */
115
115
  basePath?: string;
116
- /** Category slug for URL building (optional) */
116
+ /**
117
+ * Fallback category slug for URL building (optional). Each linked article's
118
+ * OWN category takes precedence when present — applying one category to
119
+ * every sibling produced wrong-category URLs (duplicate content / redirect
120
+ * chains) on category-segmented sites whenever a cluster spans categories.
121
+ */
117
122
  category?: string;
123
+ /** Append a trailing slash to article URLs (only for trailingSlash sites) */
124
+ trailingSlash?: boolean;
118
125
  /** Disable default styles */
119
126
  unstyled?: boolean;
120
127
  /** Custom class name */
121
128
  className?: string;
122
129
  }
123
- declare function ClusterNavigation({ navigation, basePath, category, unstyled, className, }: ClusterNavigationProps): react_jsx_runtime.JSX.Element | null;
130
+ declare function ClusterNavigation({ navigation, basePath, category, trailingSlash, unstyled, className, }: ClusterNavigationProps): react_jsx_runtime.JSX.Element | null;
124
131
 
125
132
  interface ClusterLandingPageProps {
126
133
  /** Cluster slug to fetch */
127
134
  slug: string;
128
135
  /** Base path for blog URLs (default: /blog) */
129
136
  basePath?: string;
137
+ /**
138
+ * Include each article's own category segment in its URL:
139
+ * {basePath}/{category}/{slug}. Enable on sites whose blog routes are
140
+ * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —
141
+ * without it, links point at {basePath}/{slug} and 404 on such sites.
142
+ */
143
+ categoryInPath?: boolean;
130
144
  /** Disable default styles */
131
145
  unstyled?: boolean;
132
146
  /** Custom class name */
@@ -136,6 +150,6 @@ interface ClusterLandingPageProps {
136
150
  cluster: TopicCluster;
137
151
  }) => React__default.ReactNode;
138
152
  }
139
- declare function ClusterLandingPage({ slug, basePath, unstyled, className, children, }: ClusterLandingPageProps): Promise<string | number | bigint | boolean | Iterable<React__default.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined>;
153
+ declare function ClusterLandingPage({ slug, basePath, categoryInPath, unstyled, className, children, }: ClusterLandingPageProps): Promise<string | number | bigint | boolean | Iterable<React__default.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined>;
140
154
 
141
155
  export { BlogList, type BlogListServerProps, type BlogListStyles, BlogPost, type BlogPostServerProps, type BlogPostStyles, ClusterLandingPage, type ClusterLandingPageProps, ClusterNavigation, type ClusterNavigationProps };
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React__default from 'react';
3
- import { B as BlogPost$1, l as TocItem, g as BlogListResult, b as BlogCategory, C as ClusterNavigation$1, T as TopicCluster } from '../types-5P5B9RgV.js';
3
+ import { B as BlogPost$1, l as TocItem, g as BlogListResult, b as BlogCategory, C as ClusterNavigation$1, T as TopicCluster } from '../types-DYOumpUT.js';
4
4
 
5
5
  interface BlogPostStyles {
6
6
  article?: string;
@@ -113,20 +113,34 @@ interface ClusterNavigationProps {
113
113
  navigation: ClusterNavigation$1;
114
114
  /** Base path for blog URLs (default: /blog) */
115
115
  basePath?: string;
116
- /** Category slug for URL building (optional) */
116
+ /**
117
+ * Fallback category slug for URL building (optional). Each linked article's
118
+ * OWN category takes precedence when present — applying one category to
119
+ * every sibling produced wrong-category URLs (duplicate content / redirect
120
+ * chains) on category-segmented sites whenever a cluster spans categories.
121
+ */
117
122
  category?: string;
123
+ /** Append a trailing slash to article URLs (only for trailingSlash sites) */
124
+ trailingSlash?: boolean;
118
125
  /** Disable default styles */
119
126
  unstyled?: boolean;
120
127
  /** Custom class name */
121
128
  className?: string;
122
129
  }
123
- declare function ClusterNavigation({ navigation, basePath, category, unstyled, className, }: ClusterNavigationProps): react_jsx_runtime.JSX.Element | null;
130
+ declare function ClusterNavigation({ navigation, basePath, category, trailingSlash, unstyled, className, }: ClusterNavigationProps): react_jsx_runtime.JSX.Element | null;
124
131
 
125
132
  interface ClusterLandingPageProps {
126
133
  /** Cluster slug to fetch */
127
134
  slug: string;
128
135
  /** Base path for blog URLs (default: /blog) */
129
136
  basePath?: string;
137
+ /**
138
+ * Include each article's own category segment in its URL:
139
+ * {basePath}/{category}/{slug}. Enable on sites whose blog routes are
140
+ * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —
141
+ * without it, links point at {basePath}/{slug} and 404 on such sites.
142
+ */
143
+ categoryInPath?: boolean;
130
144
  /** Disable default styles */
131
145
  unstyled?: boolean;
132
146
  /** Custom class name */
@@ -136,6 +150,6 @@ interface ClusterLandingPageProps {
136
150
  cluster: TopicCluster;
137
151
  }) => React__default.ReactNode;
138
152
  }
139
- declare function ClusterLandingPage({ slug, basePath, unstyled, className, children, }: ClusterLandingPageProps): Promise<string | number | bigint | boolean | Iterable<React__default.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined>;
153
+ declare function ClusterLandingPage({ slug, basePath, categoryInPath, unstyled, className, children, }: ClusterLandingPageProps): Promise<string | number | bigint | boolean | Iterable<React__default.ReactNode> | react_jsx_runtime.JSX.Element | null | undefined>;
140
154
 
141
155
  export { BlogList, type BlogListServerProps, type BlogListStyles, BlogPost, type BlogPostServerProps, type BlogPostStyles, ClusterLandingPage, type ClusterLandingPageProps, ClusterNavigation, type ClusterNavigationProps };
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkPBF2H23N_js = require('../chunk-PBF2H23N.js');
3
+ var chunkI5TJIESQ_js = require('../chunk-I5TJIESQ.js');
4
4
  require('../chunk-IB4FRJDV.js');
5
5
  require('../chunk-ZSMWDLMK.js');
6
6
 
@@ -8,19 +8,19 @@ require('../chunk-ZSMWDLMK.js');
8
8
 
9
9
  Object.defineProperty(exports, "BlogList", {
10
10
  enumerable: true,
11
- get: function () { return chunkPBF2H23N_js.BlogList; }
11
+ get: function () { return chunkI5TJIESQ_js.BlogList; }
12
12
  });
13
13
  Object.defineProperty(exports, "BlogPost", {
14
14
  enumerable: true,
15
- get: function () { return chunkPBF2H23N_js.BlogPost; }
15
+ get: function () { return chunkI5TJIESQ_js.BlogPost; }
16
16
  });
17
17
  Object.defineProperty(exports, "ClusterLandingPage", {
18
18
  enumerable: true,
19
- get: function () { return chunkPBF2H23N_js.ClusterLandingPage; }
19
+ get: function () { return chunkI5TJIESQ_js.ClusterLandingPage; }
20
20
  });
21
21
  Object.defineProperty(exports, "ClusterNavigation", {
22
22
  enumerable: true,
23
- get: function () { return chunkPBF2H23N_js.ClusterNavigation; }
23
+ get: function () { return chunkI5TJIESQ_js.ClusterNavigation; }
24
24
  });
25
25
  //# sourceMappingURL=server-ui.js.map
26
26
  //# sourceMappingURL=server-ui.js.map
@@ -1,4 +1,4 @@
1
- export { BlogList, BlogPost, ClusterLandingPage, ClusterNavigation } from '../chunk-EKJOYPPV.mjs';
1
+ export { BlogList, BlogPost, ClusterLandingPage, ClusterNavigation } from '../chunk-FT5JNCD4.mjs';
2
2
  import '../chunk-SH4VZDVX.mjs';
3
3
  import '../chunk-4XPGGLVP.mjs';
4
4
  //# sourceMappingURL=server-ui.mjs.map
@@ -1,5 +1,5 @@
1
1
  import { Metadata } from 'next';
2
- import { B as BlogPost, T as TopicCluster, C as ClusterNavigation, a as BlogAuthor } from '../types-5P5B9RgV.mjs';
2
+ import { B as BlogPost, T as TopicCluster, C as ClusterNavigation, a as BlogAuthor } from '../types-DYOumpUT.mjs';
3
3
 
4
4
  /**
5
5
  * @sonordev/site-kit/blog/server
@@ -1,5 +1,5 @@
1
1
  import { Metadata } from 'next';
2
- import { B as BlogPost, T as TopicCluster, C as ClusterNavigation, a as BlogAuthor } from '../types-5P5B9RgV.js';
2
+ import { B as BlogPost, T as TopicCluster, C as ClusterNavigation, a as BlogAuthor } from '../types-DYOumpUT.js';
3
3
 
4
4
  /**
5
5
  * @sonordev/site-kit/blog/server
@@ -0,0 +1,26 @@
1
+ // src/analytics/dispatch.ts
2
+ var MAX_QUEUE = 50;
3
+ var dispatcher = null;
4
+ var queue = [];
5
+ function registerAnalyticsDispatcher(next) {
6
+ dispatcher = next;
7
+ if (!next) return;
8
+ const pending = queue;
9
+ queue = [];
10
+ for (const call of pending) {
11
+ if (call.kind === "event") next.trackEvent(call.options);
12
+ else next.trackConversion(call.options);
13
+ }
14
+ }
15
+ function trackEvent(options) {
16
+ if (dispatcher) dispatcher.trackEvent(options);
17
+ else if (queue.length < MAX_QUEUE) queue.push({ kind: "event", options });
18
+ }
19
+ function trackConversion(options) {
20
+ if (dispatcher) dispatcher.trackConversion(options);
21
+ else if (queue.length < MAX_QUEUE) queue.push({ kind: "conversion", options });
22
+ }
23
+
24
+ export { registerAnalyticsDispatcher, trackConversion, trackEvent };
25
+ //# sourceMappingURL=chunk-3DPXOZAU.mjs.map
26
+ //# sourceMappingURL=chunk-3DPXOZAU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/analytics/dispatch.ts"],"names":[],"mappings":";AA4BA,IAAM,SAAA,GAAY,EAAA;AAElB,IAAI,UAAA,GAAyC,IAAA;AAC7C,IAAI,QAAsB,EAAC;AAMpB,SAAS,4BAA4B,IAAA,EAAwC;AAClF,EAAA,UAAA,GAAa,IAAA;AACb,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,KAAA,GAAQ,EAAC;AACT,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,KAAK,IAAA,KAAS,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,SAClD,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA,EACxC;AACF;AAOO,SAAS,WAAW,OAAA,EAAkC;AAC3D,EAAA,IAAI,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,OAAA,IACpC,KAAA,CAAM,SAAS,SAAA,EAAW,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,CAAA;AAC1E;AAGO,SAAS,gBAAgB,OAAA,EAAuC;AACrE,EAAA,IAAI,UAAA,EAAY,UAAA,CAAW,eAAA,CAAgB,OAAO,CAAA;AAAA,OAAA,IACzC,KAAA,CAAM,SAAS,SAAA,EAAW,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,CAAA;AAC/E","file":"chunk-3DPXOZAU.mjs","sourcesContent":["/**\n * @sonordev/site-kit — standalone analytics dispatch bridge\n *\n * The analytics API is hook-based (useAnalytics), which requires living\n * inside <AnalyticsProvider>. But the house perf pattern mounts the provider\n * as a childless deferred SIBLING of the page tree (see DeferredAnalytics on\n * reference sites), so page components — and sibling packages like\n * @sonordev/agency-site-kit — can never reach the context.\n *\n * This module is the bridge: AnalyticsProvider registers its trackEvent /\n * trackConversion here on mount (single source of payload construction — do\n * NOT re-implement the POST anywhere else), and the standalone functions\n * below queue until it does. If the provider never mounts, calls no-op after\n * the queue cap — tracking must never break a page.\n */\n\nimport type { TrackEventOptions, TrackConversionOptions } from './types'\n\ninterface AnalyticsDispatcher {\n trackEvent: (options: TrackEventOptions) => void\n trackConversion: (options: TrackConversionOptions) => void\n}\n\ntype QueuedCall =\n | { kind: 'event'; options: TrackEventOptions }\n | { kind: 'conversion'; options: TrackConversionOptions }\n\n/** Pre-mount buffer — bounded so a page without analytics can't grow it forever. */\nconst MAX_QUEUE = 50\n\nlet dispatcher: AnalyticsDispatcher | null = null\nlet queue: QueuedCall[] = []\n\n/**\n * Called by AnalyticsProvider on mount/unmount. Flushes anything queued\n * before the (idle-deferred) provider arrived.\n */\nexport function registerAnalyticsDispatcher(next: AnalyticsDispatcher | null): void {\n dispatcher = next\n if (!next) return\n const pending = queue\n queue = []\n for (const call of pending) {\n if (call.kind === 'event') next.trackEvent(call.options)\n else next.trackConversion(call.options)\n }\n}\n\n/**\n * Track a custom analytics event from anywhere client-side — no provider\n * context needed. Queues until AnalyticsProvider mounts; no-ops (bounded)\n * if it never does.\n */\nexport function trackEvent(options: TrackEventOptions): void {\n if (dispatcher) dispatcher.trackEvent(options)\n else if (queue.length < MAX_QUEUE) queue.push({ kind: 'event', options })\n}\n\n/** Conversion twin of {@link trackEvent}. */\nexport function trackConversion(options: TrackConversionOptions): void {\n if (dispatcher) dispatcher.trackConversion(options)\n else if (queue.length < MAX_QUEUE) queue.push({ kind: 'conversion', options })\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkFLD5R2PT_js = require('./chunk-FLD5R2PT.js');
4
+ var chunkIBDVZ6BF_js = require('./chunk-IBDVZ6BF.js');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var React5 = require('react');
7
7
 
@@ -3107,7 +3107,7 @@ function ProductDetail({
3107
3107
  const [checkoutError, setCheckoutError] = React5.useState(null);
3108
3108
  const [showStickyBar, setShowStickyBar] = React5.useState(false);
3109
3109
  const buyButtonRef = React5.useRef(null);
3110
- const analytics = chunkFLD5R2PT_js.useAnalyticsOptional();
3110
+ const analytics = chunkIBDVZ6BF_js.useAnalyticsOptional();
3111
3111
  React5.useEffect(() => {
3112
3112
  if (propProduct) {
3113
3113
  setProduct(propProduct);
@@ -4478,7 +4478,7 @@ function CheckoutForm({
4478
4478
  const [discountResult, setDiscountResult] = React5.useState(null);
4479
4479
  const [applyingDiscount, setApplyingDiscount] = React5.useState(false);
4480
4480
  const isProduct = offering.type === "product";
4481
- const analytics = chunkFLD5R2PT_js.useAnalyticsOptional();
4481
+ const analytics = chunkIBDVZ6BF_js.useAnalyticsOptional();
4482
4482
  React5.useEffect(() => {
4483
4483
  fetchProcessorConfig().then((config) => {
4484
4484
  if (config?.processor) setProcessor(config.processor);
@@ -7809,5 +7809,5 @@ exports.registerForEvent = registerForEvent;
7809
7809
  exports.useEventModal = useEventModal;
7810
7810
  exports.validateAddress = validateAddress;
7811
7811
  exports.validateDiscountCode = validateDiscountCode;
7812
- //# sourceMappingURL=chunk-7DW4SXNG.js.map
7813
- //# sourceMappingURL=chunk-7DW4SXNG.js.map
7812
+ //# sourceMappingURL=chunk-3GCEFS73.js.map
7813
+ //# sourceMappingURL=chunk-3GCEFS73.js.map