@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.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { createContext, useMemo, useContext, useState, useCallback, useLayoutEffect, useRef, useEffect } from 'react';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
- import { Instagram, Youtube, Facebook, Github, Linkedin, Twitter, Mail, Phone, MapPin, Clock, Send, CheckCircle, Upload, FileText, Download } from 'lucide-react';
4
+ import { Instagram, Youtube, Facebook, Github, Linkedin, Twitter, Mail, Phone, MapPin, Clock, Send, CheckCircle, Upload, Globe, ChevronDown, Search, Rocket, ArrowRight, Download, History, ChevronLeft, ChevronRight, FileText } from 'lucide-react';
5
5
  import ReCAPTCHA3 from 'react-google-recaptcha';
6
6
  import { toast } from 'sonner';
7
7
  import { Helmet } from 'react-helmet-async';
@@ -13,6 +13,7 @@ import * as LabelPrimitive from '@radix-ui/react-label';
13
13
  import { zodResolver } from '@hookform/resolvers/zod';
14
14
  import { useForm } from 'react-hook-form';
15
15
  import { z } from 'zod';
16
+ import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
16
17
 
17
18
  var __defProp = Object.defineProperty;
18
19
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -3913,6 +3914,329 @@ function ResourceLinks({
3913
3914
  }
3914
3915
  ) }, resource)) });
3915
3916
  }
