@sonordev/site-kit 2.2.8 → 2.5.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 (132) hide show
  1. package/dist/SitemapSync-3ISOAVDT.mjs +4 -0
  2. package/dist/{SitemapSync-XGKC63TH.mjs.map → SitemapSync-3ISOAVDT.mjs.map} +1 -1
  3. package/dist/SitemapSync-4Y65CMUK.js +13 -0
  4. package/dist/{SitemapSync-TPA3GTGU.js.map → SitemapSync-4Y65CMUK.js.map} +1 -1
  5. package/dist/blog/index.d.mts +31 -3
  6. package/dist/blog/index.d.ts +31 -3
  7. package/dist/blog/index.js +194 -10
  8. package/dist/blog/index.js.map +1 -1
  9. package/dist/blog/index.mjs +183 -4
  10. package/dist/blog/index.mjs.map +1 -1
  11. package/dist/blog/server-ui.d.mts +1 -1
  12. package/dist/blog/server-ui.d.ts +1 -1
  13. package/dist/blog/server-ui.js +3 -3
  14. package/dist/blog/server-ui.mjs +1 -1
  15. package/dist/blog/server.d.mts +79 -7
  16. package/dist/blog/server.d.ts +79 -7
  17. package/dist/blog/server.js +64 -32
  18. package/dist/blog/server.mjs +1 -1
  19. package/dist/{chunk-WRCX2NKY.mjs → chunk-2NM6RGAV.mjs} +226 -22
  20. package/dist/chunk-2NM6RGAV.mjs.map +1 -0
  21. package/dist/chunk-5B4FABFK.js +28 -0
  22. package/dist/chunk-5B4FABFK.js.map +1 -0
  23. package/dist/{chunk-DTVZJPVM.mjs → chunk-5SQ4NRPH.mjs} +9 -2
  24. package/dist/chunk-5SQ4NRPH.mjs.map +1 -0
  25. package/dist/chunk-ATG4FJY6.js +76 -0
  26. package/dist/chunk-ATG4FJY6.js.map +1 -0
  27. package/dist/{chunk-F4VAOBJM.mjs → chunk-DV2BURIN.mjs} +3 -3
  28. package/dist/{chunk-F4VAOBJM.mjs.map → chunk-DV2BURIN.mjs.map} +1 -1
  29. package/dist/{chunk-GQKBGL2W.js → chunk-DZKX3GHL.js} +233 -21
  30. package/dist/chunk-DZKX3GHL.js.map +1 -0
  31. package/dist/{chunk-LNMI6OMN.js → chunk-F54HGPDM.js} +137 -4
  32. package/dist/chunk-F54HGPDM.js.map +1 -0
  33. package/dist/{chunk-DPO3ZPFK.js → chunk-GVDPTXN3.js} +3 -3
  34. package/dist/{chunk-DPO3ZPFK.js.map → chunk-GVDPTXN3.js.map} +1 -1
  35. package/dist/chunk-H23ZT2I2.mjs +67 -0
  36. package/dist/chunk-H23ZT2I2.mjs.map +1 -0
  37. package/dist/chunk-H4OBGC43.mjs +26 -0
  38. package/dist/chunk-H4OBGC43.mjs.map +1 -0
  39. package/dist/{chunk-UHMM22HX.js → chunk-JNXQX2R6.js} +7 -3
  40. package/dist/chunk-JNXQX2R6.js.map +1 -0
  41. package/dist/{chunk-Z6EHHJWU.mjs → chunk-MNOVPHL6.mjs} +230 -35
  42. package/dist/chunk-MNOVPHL6.mjs.map +1 -0
  43. package/dist/{chunk-ITPVKQB6.js → chunk-MWE2HRPU.js} +229 -34
  44. package/dist/chunk-MWE2HRPU.js.map +1 -0
  45. package/dist/{chunk-AWMEH65F.js → chunk-PAF5IGGF.js} +9 -2
  46. package/dist/chunk-PAF5IGGF.js.map +1 -0
  47. package/dist/{chunk-OOZCN7AF.mjs → chunk-T5UU7I4V.mjs} +137 -5
  48. package/dist/chunk-T5UU7I4V.mjs.map +1 -0
  49. package/dist/{chunk-PU5ULVL5.mjs → chunk-ZUCVEQZB.mjs} +7 -3
  50. package/dist/chunk-ZUCVEQZB.mjs.map +1 -0
  51. package/dist/cli/index.js +352 -78
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/cli/index.mjs +352 -78
  54. package/dist/cli/index.mjs.map +1 -1
  55. package/dist/config/index.d.mts +17 -0
  56. package/dist/config/index.d.ts +17 -0
  57. package/dist/config/index.js +43 -3
  58. package/dist/config/index.js.map +1 -1
  59. package/dist/config/index.mjs +43 -3
  60. package/dist/config/index.mjs.map +1 -1
  61. package/dist/forms/index.js +3 -1
  62. package/dist/forms/index.js.map +1 -1
  63. package/dist/forms/index.mjs +3 -1
  64. package/dist/forms/index.mjs.map +1 -1
  65. package/dist/index.d.mts +2 -2
  66. package/dist/index.d.ts +2 -2
  67. package/dist/layout/client.js +2 -2
  68. package/dist/layout/client.mjs +1 -1
  69. package/dist/layout/index.d.mts +6 -1
  70. package/dist/layout/index.d.ts +6 -1
  71. package/dist/layout/index.js +9 -5
  72. package/dist/layout/index.js.map +1 -1
  73. package/dist/layout/index.mjs +8 -4
  74. package/dist/layout/index.mjs.map +1 -1
  75. package/dist/llms/contract.d.mts +43 -0
  76. package/dist/llms/contract.d.ts +43 -0
  77. package/dist/llms/contract.js +41 -0
  78. package/dist/llms/contract.js.map +1 -0
  79. package/dist/llms/contract.mjs +4 -0
  80. package/dist/llms/contract.mjs.map +1 -0
  81. package/dist/llms/index.d.mts +67 -5
  82. package/dist/llms/index.d.ts +67 -5
  83. package/dist/llms/index.js +154 -36
  84. package/dist/llms/index.js.map +1 -1
  85. package/dist/llms/index.mjs +107 -27
  86. package/dist/llms/index.mjs.map +1 -1
  87. package/dist/middleware/index.d.mts +13 -1
  88. package/dist/middleware/index.d.ts +13 -1
  89. package/dist/middleware/index.js +11 -0
  90. package/dist/middleware/index.js.map +1 -1
  91. package/dist/middleware/index.mjs +11 -0
  92. package/dist/middleware/index.mjs.map +1 -1
  93. package/dist/{routing-ccNYbFLU.d.ts → routing-C7gmHWm9.d.ts} +1 -1
  94. package/dist/{routing-ebQln7wH.d.mts → routing-trNzR1Pz.d.mts} +1 -1
  95. package/dist/seo/client.js +2 -2
  96. package/dist/seo/client.mjs +1 -1
  97. package/dist/seo/index.d.mts +19 -4
  98. package/dist/seo/index.d.ts +19 -4
  99. package/dist/seo/index.js +51 -16
  100. package/dist/seo/index.js.map +1 -1
  101. package/dist/seo/index.mjs +43 -9
  102. package/dist/seo/index.mjs.map +1 -1
  103. package/dist/seo/server.d.mts +2 -2
  104. package/dist/seo/server.d.ts +2 -2
  105. package/dist/seo/server.js +5 -5
  106. package/dist/seo/server.mjs +1 -1
  107. package/dist/sitemap/index.d.mts +8 -1
  108. package/dist/sitemap/index.d.ts +8 -1
  109. package/dist/sitemap/index.js +35 -11
  110. package/dist/sitemap/index.js.map +1 -1
  111. package/dist/sitemap/index.mjs +34 -10
  112. package/dist/sitemap/index.mjs.map +1 -1
  113. package/dist/{types-BxzT7yhf.d.ts → types-0NuBL1Gg.d.ts} +34 -0
  114. package/dist/{types-DWMpAtGy.d.mts → types-5P5B9RgV.d.mts} +57 -1
  115. package/dist/{types-DWMpAtGy.d.ts → types-5P5B9RgV.d.ts} +57 -1
  116. package/dist/{types-CGkyylOa.d.mts → types-DYyIAgQg.d.mts} +2 -0
  117. package/dist/{types-CGkyylOa.d.ts → types-DYyIAgQg.d.ts} +2 -0
  118. package/dist/{types-BxzT7yhf.d.mts → types-J7Z_FqmV.d.mts} +34 -0
  119. package/package.json +15 -1
  120. package/scripts/postinstall.cjs +67 -0
  121. package/dist/SitemapSync-TPA3GTGU.js +0 -13
  122. package/dist/SitemapSync-XGKC63TH.mjs +0 -4
  123. package/dist/chunk-AWMEH65F.js.map +0 -1
  124. package/dist/chunk-DTVZJPVM.mjs.map +0 -1
  125. package/dist/chunk-GQKBGL2W.js.map +0 -1
  126. package/dist/chunk-ITPVKQB6.js.map +0 -1
  127. package/dist/chunk-LNMI6OMN.js.map +0 -1
  128. package/dist/chunk-OOZCN7AF.mjs.map +0 -1
  129. package/dist/chunk-PU5ULVL5.mjs.map +0 -1
  130. package/dist/chunk-UHMM22HX.js.map +0 -1
  131. package/dist/chunk-WRCX2NKY.mjs.map +0 -1
  132. package/dist/chunk-Z6EHHJWU.mjs.map +0 -1
