@burdenoff/website-sdk 2026.703.2 → 2026.709.2

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 (37) hide show
  1. package/dist/components/electron-download.d.mts +32 -0
  2. package/dist/components/electron-download.d.ts +32 -0
  3. package/dist/components/electron-download.js +131 -0
  4. package/dist/components/electron-download.js.map +1 -0
  5. package/dist/components/electron-download.mjs +108 -0
  6. package/dist/components/electron-download.mjs.map +1 -0
  7. package/dist/components/launch-countdown.d.mts +15 -0
  8. package/dist/components/launch-countdown.d.ts +15 -0
  9. package/dist/components/launch-countdown.js +89 -0
  10. package/dist/components/launch-countdown.js.map +1 -0
  11. package/dist/components/launch-countdown.mjs +87 -0
  12. package/dist/components/launch-countdown.mjs.map +1 -0
  13. package/dist/components/problems-solved.d.mts +37 -0
  14. package/dist/components/problems-solved.d.ts +37 -0
  15. package/dist/components/problems-solved.js +157 -0
  16. package/dist/components/problems-solved.js.map +1 -0
  17. package/dist/components/problems-solved.mjs +135 -0
  18. package/dist/components/problems-solved.mjs.map +1 -0
  19. package/dist/components/website-switcher.d.mts +27 -0
  20. package/dist/components/website-switcher.d.ts +27 -0
  21. package/dist/components/website-switcher.js +168 -0
  22. package/dist/components/website-switcher.js.map +1 -0
  23. package/dist/components/website-switcher.mjs +146 -0
  24. package/dist/components/website-switcher.mjs.map +1 -0
  25. package/dist/content/index.d.mts +24 -1
  26. package/dist/content/index.d.ts +24 -1
  27. package/dist/content/index.js +459 -149
  28. package/dist/content/index.js.map +1 -1
  29. package/dist/content/index.mjs +378 -87
  30. package/dist/content/index.mjs.map +1 -1
  31. package/dist/index.d.mts +15 -2
  32. package/dist/index.d.ts +15 -2
  33. package/dist/index.js +817 -86
  34. package/dist/index.js.map +1 -1
  35. package/dist/index.mjs +812 -88
  36. package/dist/index.mjs.map +1 -1
  37. package/package.json +3 -1
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ var LabelPrimitive = require('@radix-ui/react-label');
14
14
  var zod$1 = require('@hookform/resolvers/zod');
15
15
  var reactHookForm = require('react-hook-form');
16
16
  var zod = require('zod');
17
+ var DropdownMenu = require('@radix-ui/react-dropdown-menu');
17
18
 
18
19
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
20
 
@@ -38,6 +39,7 @@ function _interopNamespace(e) {
38
39
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
39
40
  var ReCAPTCHA3__default = /*#__PURE__*/_interopDefault(ReCAPTCHA3);
40
41
  var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
42
+ var DropdownMenu__namespace = /*#__PURE__*/_interopNamespace(DropdownMenu);
41
43
 
42
44
  var __defProp = Object.defineProperty;
43
45
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -3938,6 +3940,329 @@ function ResourceLinks({
3938
3940
  }
3939
3941
  ) }, resource)) });
3940
3942
  }