3917
+ function normalizeSearch(value) {
3918
+ return value.toLowerCase().trim();
3919
+ }
3920
+ function filterProducts(products, query) {
3921
+ const normalized = normalizeSearch(query);
3922
+ if (!normalized) return products;
3923
+ return products.filter((p) => normalizeSearch(p.name).includes(normalized));
3924
+ }
3925
+ function WebsiteSwitcher({
3926
+ products,
3927
+ triggerLabel = "Explore products",
3928
+ searchPlaceholder = "Find a product\u2026",
3929
+ emptyText = "No products match your search.",
3930
+ className
3931
+ }) {
3932
+ const [open, setOpen] = useState(false);
3933
+ const [query, setQuery] = useState("");
3934
+ const filtered = useMemo(
3935
+ () => filterProducts(products, query),
3936
+ [products, query]
3937
+ );
3938
+ return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
3939
+ /* @__PURE__ */ jsxs(
3940
+ DropdownMenu.Trigger,
3941
+ {
3942
+ className: cn(
3943
+ "inline-flex items-center gap-1.5 text-sm font-medium transition-colors",
3944
+ "text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring rounded-md",
3945
+ className
3946
+ ),
3947
+ "aria-label": triggerLabel,
3948
+ children: [
3949
+ /* @__PURE__ */ jsx(Globe, { className: "h-4 w-4", "aria-hidden": "true" }),
3950
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: triggerLabel }),
3951
+ /* @__PURE__ */ jsx(
3952
+ ChevronDown,
3953
+ {
3954
+ className: cn(
3955
+ "h-3.5 w-3.5 transition-transform duration-200",
3956
+ open && "rotate-180"
3957
+ ),
3958
+ "aria-hidden": "true"
3959
+ }
3960
+ )
3961
+ ]
3962
+ }
3963
+ ),
3964
+ /* @__PURE__ */ jsx(DropdownMenu.Portal, { children: /* @__PURE__ */ jsxs(
3965
+ DropdownMenu.Content,
3966
+ {
3967
+ 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",
3968
+ sideOffset: 8,
3969
+ align: "end",
3970
+ avoidCollisions: true,
3971
+ children: [
3972
+ /* @__PURE__ */ jsxs("div", { className: "px-2 pb-2 pt-1", children: [
3973
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: "Burdenoff ecosystem" }),
3974
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
3975
+ /* @__PURE__ */ jsx(
3976
+ Search,
3977
+ {
3978
+ className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground",
3979
+ "aria-hidden": "true"
3980
+ }
3981
+ ),
3982
+ /* @__PURE__ */ jsx(
3983
+ Input,
3984
+ {
3985
+ type: "search",
3986
+ value: query,
3987
+ onChange: (e) => setQuery(e.target.value),
3988
+ placeholder: searchPlaceholder,
3989
+ className: "h-8 pl-8 text-sm",
3990
+ "aria-label": searchPlaceholder,
3991
+ onKeyDown: (e) => {
3992
+ if (e.key === "Escape") {
3993
+ setQuery("");
3994
+ }
3995
+ }
3996
+ }
3997
+ )
3998
+ ] })
3999
+ ] }),
4000
+ /* @__PURE__ */ jsx(DropdownMenu.Separator, { className: "my-1 h-px bg-border/60" }),
4001
+ /* @__PURE__ */ jsx("div", { className: "max-h-[min(60vh,24rem)] overflow-y-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-3 py-4 text-center text-sm text-muted-foreground", children: emptyText }) : filtered.map((product) => /* @__PURE__ */ jsx(DropdownMenu.Item, { asChild: true, children: /* @__PURE__ */ jsxs(
4002
+ "a",
4003
+ {
4004
+ href: product.websiteUrl,
4005
+ target: "_blank",
4006
+ rel: "noopener noreferrer",
4007
+ className: cn(
4008
+ "flex items-center gap-3 rounded-md px-2 py-2 text-sm outline-none",
4009
+ "text-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground"
4010
+ ),
4011
+ children: [
4012
+ product.logoUrl ? /* @__PURE__ */ jsx(
4013
+ "img",
4014
+ {
4015
+ src: product.logoUrl,
4016
+ alt: "",
4017
+ "aria-hidden": "true",
4018
+ className: "h-5 w-5 shrink-0 rounded object-contain"
4019
+ }
4020
+ ) : /* @__PURE__ */ 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) }),
4021
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: product.name })
4022
+ ]
4023
+ }
4024
+ ) }, product.slug)) }),
4025
+ /* @__PURE__ */ jsx(DropdownMenu.Arrow, { className: "fill-popover" })
4026
+ ]
4027
+ }
4028
+ ) })
4029
+ ] });
4030
+ }
4031
+ function splitRemaining(ms) {
4032
+ const clamped = Math.max(0, ms);
4033
+ const totalSeconds = Math.floor(clamped / 1e3);
4034
+ return {
4035
+ days: Math.floor(totalSeconds / 86400),
4036
+ hours: Math.floor(totalSeconds % 86400 / 3600),
4037
+ minutes: Math.floor(totalSeconds % 3600 / 60),
4038
+ seconds: totalSeconds % 60
4039
+ };
4040
+ }
4041
+ function padTwo(n) {
4042
+ return String(n).padStart(2, "0");
4043
+ }
4044
+ function LaunchCountdown({
4045
+ launchDate,
4046
+ launchLabel,
4047
+ launchedMessage = "We have launched!",
4048
+ className
4049
+ }) {
4050
+ const [now, setNow] = useState(() => Date.now());
4051
+ const remainingMs = launchDate - now;
4052
+ const hasLaunched = remainingMs <= 0;
4053
+ useEffect(() => {
4054
+ if (hasLaunched) return;
4055
+ const interval = setInterval(() => {
4056
+ setNow(Date.now());
4057
+ }, 1e3);
4058
+ return () => clearInterval(interval);
4059
+ }, [hasLaunched]);
4060
+ const { days, hours, minutes, seconds } = splitRemaining(remainingMs);
4061
+ const cells = [
4062
+ { label: "Days", value: padTwo(Math.min(days, 99)) },
4063
+ { label: "Hours", value: padTwo(hours) },
4064
+ { label: "Minutes", value: padTwo(minutes) },
4065
+ { label: "Seconds", value: padTwo(seconds) }
4066
+ ];
4067
+ return /* @__PURE__ */ jsxs(
4068
+ "div",
4069
+ {
4070
+ className: cn("inline-flex flex-col gap-3", className),
4071
+ role: "timer",
4072
+ "aria-label": launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`),
4073
+ children: [
4074
+ !hasLaunched && /* @__PURE__ */ jsx("span", { className: "text-xs font-mono uppercase tracking-wider text-muted-foreground", children: "Launching in" }),
4075
+ /* @__PURE__ */ jsx("div", { className: "flex gap-2 sm:gap-3", children: hasLaunched ? /* @__PURE__ */ jsxs(
4076
+ "div",
4077
+ {
4078
+ className: cn(
4079
+ "flex min-w-[15rem] items-center justify-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-6 py-4",
4080
+ "text-center"
4081
+ ),
4082
+ children: [
4083
+ /* @__PURE__ */ jsx(Rocket, { className: "h-5 w-5 text-primary", "aria-hidden": "true" }),
4084
+ /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-foreground", children: launchedMessage })
4085
+ ]
4086
+ }
4087
+ ) : cells.map((cell) => /* @__PURE__ */ jsxs(
4088
+ "div",
4089
+ {
4090
+ className: cn(
4091
+ "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"
4092
+ ),
4093
+ children: [
4094
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-2xl font-bold tabular-nums text-foreground sm:text-3xl", children: cell.value }),
4095
+ /* @__PURE__ */ jsx("span", { className: "mt-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground sm:text-xs", children: cell.label })
4096
+ ]
4097
+ },
4098
+ cell.label
4099
+ )) }),
4100
+ !hasLaunched && launchLabel && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: launchLabel })
4101
+ ]
4102
+ }
4103
+ );
4104
+ }
4105
+ function ProblemsSolvedSection({
4106
+ eyebrow,
4107
+ title,
4108
+ subtitle,
4109
+ problems,
4110
+ storyBasePath = "/use-cases",
4111
+ storyLabel = "See the story",
4112
+ className,
4113
+ children
4114
+ }) {
4115
+ return /* @__PURE__ */ jsx(
4116
+ "section",
4117
+ {
4118
+ className: cn(
4119
+ "py-16 md:py-24 px-4 sm:px-6 lg:px-8 bg-muted/30",
4120
+ className
4121
+ ),
4122
+ children: /* @__PURE__ */ jsxs("div", { className: "max-w-7xl mx-auto", children: [
4123
+ (eyebrow || title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto text-center mb-12 md:mb-16", children: [
4124
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-xs font-mono uppercase tracking-widest text-primary mb-4", children: eyebrow }),
4125
+ title && /* @__PURE__ */ jsx("h2", { className: "text-3xl sm:text-4xl font-bold text-foreground mb-4", children: title }),
4126
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: subtitle })
4127
+ ] }),
4128
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: problems.map((item, index) => {
4129
+ const Icon = item.icon;
4130
+ const storyHref = item.storySlug ? `${storyBasePath.replace(/\/$/, "")}/${item.storySlug}` : null;
4131
+ return /* @__PURE__ */ jsxs(
4132
+ "div",
4133
+ {
4134
+ className: cn(
4135
+ "group relative flex flex-col rounded-2xl border border-border/40 bg-card p-6 transition-colors",
4136
+ "hover:border-primary/30"
4137
+ ),
4138
+ children: [
4139
+ /* @__PURE__ */ jsx(
4140
+ "div",
4141
+ {
4142
+ className: cn(
4143
+ "mb-5 inline-flex h-12 w-12 items-center justify-center rounded-xl",
4144
+ "bg-primary/10 text-primary"
4145
+ ),
4146
+ children: /* @__PURE__ */ jsx(Icon, { className: "h-6 w-6", "aria-hidden": true })
4147
+ }
4148
+ ),
4149
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground mb-2", children: item.problem }),
4150
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed mb-4 flex-1", children: item.solution }),
4151
+ storyHref && /* @__PURE__ */ jsx(
4152
+ Button,
4153
+ {
4154
+ variant: "ghost",
4155
+ className: "justify-start px-0 h-auto py-0 text-sm group/link",
4156
+ asChild: true,
4157
+ children: /* @__PURE__ */ jsxs(
4158
+ "a",
4159
+ {
4160
+ href: storyHref,
4161
+ className: "inline-flex items-center gap-1 text-primary hover:underline",
4162
+ children: [
4163
+ storyLabel,
4164
+ /* @__PURE__ */ jsx(
4165
+ ArrowRight,
4166
+ {
4167
+ className: "h-3.5 w-3.5 transition-transform group-hover/link:translate-x-0.5",
4168
+ "aria-hidden": "true"
4169
+ }
4170
+ )
4171
+ ]
4172
+ }
4173
+ )
4174
+ }
4175
+ )
4176
+ ]
4177
+ },
4178
+ `${item.problem}-${index}`
4179
+ );
4180
+ }) }),
4181
+ children && /* @__PURE__ */ jsx("div", { className: "mt-12", children })
4182
+ ] })
4183
+ }
4184
+ );
4185
+ }
4186
+ function detectElectronPlatform(userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "") {
4187
+ const ua = userAgent.toLowerCase();
4188
+ if (ua.includes("win")) return "win";
4189
+ if (ua.includes("mac")) return "mac";
4190
+ if (ua.includes("linux")) return "linux";
4191
+ return "unknown";
4192
+ }
4193
+ function buildDownloadUrl(base, artifactName, platform, platformMap) {
4194
+ const normalizedBase = base.replace(/\/$/, "");
4195
+ const platformKey = platformMap[platform] ?? platform;
4196
+ const fileName = artifactName.includes("{platform}") ? artifactName.replace(/\{platform\}/g, platformKey) : artifactName;
4197
+ return `${normalizedBase}/${fileName}`;
4198
+ }
4199
+ function ElectronDownloadLink({
4200
+ downloadBaseUrl,
4201
+ artifactName,
4202
+ hidden = true,
4203
+ label = "Download desktop app",
4204
+ downloadLabel = label,
4205
+ platformMap = {},
4206
+ className,
4207
+ variant = "default",
4208
+ size = "default"
4209
+ }) {
4210
+ if (hidden) return null;
4211
+ const platform = detectElectronPlatform();
4212
+ const href = buildDownloadUrl(
4213
+ downloadBaseUrl,
4214
+ artifactName,
4215
+ platform,
4216
+ platformMap
4217
+ );
4218
+ return /* @__PURE__ */ jsx(
4219
+ Button,
4220
+ {
4221
+ variant,
4222
+ size,
4223
+ className: cn("inline-flex items-center gap-2", className),
4224
+ asChild: true,
4225
+ children: /* @__PURE__ */ jsxs(
4226
+ "a",
4227
+ {
4228
+ href,
4229
+ download: true,
4230
+ "aria-label": `${downloadLabel}${platform !== "unknown" ? ` for ${platform}` : ""}`,
4231
+ children: [
4232
+ /* @__PURE__ */ jsx(Download, { className: "h-4 w-4", "aria-hidden": "true" }),
4233
+ label
4234
+ ]
4235
+ }
4236
+ )
4237
+ }
4238
+ );
4239
+ }
3916
4240
  function RybbitAnalytics({
3917
4241
  siteId,
3918
4242
  scriptUrl = "https://analytics.burdenoff.com/api/script.js",
@@ -4683,21 +5007,17 @@ function sortByDateDesc(a, b) {
4683
5007
  const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();
4684
5008
  return db - da;
4685
5009
  }
4686
- function ChangelogPage(props) {
4687
- const {
4688
- productName,
4689
- heroEyebrow = "What's new",
4690
- heroTitle = "Changelog",
4691
- heroSubtitle = "Platform updates, improvements, and announcements \u2014 newest first.",
4692
- ctaTitle,
4693
- ctaSubtitle,
4694
- ctaHref,
4695
- ctaLabel,
4696
- className = "",
4697
- seoTitle,
4698
- seoDescription,
4699
- seoKeywords
4700
- } = props;
5010
+ function normalize(value) {
5011
+ return value.toLowerCase().trim();
5012
+ }
5013
+ function paginate(items, page, pageSize) {
5014
+ const start = (page - 1) * pageSize;
5015
+ return items.slice(start, start + pageSize);
5016
+ }
5017
+ function parseEntryDate(date) {
5018
+ return new Date(date).getTime();
5019
+ }
5020
+ function useCmsChangelog() {
4701
5021
  const client = useWebSDK();
4702
5022
  const config = useWebSDKConfig();
4703
5023
  const { product } = useProduct();
@@ -4706,7 +5026,10 @@ function ChangelogPage(props) {
4706
5026
  const [loading, setLoading] = useState(true);
4707
5027
  const [error, setError] = useState(null);
4708
5028
  const fetchEntries = useCallback(async () => {
4709
- if (!resolvedProductId) return;
5029
+ if (!resolvedProductId) {
5030
+ setLoading(false);
5031
+ return;
5032
+ }
4710
5033
  setLoading(true);
4711
5034
  try {
4712
5035
  const listResult = await client.query(CHANGELOG_LIST_QUERY, {
@@ -4748,93 +5071,320 @@ function ChangelogPage(props) {
4748
5071
  useEffect(() => {
4749
5072
  fetchEntries();
4750
5073
  }, [fetchEntries]);
5074
+ return { entries, loading, error };
5075
+ }
5076
+ function CmsTimeline(props) {
5077
+ const { entries, loading, error } = props;
5078
+ if (loading) {
5079
+ return /* @__PURE__ */ jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(
5080
+ "div",
5081
+ {
5082
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse",
5083
+ children: /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8 space-y-4", children: [
5084
+ /* @__PURE__ */ jsx("div", { className: "h-3 bg-muted rounded w-1/3" }),
5085
+ /* @__PURE__ */ jsx("div", { className: "h-6 bg-muted rounded w-2/3" }),
5086
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }),
5087
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-5/6" })
5088
+ ] })
5089
+ },
5090
+ i
5091
+ )) });
5092
+ }
5093
+ if (error) {
5094
+ return /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: error }) });
5095
+ }
5096
+ if (entries.length === 0) {
5097
+ return /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) });
5098
+ }
5099
+ return /* @__PURE__ */ jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: entries.map((entry) => /* @__PURE__ */ jsxs(
5100
+ "article",
5101
+ {
5102
+ id: entry.slug,
5103
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24",
5104
+ children: [
5105
+ entry.thumbnail && /* @__PURE__ */ jsx(
5106
+ "img",
5107
+ {
5108
+ src: entry.thumbnail,
5109
+ alt: "",
5110
+ width: 1024,
5111
+ height: 576,
5112
+ loading: "lazy",
5113
+ decoding: "async",
5114
+ className: "w-full aspect-video object-cover border-b border-border/40"
5115
+ }
5116
+ ),
5117
+ /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8", children: [
5118
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
5119
+ entry.publishedAt && /* @__PURE__ */ jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
5120
+ entry.author && /* @__PURE__ */ jsxs(Fragment, { children: [
5121
+ " \xB7 ",
5122
+ entry.author
5123
+ ] })
5124
+ ] }),
5125
+ /* @__PURE__ */ jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
5126
+ entry.content ? /* @__PURE__ */ jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(
5127
+ ContentRenderer,
5128
+ {
5129
+ content: entry.content,
5130
+ format: entry.contentFormat
5131
+ }
5132
+ ) }) : entry.excerpt && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: entry.excerpt })
5133
+ ] })
5134
+ ]
5135
+ },
5136
+ entry.id
5137
+ )) });
5138
+ }
5139
+ function EntryContent({ content }) {
5140
+ if (typeof content === "string") {
5141
+ return /* @__PURE__ */ jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(ContentRenderer, { content, format: "markdown" }) });
5142
+ }
5143
+ return /* @__PURE__ */ jsx("div", { className: "prose prose-sm max-w-none", children: content });
5144
+ }
5145
+ function EntriesTimeline(props) {
5146
+ const { entries, pageSize, productName } = props;
5147
+ const [query, setQuery] = useState("");
5148
+ const [selectedCategory, setSelectedCategory] = useState(null);
5149
+ const [page, setPage] = useState(1);
5150
+ const categories = useMemo(
5151
+ () => Array.from(new Set(entries.map((e) => e.category))).sort(),
5152
+ [entries]
5153
+ );
5154
+ const filtered = useMemo(() => {
5155
+ const normalized = normalize(query);
5156
+ return entries.filter((entry) => {
5157
+ if (selectedCategory && entry.category !== selectedCategory) {
5158
+ return false;
5159
+ }
5160
+ if (!normalized) return true;
5161
+ const haystack = [
5162
+ entry.title,
5163
+ entry.version,
5164
+ entry.category,
5165
+ ...entry.tags ?? [],
5166
+ typeof entry.content === "string" ? entry.content : ""
5167
+ ].join(" ").toLowerCase();
5168
+ return haystack.includes(normalized);
5169
+ }).sort((a, b) => parseEntryDate(b.date) - parseEntryDate(a.date));
5170
+ }, [entries, query, selectedCategory]);
5171
+ const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));
5172
+ const safePage = Math.min(page, totalPages);
5173
+ const pageItems = paginate(filtered, safePage, pageSize);
5174
+ useEffect(() => {
5175
+ setPage(1);
5176
+ }, [query, selectedCategory]);
5177
+ if (entries.length === 0) {
5178
+ return /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) });
5179
+ }
5180
+ return /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto", children: [
5181
+ /* @__PURE__ */ jsxs("div", { className: "mb-8 space-y-4", children: [
5182
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
5183
+ /* @__PURE__ */ jsx(
5184
+ Search,
5185
+ {
5186
+ className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground",
5187
+ "aria-hidden": "true"
5188
+ }
5189
+ ),
5190
+ /* @__PURE__ */ jsx(
5191
+ Input,
5192
+ {
5193
+ type: "search",
5194
+ placeholder: "Search releases, features, fixes\u2026",
5195
+ value: query,
5196
+ onChange: (e) => setQuery(e.target.value),
5197
+ className: "pl-9",
5198
+ "aria-label": "Search changelog"
5199
+ }
5200
+ )
5201
+ ] }),
5202
+ categories.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
5203
+ /* @__PURE__ */ jsx(
5204
+ "button",
5205
+ {
5206
+ type: "button",
5207
+ onClick: () => setSelectedCategory(null),
5208
+ className: cn(
5209
+ "px-3 py-1 rounded-full text-xs font-medium border transition-colors",
5210
+ selectedCategory === null ? "bg-primary text-primary-foreground border-primary" : "bg-background text-muted-foreground border-border/60 hover:border-primary/40"
5211
+ ),
5212
+ children: "All"
5213
+ }
5214
+ ),
5215
+ categories.map((category) => /* @__PURE__ */ jsx(
5216
+ "button",
5217
+ {
5218
+ type: "button",
5219
+ onClick: () => setSelectedCategory(category),
5220
+ className: cn(
5221
+ "px-3 py-1 rounded-full text-xs font-medium border transition-colors",
5222
+ selectedCategory === category ? "bg-primary text-primary-foreground border-primary" : "bg-background text-muted-foreground border-border/60 hover:border-primary/40"
5223
+ ),
5224
+ children: category
5225
+ },
5226
+ category
5227
+ ))
5228
+ ] })
5229
+ ] }),
5230
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
5231
+ /* @__PURE__ */ jsx(
5232
+ "div",
5233
+ {
5234
+ className: "absolute left-[1.125rem] top-3 bottom-3 w-px bg-border/60 hidden sm:block",
5235
+ "aria-hidden": "true"
5236
+ }
5237
+ ),
5238
+ /* @__PURE__ */ jsx("div", { className: "space-y-8", children: pageItems.map((entry) => /* @__PURE__ */ jsxs(
5239
+ "article",
5240
+ {
5241
+ className: "relative sm:pl-12",
5242
+ children: [
5243
+ /* @__PURE__ */ jsx(
5244
+ "div",
5245
+ {
5246
+ 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",
5247
+ "aria-hidden": "true",
5248
+ children: /* @__PURE__ */ jsx("span", { className: "h-2 w-2 rounded-full bg-primary-foreground" })
5249
+ }
5250
+ ),
5251
+ /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border/40 bg-card overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8", children: [
5252
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 mb-3", children: [
5253
+ /* @__PURE__ */ 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 }),
5254
+ /* @__PURE__ */ 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: [
5255
+ "v",
5256
+ entry.version
5257
+ ] }),
5258
+ /* @__PURE__ */ jsx(
5259
+ "time",
5260
+ {
5261
+ className: "text-xs text-muted-foreground",
5262
+ dateTime: entry.date,
5263
+ children: formatDate(entry.date)
5264
+ }
5265
+ )
5266
+ ] }),
5267
+ entry.tags && entry.tags.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 mb-3", children: entry.tags.map((tag) => /* @__PURE__ */ jsx(
5268
+ "span",
5269
+ {
5270
+ className: "text-[10px] uppercase tracking-wide text-muted-foreground bg-background border border-border/40 px-1.5 py-0.5 rounded",
5271
+ children: tag
5272
+ },
5273
+ tag
5274
+ )) }),
5275
+ /* @__PURE__ */ jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
5276
+ /* @__PURE__ */ jsx(EntryContent, { content: entry.content })
5277
+ ] }) })
5278
+ ]
5279
+ },
5280
+ `${entry.version}-${entry.date}`
5281
+ )) })
5282
+ ] }),
5283
+ pageItems.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No entries match your filters." }) }),
5284
+ totalPages > 1 && /* @__PURE__ */ jsxs("div", { className: "mt-10 flex items-center justify-between", children: [
5285
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
5286
+ "Page ",
5287
+ safePage,
5288
+ " of ",
5289
+ totalPages,
5290
+ " \xB7 ",
5291
+ filtered.length,
5292
+ " entries"
5293
+ ] }),
5294
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
5295
+ /* @__PURE__ */ jsx(
5296
+ Button,
5297
+ {
5298
+ variant: "outline",
5299
+ size: "sm",
5300
+ onClick: () => setPage((p) => Math.max(1, p - 1)),
5301
+ disabled: safePage <= 1,
5302
+ "aria-label": "Previous page",
5303
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
5304
+ }
5305
+ ),
5306
+ /* @__PURE__ */ jsx(
5307
+ Button,
5308
+ {
5309
+ variant: "outline",
5310
+ size: "sm",
5311
+ onClick: () => setPage((p) => Math.min(totalPages, p + 1)),
5312
+ disabled: safePage >= totalPages,
5313
+ "aria-label": "Next page",
5314
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
5315
+ }
5316
+ )
5317
+ ] })
5318
+ ] }),
5319
+ productName && pageItems.length > 0 && /* @__PURE__ */ jsx("script", { type: "application/ld+json", children: JSON.stringify({
5320
+ "@context": "https://schema.org",
5321
+ "@type": "ItemList",
5322
+ name: `${productName} Changelog`,
5323
+ itemListElement: pageItems.map((entry, index) => ({
5324
+ "@type": "ListItem",
5325
+ position: (safePage - 1) * pageSize + index + 1,
5326
+ name: entry.title,
5327
+ description: typeof entry.content === "string" ? entry.content.slice(0, 200) : void 0,
5328
+ datePublished: entry.date
5329
+ }))
5330
+ }) })
5331
+ ] });
5332
+ }
5333
+ function ChangelogPage(props) {
5334
+ const {
5335
+ productName,
5336
+ heroEyebrow = "What's new",
5337
+ heroTitle = "Changelog",
5338
+ heroSubtitle = "Platform updates, improvements, and announcements \u2014 newest first.",
5339
+ ctaTitle,
5340
+ ctaSubtitle,
5341
+ ctaHref,
5342
+ ctaLabel,
5343
+ className = "",
5344
+ seoTitle,
5345
+ seoDescription,
5346
+ seoKeywords,
5347
+ entries,
5348
+ pageSize = 10
5349
+ } = props;
5350
+ const { product } = useProduct();
5351
+ const resolvedProductName = productName || product?.name;
5352
+ const cms = useCmsChangelog();
4751
5353
  const showCta = Boolean(ctaHref && ctaLabel);
5354
+ const isPropDriven = entries != null;
4752
5355
  return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
4753
- seoTitle && /* @__PURE__ */ jsx(
5356
+ /* @__PURE__ */ jsx(
4754
5357
  PageHead,
4755
5358
  {
4756
- title: seoTitle,
5359
+ title: seoTitle || heroTitle,
4757
5360
  description: seoDescription || heroSubtitle,
4758
- productName,
5361
+ productName: resolvedProductName,
4759
5362
  keywords: seoKeywords
4760
5363
  }
4761
5364
  ),
4762
5365
  /* @__PURE__ */ jsx("section", { className: "py-16 md:py-20 px-4 sm:px-6 lg:px-8 text-center", children: /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto", children: [
4763
5366
  /* @__PURE__ */ 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: [
4764
- /* @__PURE__ */ jsx(
4765
- "svg",
4766
- {
4767
- className: "h-3.5 w-3.5",
4768
- fill: "none",
4769
- viewBox: "0 0 24 24",
4770
- stroke: "currentColor",
4771
- children: /* @__PURE__ */ jsx(
4772
- "path",
4773
- {
4774
- strokeLinecap: "round",
4775
- strokeLinejoin: "round",
4776
- strokeWidth: 2,
4777
- d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
4778
- }
4779
- )
4780
- }
4781
- ),
5367
+ /* @__PURE__ */ jsx(History, { className: "h-3.5 w-3.5", "aria-hidden": "true" }),
4782
5368
  heroEyebrow
4783
5369
  ] }),
4784
5370
  /* @__PURE__ */ jsx("h1", { className: "text-4xl sm:text-5xl font-bold text-foreground mb-4", children: heroTitle }),
4785
5371
  /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: heroSubtitle })
4786
5372
  ] }) }),
4787
- /* @__PURE__ */ jsx("section", { className: "px-4 sm:px-6 lg:px-8 pb-20", children: /* @__PURE__ */ jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: loading ? [1, 2, 3].map((i) => /* @__PURE__ */ jsx(
4788
- "div",
5373
+ /* @__PURE__ */ jsx("section", { className: "px-4 sm:px-6 lg:px-8 pb-20", children: isPropDriven ? /* @__PURE__ */ jsx(
5374
+ EntriesTimeline,
4789
5375
  {
4790
- className: "rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse",
4791
- children: /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8 space-y-4", children: [
4792
- /* @__PURE__ */ jsx("div", { className: "h-3 bg-muted rounded w-1/3" }),
4793
- /* @__PURE__ */ jsx("div", { className: "h-6 bg-muted rounded w-2/3" }),
4794
- /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }),
4795
- /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-5/6" })
4796
- ] })
4797
- },
4798
- i
4799
- )) : error ? /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: error }) }) : entries.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) }) : entries.map((entry) => /* @__PURE__ */ jsxs(
4800
- "article",
5376
+ entries,
5377
+ pageSize,
5378
+ productName: resolvedProductName
5379
+ }
5380
+ ) : /* @__PURE__ */ jsx(
5381
+ CmsTimeline,
4801
5382
  {
4802
- id: entry.slug,
4803
- className: "rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24",
4804
- children: [
4805
- entry.thumbnail && /* @__PURE__ */ jsx(
4806
- "img",
4807
- {
4808
- src: entry.thumbnail,
4809
- alt: "",
4810
- width: 1024,
4811
- height: 576,
4812
- loading: "lazy",
4813
- decoding: "async",
4814
- className: "w-full aspect-video object-cover border-b border-border/40"
4815
- }
4816
- ),
4817
- /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8", children: [
4818
- /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
4819
- entry.publishedAt && /* @__PURE__ */ jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
4820
- entry.author && /* @__PURE__ */ jsxs(Fragment, { children: [
4821
- " \xB7 ",
4822
- entry.author
4823
- ] })
4824
- ] }),
4825
- /* @__PURE__ */ jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
4826
- entry.content ? /* @__PURE__ */ jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(
4827
- ContentRenderer,
4828
- {
4829
- content: entry.content,
4830
- format: entry.contentFormat
4831
- }
4832
- ) }) : entry.excerpt && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: entry.excerpt })
4833
- ] })
4834
- ]
4835
- },
4836
- entry.id
4837
- )) }) }),
5383
+ entries: cms.entries,
5384
+ loading: cms.loading,
5385
+ error: cms.error
5386
+ }
5387
+ ) }),
4838
5388
  showCta && /* @__PURE__ */ jsx("section", { className: "py-14 px-4 sm:px-6 lg:px-8 bg-primary/5 border-t border-border/40", children: /* @__PURE__ */ jsxs("div", { className: "max-w-2xl mx-auto text-center", children: [
4839
5389
  ctaTitle && /* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-foreground mb-3", children: ctaTitle }),
4840
5390
  ctaSubtitle && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-7", children: ctaSubtitle }),
@@ -5649,6 +6199,180 @@ function ContractsPage(props) {
5649
6199
  ] });
5650
6200
  }
5651
6201
 
5652
- export { BlogListPage, BlogPostPage, Button, CareersApplyForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, Input, Label, NewsletterForm, NewsletterPage, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProductProvider, ResourceLinks, RybbitAnalytics, Select, SocialLinks, Textarea, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, buttonVariants, cn, useContentPage, useContentPages, useProduct, useProductConfig, useWebSDK, useWebSDKConfig };
6202
+ // src/data/products.ts
6203
+ var ECOSYSTEM_PRODUCTS = [
6204
+ {
6205
+ slug: "workspaces",
6206
+ name: "Workspaces",
6207
+ websiteUrl: "https://burdenoff.com"
6208
+ },
6209
+ {
6210
+ slug: "vibecontrols",
6211
+ name: "VibeControls",
6212
+ websiteUrl: "https://vibecontrols.com"
6213
+ },
6214
+ {
6215
+ slug: "fluidgrids",
6216
+ name: "FluidGrids",
6217
+ websiteUrl: "https://fluidgrids.com"
6218
+ },
6219
+ { slug: "botlit", name: "BotLit", websiteUrl: "https://botlit.com" },
6220
+ {
6221
+ slug: "bigconsole",
6222
+ name: "BigConsole",
6223
+ websiteUrl: "https://bigconsole.com"
6224
+ },
6225
+ {
6226
+ slug: "semanticfed",
6227
+ name: "SemanticFed",
6228
+ websiteUrl: "https://semanticfed.com"
6229
+ },
6230
+ {
6231
+ slug: "intelwatchtower",
6232
+ name: "IntelWatchTower",
6233
+ websiteUrl: "https://intelwatchtower.com"
6234
+ },
6235
+ { slug: "buildmyiq", name: "BuildMyIQ", websiteUrl: "https://buildmyiq.com" },
6236
+ {
6237
+ slug: "assethandler",
6238
+ name: "AssetHandler",
6239
+ websiteUrl: "https://assethandler.com"
6240
+ },
6241
+ {
6242
+ slug: "crewfoundry",
6243
+ name: "CrewFoundry",
6244
+ websiteUrl: "https://crewfoundry.com"
6245
+ },
6246
+ {
6247
+ slug: "planmagnet",
6248
+ name: "PlanMagnet",
6249
+ websiteUrl: "https://planmagnet.com"
6250
+ },
6251
+ {
6252
+ slug: "eventfullymanaged",
6253
+ name: "EventfullyManaged",
6254
+ websiteUrl: "https://eventfullymanaged.com"
6255
+ },
6256
+ {
6257
+ slug: "headshotmarketing",
6258
+ name: "HeadshotMarketing Platform",
6259
+ websiteUrl: "https://headshotmarketing.com"
6260
+ },
6261
+ {
6262
+ slug: "technospam",
6263
+ name: "TechnoSpam",
6264
+ websiteUrl: "https://technospam.com"
6265
+ },
6266
+ { slug: "kadaikodi", name: "Kadaikodi", websiteUrl: "https://kadaikodi.com" },
6267
+ {
6268
+ slug: "movethewheels",
6269
+ name: "MoveTheWheels",
6270
+ websiteUrl: "https://movethewheels.com"
6271
+ },
6272
+ {
6273
+ slug: "healthybowl",
6274
+ name: "HealthyBowl Platform",
6275
+ websiteUrl: "https://gethealthybowl.com"
6276
+ },
6277
+ { slug: "ggnomad", name: "GGNomad", websiteUrl: "https://ggnomad.com" },
6278
+ {
6279
+ slug: "timecampus",
6280
+ name: "TimeCampus Platform",
6281
+ websiteUrl: "https://timecampus.com"
6282
+ },
6283
+ {
6284
+ slug: "manufacturedops",
6285
+ name: "ManufacturedOps",
6286
+ websiteUrl: "https://manufacturedops.com"
6287
+ },
6288
+ {
6289
+ slug: "theglobalfuel",
6290
+ name: "TheGlobalFuel",
6291
+ websiteUrl: "https://theglobalfuel.com"
6292
+ },
6293
+ {
6294
+ slug: "housingvista",
6295
+ name: "HousingVista",
6296
+ websiteUrl: "https://housingvista.com"
6297
+ },
6298
+ {
6299
+ slug: "proserviceworld",
6300
+ name: "ProServiceWorld",
6301
+ websiteUrl: "https://proserviceworld.com"
6302
+ },
6303
+ {
6304
+ slug: "mybodyshield",
6305
+ name: "MyBodyShield",
6306
+ websiteUrl: "https://mybodyshield.com"
6307
+ },
6308
+ {
6309
+ slug: "artistrybase",
6310
+ name: "ArtistryBase",
6311
+ websiteUrl: "https://artistrybase.com"
6312
+ },
6313
+ {
6314
+ slug: "theculturepost",
6315
+ name: "TheCulturePost",
6316
+ websiteUrl: "https://theculturepost.com"
6317
+ },
6318
+ { slug: "collabkin", name: "CollabKin", websiteUrl: "https://collabkin.com" },
6319
+ {
6320
+ slug: "comradecircle",
6321
+ name: "ComradeCircle",
6322
+ websiteUrl: "https://comradecircle.com"
6323
+ },
6324
+ {
6325
+ slug: "brainyrich",
6326
+ name: "BrainyRich",
6327
+ websiteUrl: "https://brainyrich.com"
6328
+ },
6329
+ {
6330
+ slug: "cosmicintersection",
6331
+ name: "CosmicIntersection",
6332
+ websiteUrl: "https://cosmicintersection.com"
6333
+ },
6334
+ {
6335
+ slug: "govcitizenhub",
6336
+ name: "GovCitizenHub",
6337
+ websiteUrl: "https://govcitizenhub.com"
6338
+ },
6339
+ {
6340
+ slug: "adaptercloud",
6341
+ name: "AdapterCloud",
6342
+ websiteUrl: "https://adaptercloud.com"
6343
+ },
6344
+ {
6345
+ slug: "subscriberbot",
6346
+ name: "SubscriberBot",
6347
+ websiteUrl: "https://subscriberbot.com"
6348
+ },
6349
+ {
6350
+ slug: "hookmovies",
6351
+ name: "HookMovies",
6352
+ websiteUrl: "https://hookmovies.com"
6353
+ },
6354
+ {
6355
+ slug: "coolandlovely",
6356
+ name: "CoolAndLovely",
6357
+ websiteUrl: "https://coolandlovely.com"
6358
+ },
6359
+ {
6360
+ slug: "atheletebridge",
6361
+ name: "AthleteBridge",
6362
+ websiteUrl: "https://atheletebridge.com"
6363
+ },
6364
+ {
6365
+ slug: "labsofscience",
6366
+ name: "LabsOfScience",
6367
+ websiteUrl: "https://labsofscience.com"
6368
+ },
6369
+ {
6370
+ slug: "ecoimpacthub",
6371
+ name: "EcoImpactHub",
6372
+ websiteUrl: "https://ecoimpacthub.com"
6373
+ }
6374
+ ];
6375
+
6376
+ export { BlogListPage, BlogPostPage, Button, CareersApplyForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, ECOSYSTEM_PRODUCTS, ElectronDownloadLink, Input, Label, LaunchCountdown, NewsletterForm, NewsletterPage, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProblemsSolvedSection, ProductProvider, ResourceLinks, RybbitAnalytics, Select, SocialLinks, Textarea, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, buttonVariants, cn, detectElectronPlatform, useContentPage, useContentPages, useProduct, useProductConfig, useWebSDK, useWebSDKConfig };
5653
6377
  //# sourceMappingURL=index.mjs.map
5654
6378
  //# sourceMappingURL=index.mjs.map