@@ -0,0 +1,4 @@
1
+ export { SitemapSync } from './chunk-ZUCVEQZB.mjs';
2
+ import './chunk-4XPGGLVP.mjs';
3
+ //# sourceMappingURL=SitemapSync-3ISOAVDT.mjs.map
4
+ //# sourceMappingURL=SitemapSync-3ISOAVDT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"SitemapSync-XGKC63TH.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"SitemapSync-3ISOAVDT.mjs"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var chunkJNXQX2R6_js = require('./chunk-JNXQX2R6.js');
4
+ require('./chunk-ZSMWDLMK.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "SitemapSync", {
9
+ enumerable: true,
10
+ get: function () { return chunkJNXQX2R6_js.SitemapSync; }
11
+ });
12
+ //# sourceMappingURL=SitemapSync-4Y65CMUK.js.map
13
+ //# sourceMappingURL=SitemapSync-4Y65CMUK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"SitemapSync-TPA3GTGU.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"SitemapSync-4Y65CMUK.js"}
@@ -1,8 +1,8 @@
1
1
  export { BlogList, BlogListServerProps, BlogListStyles, BlogPost, BlogPostServerProps, BlogPostStyles } 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, T as TableOfContentsProps } from '../types-DWMpAtGy.mjs';
5
- export { l as BlogAnalytics, a as BlogAuthor, b as BlogCategory, e as BlogListOptions, i as BlogListProps, j as BlogListRenderProps, f as BlogListResult, g as BlogPostProps, h as BlogPostRenderProps, d as BlogTag, R as RelatedPostsProps, k as TocItem } from '../types-DWMpAtGy.mjs';
4
+ import { A as AuthorCardProps, c as AuthorPageProps, B as BlogPost, d as TableOfContentsProps, C as ClusterNavigation$1, T as TopicCluster } 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 } from '../types-5P5B9RgV.mjs';
6
6
 