3943
+ function normalizeSearch(value) {
3944
+ return value.toLowerCase().trim();
3945
+ }
3946
+ function filterProducts(products, query) {
3947
+ const normalized = normalizeSearch(query);
3948
+ if (!normalized) return products;
3949
+ return products.filter((p) => normalizeSearch(p.name).includes(normalized));
3950
+ }
3951
+ function WebsiteSwitcher({
3952
+ products,
3953
+ triggerLabel = "Explore products",
3954
+ searchPlaceholder = "Find a product\u2026",
3955
+ emptyText = "No products match your search.",
3956
+ className
3957
+ }) {
3958
+ const [open, setOpen] = React.useState(false);
3959
+ const [query, setQuery] = React.useState("");
3960
+ const filtered = React.useMemo(
3961
+ () => filterProducts(products, query),
3962
+ [products, query]
3963
+ );
3964
+ return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu__namespace.Root, { open, onOpenChange: setOpen, children: [
3965
+ /* @__PURE__ */ jsxRuntime.jsxs(
3966
+ DropdownMenu__namespace.Trigger,
3967
+ {
3968
+ className: cn(
3969
+ "inline-flex items-center gap-1.5 text-sm font-medium transition-colors",
3970
+ "text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring rounded-md",
3971
+ className
3972
+ ),
3973
+ "aria-label": triggerLabel,
3974
+ children: [
3975
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Globe, { className: "h-4 w-4", "aria-hidden": "true" }),
3976
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: triggerLabel }),
3977
+ /* @__PURE__ */ jsxRuntime.jsx(
3978
+ lucideReact.ChevronDown,
3979
+ {
3980
+ className: cn(
3981
+ "h-3.5 w-3.5 transition-transform duration-200",
3982
+ open && "rotate-180"
3983
+ ),
3984
+ "aria-hidden": "true"
3985
+ }
3986
+ )
3987
+ ]
3988
+ }
3989
+ ),
3990
+ /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(
3991
+ DropdownMenu__namespace.Content,
3992
+ {
3993
+ className: "z-50 min-w-[16rem] max-w-[20rem] rounded-lg border border-border/60 bg-popover p-2 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2",
3994
+ sideOffset: 8,
3995
+ align: "end",
3996
+ avoidCollisions: true,
3997
+ children: [
3998
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-2 pb-2 pt-1", children: [
3999
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: "Burdenoff ecosystem" }),
4000
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
4001
+ /* @__PURE__ */ jsxRuntime.jsx(
4002
+ lucideReact.Search,
4003
+ {
4004
+ className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground",
4005
+ "aria-hidden": "true"
4006
+ }
4007
+ ),
4008
+ /* @__PURE__ */ jsxRuntime.jsx(
4009
+ Input,
4010
+ {
4011
+ type: "search",
4012
+ value: query,
4013
+ onChange: (e) => setQuery(e.target.value),
4014
+ placeholder: searchPlaceholder,
4015
+ className: "h-8 pl-8 text-sm",
4016
+ "aria-label": searchPlaceholder,
4017
+ onKeyDown: (e) => {
4018
+ if (e.key === "Escape") {
4019
+ setQuery("");
4020
+ }
4021
+ }
4022
+ }
4023
+ )
4024
+ ] })
4025
+ ] }),
4026
+ /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu__namespace.Separator, { className: "my-1 h-px bg-border/60" }),
4027
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-[min(60vh,24rem)] overflow-y-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-4 text-center text-sm text-muted-foreground", children: emptyText }) : filtered.map((product) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu__namespace.Item, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
4028
+ "a",
4029
+ {
4030
+ href: product.websiteUrl,
4031
+ target: "_blank",
4032
+ rel: "noopener noreferrer",
4033
+ className: cn(
4034
+ "flex items-center gap-3 rounded-md px-2 py-2 text-sm outline-none",
4035
+ "text-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground"
4036
+ ),
4037
+ children: [
4038
+ product.logoUrl ? /* @__PURE__ */ jsxRuntime.jsx(
4039
+ "img",
4040
+ {
4041
+ src: product.logoUrl,
4042
+ alt: "",
4043
+ "aria-hidden": "true",
4044
+ className: "h-5 w-5 shrink-0 rounded object-contain"
4045
+ }
4046
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded bg-primary/10 text-[10px] font-bold text-primary", children: product.name.charAt(0) }),
4047
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: product.name })
4048
+ ]
4049
+ }
4050
+ ) }, product.slug)) }),
4051
+ /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu__namespace.Arrow, { className: "fill-popover" })
4052
+ ]
4053
+ }
4054
+ ) })
4055
+ ] });
4056
+ }
4057
+ function splitRemaining(ms) {
4058
+ const clamped = Math.max(0, ms);
4059
+ const totalSeconds = Math.floor(clamped / 1e3);
4060
+ return {
4061
+ days: Math.floor(totalSeconds / 86400),
4062
+ hours: Math.floor(totalSeconds % 86400 / 3600),
4063
+ minutes: Math.floor(totalSeconds % 3600 / 60),
4064
+ seconds: totalSeconds % 60
4065
+ };
4066
+ }
4067
+ function padTwo(n) {
4068
+ return String(n).padStart(2, "0");
4069
+ }
4070
+ function LaunchCountdown({
4071
+ launchDate,
4072
+ launchLabel,
4073
+ launchedMessage = "We have launched!",
4074
+ className
4075
+ }) {
4076
+ const [now, setNow] = React.useState(() => Date.now());
4077
+ const remainingMs = launchDate - now;
4078
+ const hasLaunched = remainingMs <= 0;
4079
+ React.useEffect(() => {
4080
+ if (hasLaunched) return;
4081
+ const interval = setInterval(() => {
4082
+ setNow(Date.now());
4083
+ }, 1e3);
4084
+ return () => clearInterval(interval);
4085
+ }, [hasLaunched]);
4086
+ const { days, hours, minutes, seconds } = splitRemaining(remainingMs);
4087
+ const cells = [
4088
+ { label: "Days", value: padTwo(Math.min(days, 99)) },
4089
+ { label: "Hours", value: padTwo(hours) },
4090
+ { label: "Minutes", value: padTwo(minutes) },
4091
+ { label: "Seconds", value: padTwo(seconds) }
4092
+ ];
4093
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4094
+ "div",
4095
+ {
4096
+ className: cn("inline-flex flex-col gap-3", className),
4097
+ role: "timer",
4098
+ "aria-label": launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`),
4099
+ children: [
4100
+ !hasLaunched && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-mono uppercase tracking-wider text-muted-foreground", children: "Launching in" }),
4101
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-2 sm:gap-3", children: hasLaunched ? /* @__PURE__ */ jsxRuntime.jsxs(
4102
+ "div",
4103
+ {
4104
+ className: cn(
4105
+ "flex min-w-[15rem] items-center justify-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-6 py-4",
4106
+ "text-center"
4107
+ ),
4108
+ children: [
4109
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Rocket, { className: "h-5 w-5 text-primary", "aria-hidden": "true" }),
4110
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold text-foreground", children: launchedMessage })
4111
+ ]
4112
+ }
4113
+ ) : cells.map((cell) => /* @__PURE__ */ jsxRuntime.jsxs(
4114
+ "div",
4115
+ {
4116
+ className: cn(
4117
+ "flex min-w-[3.75rem] flex-col items-center rounded-lg border border-border/60 bg-card px-3 py-2 sm:min-w-[4.5rem] sm:px-4 sm:py-3"
4118
+ ),
4119
+ children: [
4120
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono text-2xl font-bold tabular-nums text-foreground sm:text-3xl", children: cell.value }),
4121
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground sm:text-xs", children: cell.label })
4122
+ ]
4123
+ },
4124
+ cell.label
4125
+ )) }),
4126
+ !hasLaunched && launchLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: launchLabel })
4127
+ ]
4128
+ }
4129
+ );
4130
+ }
4131
+ function ProblemsSolvedSection({
4132
+ eyebrow,
4133
+ title,
4134
+ subtitle,
4135
+ problems,
4136
+ storyBasePath = "/use-cases",
4137
+ storyLabel = "See the story",
4138
+ className,
4139
+ children
4140
+ }) {
4141
+ return /* @__PURE__ */ jsxRuntime.jsx(
4142
+ "section",
4143
+ {
4144
+ className: cn(
4145
+ "py-16 md:py-24 px-4 sm:px-6 lg:px-8 bg-muted/30",
4146
+ className
4147
+ ),
4148
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto", children: [
4149
+ (eyebrow || title || subtitle) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl mx-auto text-center mb-12 md:mb-16", children: [
4150
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-mono uppercase tracking-widest text-primary mb-4", children: eyebrow }),
4151
+ title && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl sm:text-4xl font-bold text-foreground mb-4", children: title }),
4152
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg text-muted-foreground", children: subtitle })
4153
+ ] }),
4154
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: problems.map((item, index) => {
4155
+ const Icon = item.icon;
4156
+ const storyHref = item.storySlug ? `${storyBasePath.replace(/\/$/, "")}/${item.storySlug}` : null;
4157
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4158
+ "div",
4159
+ {
4160
+ className: cn(
4161
+ "group relative flex flex-col rounded-2xl border border-border/40 bg-card p-6 transition-colors",
4162
+ "hover:border-primary/30"
4163
+ ),
4164
+ children: [
4165
+ /* @__PURE__ */ jsxRuntime.jsx(
4166
+ "div",
4167
+ {
4168
+ className: cn(
4169
+ "mb-5 inline-flex h-12 w-12 items-center justify-center rounded-xl",
4170
+ "bg-primary/10 text-primary"
4171
+ ),
4172
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-6 w-6", "aria-hidden": true })
4173
+ }
4174
+ ),
4175
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-foreground mb-2", children: item.problem }),
4176
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed mb-4 flex-1", children: item.solution }),
4177
+ storyHref && /* @__PURE__ */ jsxRuntime.jsx(
4178
+ Button,
4179
+ {
4180
+ variant: "ghost",
4181
+ className: "justify-start px-0 h-auto py-0 text-sm group/link",
4182
+ asChild: true,
4183
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
4184
+ "a",
4185
+ {
4186
+ href: storyHref,
4187
+ className: "inline-flex items-center gap-1 text-primary hover:underline",
4188
+ children: [
4189
+ storyLabel,
4190
+ /* @__PURE__ */ jsxRuntime.jsx(
4191
+ lucideReact.ArrowRight,
4192
+ {
4193
+ className: "h-3.5 w-3.5 transition-transform group-hover/link:translate-x-0.5",
4194
+ "aria-hidden": "true"
4195
+ }
4196
+ )
4197
+ ]
4198
+ }
4199
+ )
4200
+ }
4201
+ )
4202
+ ]
4203
+ },
4204
+ `${item.problem}-${index}`
4205
+ );
4206
+ }) }),
4207
+ children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-12", children })
4208
+ ] })
4209
+ }
4210
+ );
4211
+ }
4212
+ function detectElectronPlatform(userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "") {
4213
+ const ua = userAgent.toLowerCase();
4214
+ if (ua.includes("win")) return "win";
4215
+ if (ua.includes("mac")) return "mac";
4216
+ if (ua.includes("linux")) return "linux";
4217
+ return "unknown";
4218
+ }
4219
+ function buildDownloadUrl(base, artifactName, platform, platformMap) {
4220
+ const normalizedBase = base.replace(/\/$/, "");
4221
+ const platformKey = platformMap[platform] ?? platform;
4222
+ const fileName = artifactName.includes("{platform}") ? artifactName.replace(/\{platform\}/g, platformKey) : artifactName;
4223
+ return `${normalizedBase}/${fileName}`;
4224
+ }
4225
+ function ElectronDownloadLink({
4226
+ downloadBaseUrl,
4227
+ artifactName,
4228
+ hidden = true,
4229
+ label = "Download desktop app",
4230
+ downloadLabel = label,
4231
+ platformMap = {},
4232
+ className,
4233
+ variant = "default",
4234
+ size = "default"
4235
+ }) {
4236
+ if (hidden) return null;
4237
+ const platform = detectElectronPlatform();
4238
+ const href = buildDownloadUrl(
4239
+ downloadBaseUrl,
4240
+ artifactName,
4241
+ platform,
4242
+ platformMap
4243
+ );
4244
+ return /* @__PURE__ */ jsxRuntime.jsx(
4245
+ Button,
4246
+ {
4247
+ variant,
4248
+ size,
4249
+ className: cn("inline-flex items-center gap-2", className),
4250
+ asChild: true,
4251
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
4252
+ "a",
4253
+ {
4254
+ href,
4255
+ download: true,
4256
+ "aria-label": `${downloadLabel}${platform !== "unknown" ? ` for ${platform}` : ""}`,
4257
+ children: [
4258
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "h-4 w-4", "aria-hidden": "true" }),
4259
+ label
4260
+ ]
4261
+ }
4262
+ )
4263
+ }
4264
+ );
4265
+ }
3941
4266
  function RybbitAnalytics({
3942
4267
  siteId,
3943
4268
  scriptUrl = "https://analytics.burdenoff.com/api/script.js",
@@ -4708,21 +5033,17 @@ function sortByDateDesc(a, b) {
4708
5033
  const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();
4709
5034
  return db - da;
4710
5035
  }
4711
- function ChangelogPage(props) {
4712
- const {
4713
- productName,
4714
- heroEyebrow = "What's new",
4715
- heroTitle = "Changelog",
4716
- heroSubtitle = "Platform updates, improvements, and announcements \u2014 newest first.",
4717
- ctaTitle,
4718
- ctaSubtitle,
4719
- ctaHref,
4720
- ctaLabel,
4721
- className = "",
4722
- seoTitle,
4723
- seoDescription,
4724
- seoKeywords
4725
- } = props;
5036
+ function normalize(value) {
5037
+ return value.toLowerCase().trim();
5038
+ }
5039
+ function paginate(items, page, pageSize) {
5040
+ const start = (page - 1) * pageSize;
5041
+ return items.slice(start, start + pageSize);
5042
+ }
5043
+ function parseEntryDate(date) {
5044
+ return new Date(date).getTime();
5045
+ }
5046
+ function useCmsChangelog() {
4726
5047
  const client = useWebSDK();
4727
5048
  const config = useWebSDKConfig();
4728
5049
  const { product } = useProduct();
@@ -4731,7 +5052,10 @@ function ChangelogPage(props) {
4731
5052
  const [loading, setLoading] = React.useState(true);
4732
5053
  const [error, setError] = React.useState(null);
4733
5054
  const fetchEntries = React.useCallback(async () => {
4734
- if (!resolvedProductId) return;
5055
+ if (!resolvedProductId) {
5056
+ setLoading(false);
5057
+ return;
5058
+ }
4735
5059
  setLoading(true);
4736
5060
  try {
4737
5061
  const listResult = await client.query(CHANGELOG_LIST_QUERY, {
@@ -4773,93 +5097,320 @@ function ChangelogPage(props) {
4773
5097
  React.useEffect(() => {
4774
5098
  fetchEntries();
4775
5099
  }, [fetchEntries]);
5100
+ return { entries, loading, error };
5101
+ }
5102
+ function CmsTimeline(props) {
5103
+ const { entries, loading, error } = props;
5104
+ if (loading) {
5105
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxRuntime.jsx(
5106
+ "div",
5107
+ {
5108
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse",
5109
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 sm:p-8 space-y-4", children: [
5110
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-3 bg-muted rounded w-1/3" }),
5111
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 bg-muted rounded w-2/3" }),
5112
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded" }),
5113
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded w-5/6" })
5114
+ ] })
5115
+ },
5116
+ i
5117
+ )) });
5118
+ }
5119
+ if (error) {
5120
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: error }) });
5121
+ }
5122
+ if (entries.length === 0) {
5123
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) });
5124
+ }
5125
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: entries.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
5126
+ "article",
5127
+ {
5128
+ id: entry.slug,
5129
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24",
5130
+ children: [
5131
+ entry.thumbnail && /* @__PURE__ */ jsxRuntime.jsx(
5132
+ "img",
5133
+ {
5134
+ src: entry.thumbnail,
5135
+ alt: "",
5136
+ width: 1024,
5137
+ height: 576,
5138
+ loading: "lazy",
5139
+ decoding: "async",
5140
+ className: "w-full aspect-video object-cover border-b border-border/40"
5141
+ }
5142
+ ),
5143
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 sm:p-8", children: [
5144
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
5145
+ entry.publishedAt && /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
5146
+ entry.author && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5147
+ " \xB7 ",
5148
+ entry.author
5149
+ ] })
5150
+ ] }),
5151
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
5152
+ entry.content ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsxRuntime.jsx(
5153
+ ContentRenderer,
5154
+ {
5155
+ content: entry.content,
5156
+ format: entry.contentFormat
5157
+ }
5158
+ ) }) : entry.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: entry.excerpt })
5159
+ ] })
5160
+ ]
5161
+ },
5162
+ entry.id
5163
+ )) });
5164
+ }
5165
+ function EntryContent({ content }) {
5166
+ if (typeof content === "string") {
5167
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsxRuntime.jsx(ContentRenderer, { content, format: "markdown" }) });
5168
+ }
5169
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "prose prose-sm max-w-none", children: content });
5170
+ }
5171
+ function EntriesTimeline(props) {
5172
+ const { entries, pageSize, productName } = props;
5173
+ const [query, setQuery] = React.useState("");
5174
+ const [selectedCategory, setSelectedCategory] = React.useState(null);
5175
+ const [page, setPage] = React.useState(1);
5176
+ const categories = React.useMemo(
5177
+ () => Array.from(new Set(entries.map((e) => e.category))).sort(),
5178
+ [entries]
5179
+ );
5180
+ const filtered = React.useMemo(() => {
5181
+ const normalized = normalize(query);
5182
+ return entries.filter((entry) => {
5183
+ if (selectedCategory && entry.category !== selectedCategory) {
5184
+ return false;
5185
+ }
5186
+ if (!normalized) return true;
5187
+ const haystack = [
5188
+ entry.title,
5189
+ entry.version,
5190
+ entry.category,
5191
+ ...entry.tags ?? [],
5192
+ typeof entry.content === "string" ? entry.content : ""
5193
+ ].join(" ").toLowerCase();
5194
+ return haystack.includes(normalized);
5195
+ }).sort((a, b) => parseEntryDate(b.date) - parseEntryDate(a.date));
5196
+ }, [entries, query, selectedCategory]);
5197
+ const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));
5198
+ const safePage = Math.min(page, totalPages);
5199
+ const pageItems = paginate(filtered, safePage, pageSize);
5200
+ React.useEffect(() => {
5201
+ setPage(1);
5202
+ }, [query, selectedCategory]);
5203
+ if (entries.length === 0) {
5204
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) });
5205
+ }
5206
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl mx-auto", children: [
5207
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 space-y-4", children: [
5208
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
5209
+ /* @__PURE__ */ jsxRuntime.jsx(
5210
+ lucideReact.Search,
5211
+ {
5212
+ className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground",
5213
+ "aria-hidden": "true"
5214
+ }
5215
+ ),
5216
+ /* @__PURE__ */ jsxRuntime.jsx(
5217
+ Input,
5218
+ {
5219
+ type: "search",
5220
+ placeholder: "Search releases, features, fixes\u2026",
5221
+ value: query,
5222
+ onChange: (e) => setQuery(e.target.value),
5223
+ className: "pl-9",
5224
+ "aria-label": "Search changelog"
5225
+ }
5226
+ )
5227
+ ] }),
5228
+ categories.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
5229
+ /* @__PURE__ */ jsxRuntime.jsx(
5230
+ "button",
5231
+ {
5232
+ type: "button",
5233
+ onClick: () => setSelectedCategory(null),
5234
+ className: cn(
5235
+ "px-3 py-1 rounded-full text-xs font-medium border transition-colors",
5236
+ selectedCategory === null ? "bg-primary text-primary-foreground border-primary" : "bg-background text-muted-foreground border-border/60 hover:border-primary/40"
5237
+ ),
5238
+ children: "All"
5239
+ }
5240
+ ),
5241
+ categories.map((category) => /* @__PURE__ */ jsxRuntime.jsx(
5242
+ "button",
5243
+ {
5244
+ type: "button",
5245
+ onClick: () => setSelectedCategory(category),
5246
+ className: cn(
5247
+ "px-3 py-1 rounded-full text-xs font-medium border transition-colors",
5248
+ selectedCategory === category ? "bg-primary text-primary-foreground border-primary" : "bg-background text-muted-foreground border-border/60 hover:border-primary/40"
5249
+ ),
5250
+ children: category
5251
+ },
5252
+ category
5253
+ ))
5254
+ ] })
5255
+ ] }),
5256
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
5257
+ /* @__PURE__ */ jsxRuntime.jsx(
5258
+ "div",
5259
+ {
5260
+ className: "absolute left-[1.125rem] top-3 bottom-3 w-px bg-border/60 hidden sm:block",
5261
+ "aria-hidden": "true"
5262
+ }
5263
+ ),
5264
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-8", children: pageItems.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
5265
+ "article",
5266
+ {
5267
+ className: "relative sm:pl-12",
5268
+ children: [
5269
+ /* @__PURE__ */ jsxRuntime.jsx(
5270
+ "div",
5271
+ {
5272
+ className: "hidden sm:flex absolute left-2 top-2 h-5 w-5 items-center justify-center rounded-full border-2 border-background bg-primary ring-1 ring-border/40",
5273
+ "aria-hidden": "true",
5274
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-2 w-2 rounded-full bg-primary-foreground" })
5275
+ }
5276
+ ),
5277
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl border border-border/40 bg-card overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 sm:p-8", children: [
5278
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2 mb-3", children: [
5279
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-md bg-primary/10 px-2 py-1 text-xs font-medium text-primary", children: entry.category }),
5280
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center rounded-md bg-muted px-2 py-1 text-xs font-mono font-medium text-muted-foreground", children: [
5281
+ "v",
5282
+ entry.version
5283
+ ] }),
5284
+ /* @__PURE__ */ jsxRuntime.jsx(
5285
+ "time",
5286
+ {
5287
+ className: "text-xs text-muted-foreground",
5288
+ dateTime: entry.date,
5289
+ children: formatDate(entry.date)
5290
+ }
5291
+ )
5292
+ ] }),
5293
+ entry.tags && entry.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5 mb-3", children: entry.tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
5294
+ "span",
5295
+ {
5296
+ className: "text-[10px] uppercase tracking-wide text-muted-foreground bg-background border border-border/40 px-1.5 py-0.5 rounded",
5297
+ children: tag
5298
+ },
5299
+ tag
5300
+ )) }),
5301
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
5302
+ /* @__PURE__ */ jsxRuntime.jsx(EntryContent, { content: entry.content })
5303
+ ] }) })
5304
+ ]
5305
+ },
5306
+ `${entry.version}-${entry.date}`
5307
+ )) })
5308
+ ] }),
5309
+ pageItems.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "No entries match your filters." }) }),
5310
+ totalPages > 1 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-10 flex items-center justify-between", children: [
5311
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
5312
+ "Page ",
5313
+ safePage,
5314
+ " of ",
5315
+ totalPages,
5316
+ " \xB7 ",
5317
+ filtered.length,
5318
+ " entries"
5319
+ ] }),
5320
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
5321
+ /* @__PURE__ */ jsxRuntime.jsx(
5322
+ Button,
5323
+ {
5324
+ variant: "outline",
5325
+ size: "sm",
5326
+ onClick: () => setPage((p) => Math.max(1, p - 1)),
5327
+ disabled: safePage <= 1,
5328
+ "aria-label": "Previous page",
5329
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
5330
+ }
5331
+ ),
5332
+ /* @__PURE__ */ jsxRuntime.jsx(
5333
+ Button,
5334
+ {
5335
+ variant: "outline",
5336
+ size: "sm",
5337
+ onClick: () => setPage((p) => Math.min(totalPages, p + 1)),
5338
+ disabled: safePage >= totalPages,
5339
+ "aria-label": "Next page",
5340
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
5341
+ }
5342
+ )
5343
+ ] })
5344
+ ] }),
5345
+ productName && pageItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("script", { type: "application/ld+json", children: JSON.stringify({
5346
+ "@context": "https://schema.org",
5347
+ "@type": "ItemList",
5348
+ name: `${productName} Changelog`,
5349
+ itemListElement: pageItems.map((entry, index) => ({
5350
+ "@type": "ListItem",
5351
+ position: (safePage - 1) * pageSize + index + 1,
5352
+ name: entry.title,
5353
+ description: typeof entry.content === "string" ? entry.content.slice(0, 200) : void 0,
5354
+ datePublished: entry.date
5355
+ }))
5356
+ }) })
5357
+ ] });
5358
+ }
5359
+ function ChangelogPage(props) {
5360
+ const {
5361
+ productName,
5362
+ heroEyebrow = "What's new",
5363
+ heroTitle = "Changelog",
5364
+ heroSubtitle = "Platform updates, improvements, and announcements \u2014 newest first.",
5365
+ ctaTitle,
5366
+ ctaSubtitle,
5367
+ ctaHref,
5368
+ ctaLabel,
5369
+ className = "",
5370
+ seoTitle,
5371
+ seoDescription,
5372
+ seoKeywords,
5373
+ entries,
5374
+ pageSize = 10
5375
+ } = props;
5376
+ const { product } = useProduct();
5377
+ const resolvedProductName = productName || product?.name;
5378
+ const cms = useCmsChangelog();
4776
5379
  const showCta = Boolean(ctaHref && ctaLabel);
5380
+ const isPropDriven = entries != null;
4777
5381
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${className}`, children: [
4778
- seoTitle && /* @__PURE__ */ jsxRuntime.jsx(
5382
+ /* @__PURE__ */ jsxRuntime.jsx(
4779
5383
  PageHead,
4780
5384
  {
4781
- title: seoTitle,
5385
+ title: seoTitle || heroTitle,
4782
5386
  description: seoDescription || heroSubtitle,
4783
- productName,
5387
+ productName: resolvedProductName,
4784
5388
  keywords: seoKeywords
4785
5389
  }
4786
5390
  ),
4787
5391
  /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-20 px-4 sm:px-6 lg:px-8 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl mx-auto", children: [
4788
5392
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/10 border border-primary/20 text-xs font-medium text-primary mb-6", children: [
4789
- /* @__PURE__ */ jsxRuntime.jsx(
4790
- "svg",
4791
- {
4792
- className: "h-3.5 w-3.5",
4793
- fill: "none",
4794
- viewBox: "0 0 24 24",
4795
- stroke: "currentColor",
4796
- children: /* @__PURE__ */ jsxRuntime.jsx(
4797
- "path",
4798
- {
4799
- strokeLinecap: "round",
4800
- strokeLinejoin: "round",
4801
- strokeWidth: 2,
4802
- d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
4803
- }
4804
- )
4805
- }
4806
- ),
5393
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.History, { className: "h-3.5 w-3.5", "aria-hidden": "true" }),
4807
5394
  heroEyebrow
4808
5395
  ] }),
