@burdenoff/website-sdk 2026.720.4 → 2026.720.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -105,6 +105,22 @@ interface ProductCategory {
105
105
  icon?: string | null;
106
106
  parentId?: string | null;
107
107
  }
108
+ interface StoreTypeFilter {
109
+ type: string;
110
+ label: string;
111
+ }
112
+ interface StoreTerminology {
113
+ /** Placeholder for the store search input. */
114
+ searchPlaceholder?: string;
115
+ /** Message shown in the empty state when no items have been published. */
116
+ emptyStateDescription?: string;
117
+ /** Description in the "Become a publisher" CTA section. */
118
+ publisherCtaDescription?: string;
119
+ /** Fallback description for the browse page (SEO + intro). */
120
+ browseDescription?: string;
121
+ /** Quick-filter chips on the home page and sidebar options on the browse page. */
122
+ typeFilters?: StoreTypeFilter[];
123
+ }
108
124
  interface StorePageProps {
109
125
  /** Filter to only products compatible with this product (e.g. "fluidgrids") */
110
126
  compatibleWith?: string;
@@ -112,6 +128,8 @@ interface StorePageProps {
112
128
  appLoginUrl: string;
113
129
  /** Called instead of <a href> for internal navigation — pass useNavigate() wrapper */
114
130
  onNavigate?: (path: string) => void;
131
+ /** Product-specific labels/copy for the store UI. */
132
+ terminology?: StoreTerminology;
115
133
  }
116
134
 
117
135
  interface StoreHomePageProps extends StorePageProps {
@@ -123,14 +141,14 @@ interface StoreHomePageProps extends StorePageProps {
123
141
  seoDescription?: string;
124
142
  seoKeywords?: string;
125
143
  }
126
- declare function StoreHomePage({ compatibleWith, appLoginUrl, onNavigate, productName, heroTitle, heroSubtitle, browsePath, seoTitle, seoDescription, seoKeywords, }: StoreHomePageProps): react_jsx_runtime.JSX.Element;
144
+ declare function StoreHomePage({ compatibleWith, appLoginUrl, onNavigate, terminology, productName, heroTitle, heroSubtitle, browsePath, seoTitle, seoDescription, seoKeywords, }: StoreHomePageProps): react_jsx_runtime.JSX.Element;
127
145
 
128
146
  interface StoreBrowsePageProps extends StorePageProps {
129
147
  productName?: string;
130
148
  seoTitle?: string;
131
149
  seoDescription?: string;
132
150
  }
133
- declare function StoreBrowsePage({ compatibleWith, onNavigate, productName, seoTitle, seoDescription, }: StoreBrowsePageProps): react_jsx_runtime.JSX.Element;
151
+ declare function StoreBrowsePage({ compatibleWith, onNavigate, terminology, productName, seoTitle, seoDescription, }: StoreBrowsePageProps): react_jsx_runtime.JSX.Element;
134
152
 
135
153
  interface StoreProductDetailPageProps extends StorePageProps {
136
154
  slug?: string;
@@ -154,4 +172,4 @@ interface ProductCardProps {
154
172
  }
155
173
  declare function ProductCard({ product, onClick, href }: ProductCardProps): react_jsx_runtime.JSX.Element;
156
174
 
157
- export { type BrowseStoreResult as B, type GroupedStoreProducts as G, ProductCard as P, type RatingDistribution as R, type SearchSuggestion as S, TypeBadge as T, type ProductCategory as a, StarRating as b, StoreBrowsePage as c, type StoreBrowsePageProps as d, type StoreFacet as e, type StoreFacets as f, StoreHomePage as g, type StoreHomePageProps as h, type StorePageProps as i, type StoreProduct as j, StoreProductDetailPage as k, type StoreProductDetailPageProps as l, type StoreProductDetails as m, type StorePublisher as n, type StoreReview as o, formatDownloads as p, formatPrice as q };
175
+ export { type BrowseStoreResult as B, type GroupedStoreProducts as G, ProductCard as P, type RatingDistribution as R, type SearchSuggestion as S, TypeBadge as T, type ProductCategory as a, StarRating as b, StoreBrowsePage as c, type StoreBrowsePageProps as d, type StoreFacet as e, type StoreFacets as f, StoreHomePage as g, type StoreHomePageProps as h, type StorePageProps as i, type StoreProduct as j, StoreProductDetailPage as k, type StoreProductDetailPageProps as l, type StoreProductDetails as m, type StorePublisher as n, type StoreReview as o, type StoreTerminology as p, type StoreTypeFilter as q, formatDownloads as r, formatPrice as s };
@@ -105,6 +105,22 @@ interface ProductCategory {
105
105
  icon?: string | null;
106
106
  parentId?: string | null;
107
107
  }
108
+ interface StoreTypeFilter {
109
+ type: string;
110
+ label: string;
111
+ }
112
+ interface StoreTerminology {
113
+ /** Placeholder for the store search input. */
114
+ searchPlaceholder?: string;
115
+ /** Message shown in the empty state when no items have been published. */
116
+ emptyStateDescription?: string;
117
+ /** Description in the "Become a publisher" CTA section. */
118
+ publisherCtaDescription?: string;
119
+ /** Fallback description for the browse page (SEO + intro). */
120
+ browseDescription?: string;
121
+ /** Quick-filter chips on the home page and sidebar options on the browse page. */
122
+ typeFilters?: StoreTypeFilter[];
123
+ }
108
124
  interface StorePageProps {
109
125
  /** Filter to only products compatible with this product (e.g. "fluidgrids") */
110
126
  compatibleWith?: string;
@@ -112,6 +128,8 @@ interface StorePageProps {
112
128
  appLoginUrl: string;
113
129
  /** Called instead of <a href> for internal navigation — pass useNavigate() wrapper */
114
130
  onNavigate?: (path: string) => void;
131
+ /** Product-specific labels/copy for the store UI. */
132
+ terminology?: StoreTerminology;
115
133
  }
116
134
 
117
135
  interface StoreHomePageProps extends StorePageProps {
@@ -123,14 +141,14 @@ interface StoreHomePageProps extends StorePageProps {
123
141
  seoDescription?: string;
124
142
  seoKeywords?: string;
125
143
  }
126
- declare function StoreHomePage({ compatibleWith, appLoginUrl, onNavigate, productName, heroTitle, heroSubtitle, browsePath, seoTitle, seoDescription, seoKeywords, }: StoreHomePageProps): react_jsx_runtime.JSX.Element;
144
+ declare function StoreHomePage({ compatibleWith, appLoginUrl, onNavigate, terminology, productName, heroTitle, heroSubtitle, browsePath, seoTitle, seoDescription, seoKeywords, }: StoreHomePageProps): react_jsx_runtime.JSX.Element;
127
145
 
128
146
  interface StoreBrowsePageProps extends StorePageProps {
129
147
  productName?: string;
130
148
  seoTitle?: string;
131
149
  seoDescription?: string;
132
150
  }
133
- declare function StoreBrowsePage({ compatibleWith, onNavigate, productName, seoTitle, seoDescription, }: StoreBrowsePageProps): react_jsx_runtime.JSX.Element;
151
+ declare function StoreBrowsePage({ compatibleWith, onNavigate, terminology, productName, seoTitle, seoDescription, }: StoreBrowsePageProps): react_jsx_runtime.JSX.Element;
134
152
 
135
153
  interface StoreProductDetailPageProps extends StorePageProps {
136
154
  slug?: string;
@@ -154,4 +172,4 @@ interface ProductCardProps {
154
172
  }
155
173
  declare function ProductCard({ product, onClick, href }: ProductCardProps): react_jsx_runtime.JSX.Element;
156
174
 
157
- export { type BrowseStoreResult as B, type GroupedStoreProducts as G, ProductCard as P, type RatingDistribution as R, type SearchSuggestion as S, TypeBadge as T, type ProductCategory as a, StarRating as b, StoreBrowsePage as c, type StoreBrowsePageProps as d, type StoreFacet as e, type StoreFacets as f, StoreHomePage as g, type StoreHomePageProps as h, type StorePageProps as i, type StoreProduct as j, StoreProductDetailPage as k, type StoreProductDetailPageProps as l, type StoreProductDetails as m, type StorePublisher as n, type StoreReview as o, formatDownloads as p, formatPrice as q };
175
+ export { type BrowseStoreResult as B, type GroupedStoreProducts as G, ProductCard as P, type RatingDistribution as R, type SearchSuggestion as S, TypeBadge as T, type ProductCategory as a, StarRating as b, StoreBrowsePage as c, type StoreBrowsePageProps as d, type StoreFacet as e, type StoreFacets as f, StoreHomePage as g, type StoreHomePageProps as h, type StorePageProps as i, type StoreProduct as j, StoreProductDetailPage as k, type StoreProductDetailPageProps as l, type StoreProductDetails as m, type StorePublisher as n, type StoreReview as o, type StoreTerminology as p, type StoreTypeFilter as q, formatDownloads as r, formatPrice as s };
@@ -1,4 +1,4 @@
1
- export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, T as TypeBadge, p as formatDownloads, q as formatPrice } from '../product-card-Dm1zkFkm.mjs';
1
+ export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, p as StoreTerminology, q as StoreTypeFilter, T as TypeBadge, r as formatDownloads, s as formatPrice } from '../product-card-D2HQglaf.mjs';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, T as TypeBadge, p as formatDownloads, q as formatPrice } from '../product-card-Dm1zkFkm.js';
1
+ export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, p as StoreTerminology, q as StoreTypeFilter, T as TypeBadge, r as formatDownloads, s as formatPrice } from '../product-card-D2HQglaf.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
 
4
4
  /**
@@ -730,7 +730,7 @@ function SectionHead({
730
730
  )
731
731
  ] });
732
732
  }
733
- var TYPE_FILTERS = [
733
+ var DEFAULT_TYPE_FILTERS = [
734
734
  { type: "NODE", label: "Nodes" },
735
735
  { type: "WORKFLOW", label: "Workflows" },
736
736
  { type: "TEMPLATE", label: "Templates" },
@@ -740,9 +740,10 @@ var TYPE_FILTERS = [
740
740
  ];
741
741
  function TypeFilters({
742
742
  browsePath,
743
- onNavigate
743
+ onNavigate,
744
+ typeFilters
744
745
  }) {
745
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2 justify-center", children: TYPE_FILTERS.map((f) => /* @__PURE__ */ jsxRuntime.jsx(
746
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2 justify-center", children: typeFilters.map((f) => /* @__PURE__ */ jsxRuntime.jsx(
746
747
  "button",
747
748
  {
748
749
  type: "button",
@@ -794,6 +795,7 @@ function StoreHomePage({
794
795
  compatibleWith,
795
796
  appLoginUrl,
796
797
  onNavigate,
798
+ terminology,
797
799
  productName,
798
800
  heroTitle,
799
801
  heroSubtitle,
@@ -848,6 +850,10 @@ function StoreHomePage({
848
850
  const hasNoItems = !loading && !error && featuredItems.length === 0 && popularItems.length === 0 && freeItems.length === 0;
849
851
  const resolvedTitle = heroTitle ?? `${productName ? `${productName} ` : ""}Store`;
850
852
  const resolvedSubtitle = heroSubtitle ?? "Discover workflows, nodes, integrations, and templates built by the community.";
853
+ const typeFilters = terminology?.typeFilters ?? DEFAULT_TYPE_FILTERS;
854
+ const searchPlaceholder = terminology?.searchPlaceholder ?? "Search nodes, workflows, templates\u2026";
855
+ const emptyStateDescription = terminology?.emptyStateDescription ?? "As the community ships workflows, templates, and integrations, they will show up right here.";
856
+ const publisherCtaDescription = terminology?.publisherCtaDescription ?? `Share your workflows, nodes, and integrations with ${productName ? "the " : ""}community. Earn from your work or contribute for free.`;
851
857
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
852
858
  /* @__PURE__ */ jsxRuntime.jsx(
853
859
  PageHead,
@@ -939,7 +945,7 @@ function StoreHomePage({
939
945
  {
940
946
  name: "q",
941
947
  type: "search",
942
- placeholder: "Search nodes, workflows, templates\u2026",
948
+ placeholder: searchPlaceholder,
943
949
  className: "flex-1 h-12 rounded-xl border border-border bg-background px-4 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/40 shadow-sm"
944
950
  }
945
951
  ),
@@ -954,7 +960,14 @@ function StoreHomePage({
954
960
  ]
955
961
  }
956
962
  ),
957
- /* @__PURE__ */ jsxRuntime.jsx(TypeFilters, { browsePath, onNavigate: navigate })
963
+ /* @__PURE__ */ jsxRuntime.jsx(
964
+ TypeFilters,
965
+ {
966
+ browsePath,
967
+ onNavigate: navigate,
968
+ typeFilters
969
+ }
970
+ )
958
971
  ] })
959
972
  ] }),
960
973
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pb-20 space-y-14 pt-4", children: [
@@ -1077,7 +1090,8 @@ function StoreHomePage({
1077
1090
  "No items have been published for ",
1078
1091
  productName ?? "this product",
1079
1092
  " ",
1080
- "yet. As the community ships workflows, templates, and integrations, they will show up right here."
1093
+ "yet. ",
1094
+ emptyStateDescription
1081
1095
  ] }),
1082
1096
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-center gap-3", children: [
1083
1097
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1129,12 +1143,7 @@ function StoreHomePage({
1129
1143
  "Become a publisher"
1130
1144
  ] }),
1131
1145
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-foreground mb-3", children: "Built something useful?" }),
1132
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-muted-foreground mb-8 max-w-lg mx-auto leading-relaxed", children: [
1133
- "Share your workflows, nodes, and integrations with",
1134
- " ",
1135
- productName ?? "the",
1136
- " community. Earn from your work or contribute for free."
1137
- ] }),
1146
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-8 max-w-lg mx-auto leading-relaxed", children: publisherCtaDescription }),
1138
1147
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row gap-3 justify-center", children: [
1139
1148
  /* @__PURE__ */ jsxRuntime.jsx(
1140
1149
  "a",
@@ -1169,16 +1178,18 @@ var SORT_OPTIONS = [
1169
1178
  { value: "PRICE_HIGH", label: "Price: High to Low" },
1170
1179
  { value: "NAME_ASC", label: "Name A\u2013Z" }
1171
1180
  ];
1172
- var TYPE_OPTIONS = [
1173
- { value: "", label: "All types" },
1174
- { value: "APP", label: "Apps" },
1175
- { value: "NODE", label: "Nodes" },
1176
- { value: "WORKFLOW", label: "Workflows" },
1177
- { value: "TEMPLATE", label: "Templates" },
1178
- { value: "INTEGRATION", label: "Integrations" },
1179
- { value: "EXTENSION", label: "Extensions" },
1180
- { value: "THEME", label: "Themes" }
1181
+ var DEFAULT_TYPE_OPTIONS = [
1182
+ { type: "APP", label: "Apps" },
1183
+ { type: "NODE", label: "Nodes" },
1184
+ { type: "WORKFLOW", label: "Workflows" },
1185
+ { type: "TEMPLATE", label: "Templates" },
1186
+ { type: "INTEGRATION", label: "Integrations" },
1187
+ { type: "EXTENSION", label: "Extensions" },
1188
+ { type: "THEME", label: "Themes" }
1181
1189
  ];
1190
+ function buildTypeOptions(typeFilters) {
1191
+ return [{ type: "", label: "All types" }, ...typeFilters];
1192
+ }
1182
1193
  var PRICING_OPTIONS = [
1183
1194
  { value: "", label: "All pricing" },
1184
1195
  { value: "FREE", label: "Free" },
@@ -1231,11 +1242,15 @@ function FacetList({
1231
1242
  function StoreBrowsePage({
1232
1243
  compatibleWith,
1233
1244
  onNavigate,
1245
+ terminology,
1234
1246
  productName,
1235
1247
  seoTitle,
1236
1248
  seoDescription
1237
1249
  }) {
1238
1250
  const client = useWebSDK();
1251
+ const typeFilters = terminology?.typeFilters ?? DEFAULT_TYPE_OPTIONS;
1252
+ const typeOptions = buildTypeOptions(typeFilters);
1253
+ const browseDescription = terminology?.browseDescription ?? "Browse all apps, workflows, nodes, and templates.";
1239
1254
  const initial = parseUrlParams();
1240
1255
  const [search, setSearch] = react.useState(initial.q);
1241
1256
  const [inputValue, setInputValue] = react.useState(initial.q);
@@ -1355,15 +1370,15 @@ function StoreBrowsePage({
1355
1370
  const sidebarContent = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
1356
1371
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1357
1372
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-2", children: "Type" }),
1358
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: TYPE_OPTIONS.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(
1373
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: typeOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(
1359
1374
  "button",
1360
1375
  {
1361
1376
  type: "button",
1362
- onClick: () => setType(opt.value),
1363
- className: `w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${type === opt.value ? "bg-primary/10 text-primary font-medium" : "text-muted-foreground hover:text-foreground hover:bg-muted/50"}`,
1377
+ onClick: () => setType(opt.type),
1378
+ className: `w-full text-left text-sm px-2 py-1.5 rounded transition-colors ${type === opt.type ? "bg-primary/10 text-primary font-medium" : "text-muted-foreground hover:text-foreground hover:bg-muted/50"}`,
1364
1379
  children: opt.label
1365
1380
  },
1366
- opt.value
1381
+ opt.type
1367
1382
  )) })
1368
1383
  ] }),
1369
1384
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -1433,7 +1448,7 @@ function StoreBrowsePage({
1433
1448
  PageHead,
1434
1449
  {
1435
1450
  title: seoTitle ?? `Browse Store${productName ? ` \u2013 ${productName}` : ""}`,
1436
- description: seoDescription ?? "Browse all apps, workflows, nodes, and templates.",
1451
+ description: seoDescription ?? browseDescription,
1437
1452
  productName
1438
1453
  }
1439
1454
  ),