7
7
  interface BlogSidebarProps {
8
8
  /** Portal API URL */
@@ -206,6 +206,34 @@ interface BlogFAQProps {
206
206
  }
207
207
  declare function BlogFAQ({ items, title, allowMultiple, styles, unstyled, }: BlogFAQProps): react_jsx_runtime.JSX.Element | null;
208
208
 
209
+ interface ClusterNavigationProps {
210
+ /** Cluster navigation data (from getClusterNavigation) */
211
+ navigation: ClusterNavigation$1;
212
+ /** Base path for blog URLs (default: /blog) */
213
+ basePath?: string;
214
+ /** Disable default styles */
215
+ unstyled?: boolean;
216
+ /** Custom class name */
217
+ className?: string;
218
+ }
219
+ declare function ClusterNavigation({ navigation, basePath, unstyled, className, }: ClusterNavigationProps): react_jsx_runtime.JSX.Element | null;
220
+
221
+ interface ClusterLandingPageProps {
222
+ /** Cluster slug to fetch */
223
+ slug: string;
224
+ /** Base path for blog URLs (default: /blog) */
225
+ basePath?: string;
226
+ /** Disable default styles */
227
+ unstyled?: boolean;
228
+ /** Custom class name */
229
+ className?: string;
230
+ /** Render prop for full data access */
231
+ children?: (props: {
232
+ cluster: TopicCluster;
233
+ }) => React__default.ReactNode;
234
+ }
235
+ 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>;
236
+
209
237
  /**
210
238
  * Post-process Portal/blog HTML for safe, consistent link behavior.
211
239
  * Server-safe string transforms only (no DOM).
@@ -224,4 +252,4 @@ declare function resolveBlogSiteUrl(explicit?: string): string;
224
252
  */
225
253
  declare function addExternalLinkTargets(html: string, siteUrl: string): string;
226
254
 
227
- export { AuthorCard, AuthorCardProps, AuthorPage, AuthorPageProps, BlogFAQ, type BlogFAQProps, BlogLayout, type BlogLayoutProps, BlogPage, type BlogPageProps, BlogPostPage, type BlogPostPageProps, BlogSidebar, type BlogSidebarProps, CategoryPage, type CategoryPageProps, type FaqItem, NewsletterWidget, type NewsletterWidgetProps, RelatedPosts, ServiceCallout, type ServiceCalloutProps, ServiceCallouts, TableOfContents, TableOfContentsProps, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl };
255
+ export { AuthorCard, AuthorCardProps, AuthorPage, AuthorPageProps, BlogFAQ, type BlogFAQProps, BlogLayout, type BlogLayoutProps, BlogPage, type BlogPageProps, BlogPostPage, type BlogPostPageProps, BlogSidebar, type BlogSidebarProps, CategoryPage, type CategoryPageProps, ClusterLandingPage, type ClusterLandingPageProps, ClusterNavigation, type ClusterNavigationProps, type FaqItem, NewsletterWidget, type NewsletterWidgetProps, RelatedPosts, ServiceCallout, type ServiceCalloutProps, ServiceCallouts, TableOfContents, TableOfContentsProps, TopicCluster, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl };
@@ -1,8 +1,8 @@
1
1
  export { BlogList, BlogListServerProps, BlogListStyles, BlogPost, BlogPostServerProps, BlogPostStyles } 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, T as TableOfContentsProps } from '../types-DWMpAtGy.js';