4809
5396
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl sm:text-5xl font-bold text-foreground mb-4", children: heroTitle }),
4810
5397
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg text-muted-foreground", children: heroSubtitle })
4811
5398
  ] }) }),
4812
- /* @__PURE__ */ jsxRuntime.jsx("section", { className: "px-4 sm:px-6 lg:px-8 pb-20", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: loading ? [1, 2, 3].map((i) => /* @__PURE__ */ jsxRuntime.jsx(
4813
- "div",
5399
+ /* @__PURE__ */ jsxRuntime.jsx("section", { className: "px-4 sm:px-6 lg:px-8 pb-20", children: isPropDriven ? /* @__PURE__ */ jsxRuntime.jsx(
5400
+ EntriesTimeline,
4814
5401
  {
4815
- className: "rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse",
4816
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 sm:p-8 space-y-4", children: [
4817
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-3 bg-muted rounded w-1/3" }),
4818
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 bg-muted rounded w-2/3" }),
4819
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded" }),
4820
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded w-5/6" })
4821
- ] })
4822
- },
4823
- i
4824
- )) : error ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: error }) }) : entries.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) }) : entries.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
4825
- "article",
5402
+ entries,
5403
+ pageSize,
5404
+ productName: resolvedProductName
5405
+ }
5406
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
5407
+ CmsTimeline,
4826
5408
  {
4827
- id: entry.slug,
4828
- className: "rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24",
4829
- children: [
4830
- entry.thumbnail && /* @__PURE__ */ jsxRuntime.jsx(
4831
- "img",
4832
- {
4833
- src: entry.thumbnail,
4834
- alt: "",
4835
- width: 1024,
4836
- height: 576,
4837
- loading: "lazy",
4838
- decoding: "async",
4839
- className: "w-full aspect-video object-cover border-b border-border/40"
4840
- }
4841
- ),
4842
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 sm:p-8", children: [
4843
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
4844
- entry.publishedAt && /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
4845
- entry.author && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4846
- " \xB7 ",
4847
- entry.author
4848
- ] })
4849
- ] }),
4850
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
4851
- entry.content ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsxRuntime.jsx(
4852
- ContentRenderer,
4853
- {
4854
- content: entry.content,
4855
- format: entry.contentFormat
4856
- }
4857
- ) }) : entry.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: entry.excerpt })
4858
- ] })
4859
- ]
4860
- },
4861
- entry.id
4862
- )) }) }),
5409
+ entries: cms.entries,
5410
+ loading: cms.loading,
5411
+ error: cms.error
5412
+ }
5413
+ ) }),
4863
5414
  showCta && /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-14 px-4 sm:px-6 lg:px-8 bg-primary/5 border-t border-border/40", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl mx-auto text-center", children: [
4864
5415
  ctaTitle && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold text-foreground mb-3", children: ctaTitle }),
4865
5416
  ctaSubtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-7", children: ctaSubtitle }),
@@ -5674,6 +6225,180 @@ function ContractsPage(props) {
5674
6225
  ] });
5675
6226
  }
5676
6227
 
6228
+ // src/data/products.ts
6229
+ var ECOSYSTEM_PRODUCTS = [
6230
+ {
6231
+ slug: "workspaces",
6232
+ name: "Workspaces",
6233
+ websiteUrl: "https://burdenoff.com"
6234
+ },
6235
+ {
6236
+ slug: "vibecontrols",
6237
+ name: "VibeControls",
6238
+ websiteUrl: "https://vibecontrols.com"
6239
+ },
6240
+ {
6241
+ slug: "fluidgrids",
6242
+ name: "FluidGrids",
6243
+ websiteUrl: "https://fluidgrids.com"
6244
+ },
6245
+ { slug: "botlit", name: "BotLit", websiteUrl: "https://botlit.com" },
6246
+ {
6247
+ slug: "bigconsole",
6248
+ name: "BigConsole",
6249
+ websiteUrl: "https://bigconsole.com"
6250
+ },
6251
+ {
6252
+ slug: "semanticfed",
6253
+ name: "SemanticFed",
6254
+ websiteUrl: "https://semanticfed.com"
6255
+ },
6256
+ {
6257
+ slug: "intelwatchtower",
6258
+ name: "IntelWatchTower",
6259
+ websiteUrl: "https://intelwatchtower.com"
6260
+ },
6261
+ { slug: "buildmyiq", name: "BuildMyIQ", websiteUrl: "https://buildmyiq.com" },
6262
+ {
6263
+ slug: "assethandler",
6264
+ name: "AssetHandler",
6265
+ websiteUrl: "https://assethandler.com"
6266
+ },
6267
+ {
6268
+ slug: "crewfoundry",
6269
+ name: "CrewFoundry",
6270
+ websiteUrl: "https://crewfoundry.com"
6271
+ },
6272
+ {
6273
+ slug: "planmagnet",
6274
+ name: "PlanMagnet",
6275
+ websiteUrl: "https://planmagnet.com"
6276
+ },
6277
+ {
6278
+ slug: "eventfullymanaged",
6279
+ name: "EventfullyManaged",
6280
+ websiteUrl: "https://eventfullymanaged.com"
6281
+ },
6282
+ {
6283
+ slug: "headshotmarketing",
6284
+ name: "HeadshotMarketing Platform",
6285
+ websiteUrl: "https://headshotmarketing.com"
6286
+ },
6287
+ {
6288
+ slug: "technospam",
6289
+ name: "TechnoSpam",
6290
+ websiteUrl: "https://technospam.com"
6291
+ },
6292
+ { slug: "kadaikodi", name: "Kadaikodi", websiteUrl: "https://kadaikodi.com" },
6293
+ {
6294
+ slug: "movethewheels",
6295
+ name: "MoveTheWheels",
6296
+ websiteUrl: "https://movethewheels.com"
6297
+ },
6298
+ {
6299
+ slug: "healthybowl",
6300
+ name: "HealthyBowl Platform",
6301
+ websiteUrl: "https://gethealthybowl.com"
6302
+ },
6303
+ { slug: "ggnomad", name: "GGNomad", websiteUrl: "https://ggnomad.com" },
6304
+ {
6305
+ slug: "timecampus",
6306
+ name: "TimeCampus Platform",
6307
+ websiteUrl: "https://timecampus.com"
6308
+ },
6309
+ {
6310
+ slug: "manufacturedops",
6311
+ name: "ManufacturedOps",
6312
+ websiteUrl: "https://manufacturedops.com"
6313
+ },
6314
+ {
6315
+ slug: "theglobalfuel",
6316
+ name: "TheGlobalFuel",
6317
+ websiteUrl: "https://theglobalfuel.com"
6318
+ },
6319
+ {
6320
+ slug: "housingvista",
6321
+ name: "HousingVista",
6322
+ websiteUrl: "https://housingvista.com"
6323
+ },
6324
+ {
6325
+ slug: "proserviceworld",
6326
+ name: "ProServiceWorld",
6327
+ websiteUrl: "https://proserviceworld.com"
6328
+ },
6329
+ {
6330
+ slug: "mybodyshield",
6331
+ name: "MyBodyShield",
6332
+ websiteUrl: "https://mybodyshield.com"
6333
+ },
6334
+ {
6335
+ slug: "artistrybase",
6336
+ name: "ArtistryBase",
6337
+ websiteUrl: "https://artistrybase.com"
6338
+ },
6339
+ {
6340
+ slug: "theculturepost",
6341
+ name: "TheCulturePost",
6342
+ websiteUrl: "https://theculturepost.com"
6343
+ },
6344
+ { slug: "collabkin", name: "CollabKin", websiteUrl: "https://collabkin.com" },
6345
+ {
6346
+ slug: "comradecircle",
6347
+ name: "ComradeCircle",
6348
+ websiteUrl: "https://comradecircle.com"
6349
+ },
6350
+ {
6351
+ slug: "brainyrich",
6352
+ name: "BrainyRich",
6353
+ websiteUrl: "https://brainyrich.com"
6354
+ },
6355
+ {
6356
+ slug: "cosmicintersection",
6357
+ name: "CosmicIntersection",
6358
+ websiteUrl: "https://cosmicintersection.com"
6359
+ },
6360
+ {
6361
+ slug: "govcitizenhub",
6362
+ name: "GovCitizenHub",
6363
+ websiteUrl: "https://govcitizenhub.com"
6364
+ },
6365
+ {
6366
+ slug: "adaptercloud",
6367
+ name: "AdapterCloud",
6368
+ websiteUrl: "https://adaptercloud.com"
6369
+ },
6370
+ {
6371
+ slug: "subscriberbot",
6372
+ name: "SubscriberBot",
6373
+ websiteUrl: "https://subscriberbot.com"
6374
+ },
6375
+ {
6376
+ slug: "hookmovies",
6377
+ name: "HookMovies",
6378
+ websiteUrl: "https://hookmovies.com"
6379
+ },
6380
+ {
6381
+ slug: "coolandlovely",
6382
+ name: "CoolAndLovely",
6383
+ websiteUrl: "https://coolandlovely.com"
6384
+ },
6385
+ {
6386
+ slug: "atheletebridge",
6387
+ name: "AthleteBridge",
6388
+ websiteUrl: "https://atheletebridge.com"
6389
+ },
6390
+ {
6391
+ slug: "labsofscience",
6392
+ name: "LabsOfScience",
6393
+ websiteUrl: "https://labsofscience.com"
6394
+ },
6395
+ {
6396
+ slug: "ecoimpacthub",
6397
+ name: "EcoImpactHub",
6398
+ websiteUrl: "https://ecoimpacthub.com"
6399
+ }
6400
+ ];
6401
+
5677
6402
  exports.BlogListPage = BlogListPage;