5
- export { l as BlogAnalytics, a as BlogAuthor, b as BlogCategory, e as BlogListOptions, i as BlogListProps, j as BlogListRenderProps, f as BlogListResult, g as BlogPostProps, h as BlogPostRenderProps, d as BlogTag, R as RelatedPostsProps, k as TocItem } from '../types-DWMpAtGy.js';
4
+ import { A as AuthorCardProps, c as AuthorPageProps, B as BlogPost, d as TableOfContentsProps, C as ClusterNavigation$1, T as TopicCluster } 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 } from '../types-5P5B9RgV.js';
6
6
 
7
7
  interface BlogSidebarProps {
8
8
  /** Portal API URL */
@@ -206,6 +206,34 @@ interface BlogFAQProps {
206
206
  }
207
207
  declare function BlogFAQ({ items, title, allowMultiple, styles, unstyled, }: BlogFAQProps): react_jsx_runtime.JSX.Element | null;
208
208
 
209
+ interface ClusterNavigationProps {
210
+ /** Cluster navigation data (from getClusterNavigation) */
211
+ navigation: ClusterNavigation$1;
212
+ /** Base path for blog URLs (default: /blog) */
213
+ basePath?: string;
214
+ /** Disable default styles */
215
+ unstyled?: boolean;
216
+ /** Custom class name */
217
+ className?: string;
218
+ }
219
+ declare function ClusterNavigation({ navigation, basePath, unstyled, className, }: ClusterNavigationProps): react_jsx_runtime.JSX.Element | null;
220
+
221
+ interface ClusterLandingPageProps {
222
+ /** Cluster slug to fetch */
223
+ slug: string;
224
+ /** Base path for blog URLs (default: /blog) */
225
+ basePath?: string;
226
+ /** Disable default styles */
227
+ unstyled?: boolean;
228
+ /** Custom class name */
229
+ className?: string;
230
+ /** Render prop for full data access */
231
+ children?: (props: {
232
+ cluster: TopicCluster;
233
+ }) => React__default.ReactNode;
234
+ }
235
+ 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>;
236
+
209
237
  /**
210
238
  * Post-process Portal/blog HTML for safe, consistent link behavior.
211
239
  * Server-safe string transforms only (no DOM).
@@ -224,4 +252,4 @@ declare function resolveBlogSiteUrl(explicit?: string): string;
224
252
  */
225
253
  declare function addExternalLinkTargets(html: string, siteUrl: string): string;
226
254
 
227
- export { AuthorCard, AuthorCardProps, AuthorPage, AuthorPageProps, BlogFAQ, type BlogFAQProps, BlogLayout, type BlogLayoutProps, BlogPage, type BlogPageProps, BlogPostPage, type BlogPostPageProps, BlogSidebar, type BlogSidebarProps, CategoryPage, type CategoryPageProps, type FaqItem, NewsletterWidget, type NewsletterWidgetProps, RelatedPosts, ServiceCallout, type ServiceCalloutProps, ServiceCallouts, TableOfContents, TableOfContentsProps, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl };
255
+ export { AuthorCard, AuthorCardProps, AuthorPage, AuthorPageProps, BlogFAQ, type BlogFAQProps, BlogLayout, type BlogLayoutProps, BlogPage, type BlogPageProps, BlogPostPage, type BlogPostPageProps, BlogSidebar, type BlogSidebarProps, CategoryPage, type CategoryPageProps, ClusterLandingPage, type ClusterLandingPageProps, ClusterNavigation, type ClusterNavigationProps, type FaqItem, NewsletterWidget, type NewsletterWidgetProps, RelatedPosts, ServiceCallout, type ServiceCalloutProps, ServiceCallouts, TableOfContents, TableOfContentsProps, TopicCluster, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl };
@@ -2,8 +2,8 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkUJQYSVYV_js = require('../chunk-UJQYSVYV.js');
5
- var chunkGQKBGL2W_js = require('../chunk-GQKBGL2W.js');
6
- var chunkLNMI6OMN_js = require('../chunk-LNMI6OMN.js');
5
+ var chunkDZKX3GHL_js = require('../chunk-DZKX3GHL.js');
6
+ var chunkF54HGPDM_js = require('../chunk-F54HGPDM.js');
7
7
  require('../chunk-ZSMWDLMK.js');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
  var react = require('react');
@@ -698,7 +698,7 @@ function PostCard({ post, basePath }) {
698
698
  );
699
699
  }