5678
6403
  exports.BlogPostPage = BlogPostPage;
5679
6404
  exports.Button = Button;
@@ -5685,8 +6410,11 @@ exports.ContactPage = ContactPage;
5685
6410
  exports.ContentRenderer = ContentRenderer;
5686
6411
  exports.ContractsPage = ContractsPage;
5687
6412
  exports.DEFAULT_CONTACT_CATEGORIES = DEFAULT_CONTACT_CATEGORIES;
6413
+ exports.ECOSYSTEM_PRODUCTS = ECOSYSTEM_PRODUCTS;
6414
+ exports.ElectronDownloadLink = ElectronDownloadLink;
5688
6415
  exports.Input = Input;
5689
6416
  exports.Label = Label;
6417
+ exports.LaunchCountdown = LaunchCountdown;
5690
6418
  exports.NewsletterForm = NewsletterForm;
5691
6419
  exports.NewsletterPage = NewsletterPage;
5692
6420
  exports.PageHead = PageHead;
@@ -5694,6 +6422,7 @@ exports.PartnersPage = PartnersPage;
5694
6422
  exports.PressKitPage = PressKitPage;
5695
6423
  exports.PricingPage = PricingPage;
5696
6424
  exports.PricingSection = PricingSection;
6425
+ exports.ProblemsSolvedSection = ProblemsSolvedSection;
5697
6426
  exports.ProductProvider = ProductProvider;
5698
6427
  exports.ResourceLinks = ResourceLinks;
5699
6428
  exports.RybbitAnalytics = RybbitAnalytics;
@@ -5705,8 +6434,10 @@ exports.WaitlistForm = WaitlistForm;
5705
6434
  exports.WaitlistPage = WaitlistPage;
5706
6435
  exports.WebSDKClient = WebSDKClient;
5707
6436
  exports.WebSDKProvider = WebSDKProvider;
6437
+ exports.WebsiteSwitcher = WebsiteSwitcher;
5708
6438
  exports.buttonVariants = buttonVariants;
5709
6439
  exports.cn = cn;
6440
+ exports.detectElectronPlatform = detectElectronPlatform;
5710
6441
  exports.useContentPage = useContentPage;
5711
6442
  exports.useContentPages = useContentPages;
5712
6443
  exports.useProduct = useProduct;