700
700
  function AuthorPage({ author, posts, basePath = "/blog" }) {
701
- const schema = chunkGQKBGL2W_js.generateAuthorSchema(author);
701
+ const schema = chunkDZKX3GHL_js.generateAuthorSchema(author);
702
702
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-author-page", children: [
703
703
  /* @__PURE__ */ jsxRuntime.jsx(
704
704
  "script",
@@ -876,6 +876,185 @@ function TableOfContents({
876
876
  )) })
877
877
  ] });
878
878
  }
879
+ var clusterLandingCss = `
880
+ .sk-cluster-landing { max-width: 72rem; margin: 0 auto; padding: 2rem 1rem; }
881
+
882
+ .sk-cluster-hero { margin-bottom: 3rem; text-align: center; }
883
+ .sk-cluster-hero-label {
884
+ display: inline-flex; align-items: center; gap: 0.375rem;
885
+ font-size: 0.75rem; font-weight: 600; text-transform: uppercase;
886
+ letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;
887
+ }
888
+ .sk-cluster-hero-title {
889
+ font-size: 2.25rem; font-weight: 800; color: #111827;
890
+ line-height: 1.2; margin: 0 0 0.75rem 0;
891
+ }
892
+ .sk-cluster-hero-desc {
893
+ font-size: 1.125rem; color: #6b7280; max-width: 40rem;
894
+ margin: 0 auto; line-height: 1.6;
895
+ }
896
+ .sk-cluster-hero-meta {
897
+ display: flex; justify-content: center; gap: 1.5rem;
898
+ margin-top: 1rem; font-size: 0.875rem; color: #9ca3af;
899
+ }
900
+
901
+ .sk-cluster-pillar-card {
902
+ display: block; text-decoration: none; color: inherit;
903
+ padding: 2rem; border-radius: 0.75rem;
904
+ background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(99,102,241,0.01));
905
+ border: 2px solid rgba(99,102,241,0.2);
906
+ margin-bottom: 3rem; transition: border-color 0.2s, box-shadow 0.2s;
907
+ }
908
+ .sk-cluster-pillar-card:hover {
909
+ border-color: rgba(99,102,241,0.4);
910
+ box-shadow: 0 4px 24px rgba(99,102,241,0.08);
911
+ }
912
+ .sk-cluster-pillar-label {
913
+ display: inline-flex; align-items: center; gap: 0.375rem;
914
+ font-size: 0.6875rem; font-weight: 700; text-transform: uppercase;
915
+ letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;
916
+ padding: 0.25rem 0.5rem; border-radius: 9999px;
917
+ background: rgba(99,102,241,0.08);
918
+ }
919
+ .sk-cluster-pillar-title {
920
+ font-size: 1.5rem; font-weight: 700; color: #111827;
921
+ margin: 0 0 0.5rem 0; line-height: 1.3;
922
+ }
923
+ .sk-cluster-pillar-excerpt {
924
+ font-size: 1rem; color: #6b7280; line-height: 1.6;
925
+ margin: 0 0 1rem 0;
926
+ }
927
+ .sk-cluster-pillar-meta {
928
+ display: flex; gap: 1rem; font-size: 0.8125rem; color: #9ca3af;
929
+ }
930
+
931
+ .sk-cluster-supports-section { margin-bottom: 2rem; }
932
+ .sk-cluster-supports-title {
933
+ font-size: 1.25rem; font-weight: 700; color: #111827;
934
+ margin: 0 0 1.25rem 0;
935
+ }
936
+ .sk-cluster-supports-grid {
937
+ display: grid; gap: 1.25rem;
938
+ grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
939
+ }
940
+ .sk-cluster-support-card {
941
+ display: block; text-decoration: none; color: inherit;
942
+ padding: 1.25rem; border-radius: 0.5rem;
943
+ border: 1px solid #e5e7eb; background: #fff;
944
+ transition: border-color 0.2s, box-shadow 0.2s;
945
+ }
946
+ .sk-cluster-support-card:hover {
947
+ border-color: #c7d2fe;
948
+ box-shadow: 0 2px 12px rgba(0,0,0,0.04);
949
+ }
950
+ .sk-cluster-support-card-header {
951
+ display: flex; align-items: center; gap: 0.5rem;
952
+ margin-bottom: 0.5rem;
953
+ }
954
+ .sk-cluster-support-type {
955
+ display: inline-flex; align-items: center;
956
+ padding: 0.125rem 0.375rem; border-radius: 9999px;
957
+ font-size: 0.6875rem; font-weight: 500;
958
+ background: rgba(99,102,241,0.06); color: #6366f1;
959
+ border: 1px solid rgba(99,102,241,0.12);
960
+ text-transform: capitalize;
961
+ }
962
+ .sk-cluster-support-intent {
963
+ font-size: 0.6875rem; color: #9ca3af;
964
+ text-transform: capitalize;
965
+ }
966
+ .sk-cluster-support-title {
967
+ font-size: 1rem; font-weight: 600; color: #111827;
968
+ margin: 0 0 0.375rem 0; line-height: 1.4;
969
+ }
970
+ .sk-cluster-support-excerpt {
971
+ font-size: 0.875rem; color: #6b7280; line-height: 1.5;
972
+ margin: 0; display: -webkit-box; -webkit-line-clamp: 2;
973
+ -webkit-box-orient: vertical; overflow: hidden;
974
+ }
975
+ .sk-cluster-support-meta {
976
+ display: flex; gap: 0.75rem; margin-top: 0.75rem;
977
+ font-size: 0.75rem; color: #9ca3af;
978
+ }
979
+ `;
980
+ async function ClusterLandingPage({
981
+ slug,
982
+ basePath = "/blog",
983
+ unstyled = false,
984
+ className,
985
+ children
986
+ }) {
987
+ const cluster = await chunkDZKX3GHL_js.getTopicCluster(slug);
988
+ if (!cluster) {
989
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "4rem 1rem", textAlign: "center", color: "#6b7280" }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Topic cluster not found." }) });
990
+ }
991
+ if (children) {
992
+ return children({ cluster });
993
+ }
994
+ const pillar = cluster.pillar;
995
+ const supports = cluster.supports || [];
996
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
997
+ !unstyled && /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: clusterLandingCss } }),
998
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${unstyled ? "" : "sk-cluster-landing"} ${className || ""}`, children: [
999
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: unstyled ? "" : "sk-cluster-hero", children: [
1000
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-hero-label", children: "Topic Cluster" }),
1001
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: unstyled ? "" : "sk-cluster-hero-title", children: cluster.cluster_name }),
1002
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: unstyled ? "" : "sk-cluster-hero-desc", children: [
1003
+ cluster.core_topic,
1004
+ cluster.geo_target ? ` in ${cluster.geo_target}` : ""
1005
+ ] }),
1006
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-hero-meta", children: [
1007
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1008
+ cluster.article_count,
1009
+ " articles"
1010
+ ] }),
1011
+ cluster.geo_target && /* @__PURE__ */ jsxRuntime.jsx("span", { children: cluster.geo_target })
1012
+ ] })
1013
+ ] }),
1014
+ pillar && /* @__PURE__ */ jsxRuntime.jsxs("a", { href: `${basePath}/${pillar.slug}`, className: unstyled ? "" : "sk-cluster-pillar-card", children: [
1015
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: unstyled ? "" : "sk-cluster-pillar-label", children: "Pillar Guide" }),
1016
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: unstyled ? "" : "sk-cluster-pillar-title", children: pillar.title }),
1017
+ pillar.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-pillar-excerpt", children: pillar.excerpt }),
1018
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-pillar-meta", children: [
1019
+ pillar.reading_time_minutes && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1020
+ pillar.reading_time_minutes,
1021
+ " min read"
1022
+ ] }),
1023
+ pillar.word_count && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1024
+ pillar.word_count.toLocaleString(),
1025
+ " words"
1026
+ ] })
1027
+ ] })
1028
+ ] }),
1029
+ supports.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("section", { className: unstyled ? "" : "sk-cluster-supports-section", children: [
1030
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: unstyled ? "" : "sk-cluster-supports-title", children: "Deep Dives" }),
1031
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: unstyled ? "" : "sk-cluster-supports-grid", children: supports.map((post) => /* @__PURE__ */ jsxRuntime.jsxs(
1032
+ "a",
1033
+ {
1034
+ href: `${basePath}/${post.slug}`,
1035
+ className: unstyled ? "" : "sk-cluster-support-card",
1036
+ children: [
1037
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-support-card-header", children: [
1038
+ post.article_type && /* @__PURE__ */ jsxRuntime.jsx("span", { className: unstyled ? "" : "sk-cluster-support-type", children: post.article_type }),
1039
+ post.search_intent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: unstyled ? "" : "sk-cluster-support-intent", children: post.search_intent })
1040
+ ] }),
1041
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: unstyled ? "" : "sk-cluster-support-title", children: post.title }),
1042
+ post.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-support-excerpt", children: post.excerpt }),
1043
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-support-meta", children: [
1044
+ post.reading_time_minutes && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1045
+ post.reading_time_minutes,
1046
+ " min read"
1047
+ ] }),
1048
+ post.relationship_to_pillar && /* @__PURE__ */ jsxRuntime.jsx("span", { children: post.relationship_to_pillar })
1049
+ ] })
1050
+ ]
1051
+ },
1052
+ post.id || post.slug
1053
+ )) })
1054
+ ] })
1055
+ ] })
1056
+ ] });
1057
+ }
879
1058
 
880
1059
  Object.defineProperty(exports, "BlogFAQ", {
881
1060
  enumerable: true,
@@ -883,31 +1062,35 @@ Object.defineProperty(exports, "BlogFAQ", {
883
1062
  });
884
1063
  Object.defineProperty(exports, "BlogList", {
885
1064
  enumerable: true,
886
- get: function () { return chunkLNMI6OMN_js.BlogList; }
1065
+ get: function () { return chunkF54HGPDM_js.BlogList; }
887
1066
  });
888
1067
  Object.defineProperty(exports, "BlogPost", {
889
1068
  enumerable: true,
890
- get: function () { return chunkLNMI6OMN_js.BlogPost; }
1069
+ get: function () { return chunkF54HGPDM_js.BlogPost; }
1070
+ });
1071
+ Object.defineProperty(exports, "ClusterNavigation", {
1072
+ enumerable: true,
1073
+ get: function () { return chunkF54HGPDM_js.ClusterNavigation; }
891
1074
  });
892
1075
  Object.defineProperty(exports, "ServiceCallout", {
893
1076
  enumerable: true,
894
- get: function () { return chunkLNMI6OMN_js.ServiceCallout; }
1077
+ get: function () { return chunkF54HGPDM_js.ServiceCallout; }
895
1078
  });
896
1079
  Object.defineProperty(exports, "ServiceCallouts", {
897
1080
  enumerable: true,
898
- get: function () { return chunkLNMI6OMN_js.ServiceCallouts; }
1081
+ get: function () { return chunkF54HGPDM_js.ServiceCallouts; }
899
1082
  });
900
1083
  Object.defineProperty(exports, "addExternalLinkTargets", {
901
1084
  enumerable: true,
902
- get: function () { return chunkLNMI6OMN_js.addExternalLinkTargets; }
1085
+ get: function () { return chunkF54HGPDM_js.addExternalLinkTargets; }
903
1086
  });
904
1087
  Object.defineProperty(exports, "normalizeSiteHost", {
905
1088
  enumerable: true,
906
- get: function () { return chunkLNMI6OMN_js.normalizeSiteHost; }
1089
+ get: function () { return chunkF54HGPDM_js.normalizeSiteHost; }
907
1090
  });
908
1091
  Object.defineProperty(exports, "resolveBlogSiteUrl", {
909
1092
  enumerable: true,
910
- get: function () { return chunkLNMI6OMN_js.resolveBlogSiteUrl; }
1093
+ get: function () { return chunkF54HGPDM_js.resolveBlogSiteUrl; }
911
1094
  });
912
1095
  exports.AuthorCard = AuthorCard;
913
1096
  exports.AuthorPage = AuthorPage;
@@ -916,6 +1099,7 @@ exports.BlogPage = BlogPage;
916
1099
  exports.BlogPostPage = BlogPostPage;
917
1100
  exports.BlogSidebar = BlogSidebar;
918
1101
  exports.CategoryPage = CategoryPage;
1102
+ exports.ClusterLandingPage = ClusterLandingPage;
919
1103
  exports.NewsletterWidget = NewsletterWidget;
920
1104
  exports.RelatedPosts = RelatedPosts;
921
1105
  exports.TableOfContents = TableOfContents;