@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.
- package/dist/components/electron-download.d.mts +32 -0
- package/dist/components/electron-download.d.ts +32 -0
- package/dist/components/electron-download.js +131 -0
- package/dist/components/electron-download.js.map +1 -0
- package/dist/components/electron-download.mjs +108 -0
- package/dist/components/electron-download.mjs.map +1 -0
- package/dist/components/launch-countdown.d.mts +15 -0
- package/dist/components/launch-countdown.d.ts +15 -0
- package/dist/components/launch-countdown.js +89 -0
- package/dist/components/launch-countdown.js.map +1 -0
- package/dist/components/launch-countdown.mjs +87 -0
- package/dist/components/launch-countdown.mjs.map +1 -0
- package/dist/components/problems-solved.d.mts +37 -0
- package/dist/components/problems-solved.d.ts +37 -0
- package/dist/components/problems-solved.js +157 -0
- package/dist/components/problems-solved.js.map +1 -0
- package/dist/components/problems-solved.mjs +135 -0
- package/dist/components/problems-solved.mjs.map +1 -0
- package/dist/components/website-switcher.d.mts +27 -0
- package/dist/components/website-switcher.d.ts +27 -0
- package/dist/components/website-switcher.js +168 -0
- package/dist/components/website-switcher.js.map +1 -0
- package/dist/components/website-switcher.mjs +146 -0
- package/dist/components/website-switcher.mjs.map +1 -0
- package/dist/content/index.d.mts +24 -1
- package/dist/content/index.d.ts +24 -1
- package/dist/content/index.js +459 -149
- package/dist/content/index.js.map +1 -1
- package/dist/content/index.mjs +378 -87
- package/dist/content/index.mjs.map +1 -1
- package/dist/index.d.mts +15 -2
- package/dist/index.d.ts +15 -2
- package/dist/index.js +817 -86
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +812 -88
- package/dist/index.mjs.map +1 -1
- 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
|
|
4712
|
-
|
|
4713
|
-
|
|
4714
|
-
|
|
4715
|
-
|
|
4716
|
-
|
|
4717
|
-
|
|
4718
|
-
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
|
|
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)
|
|
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
|
-
|
|
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:
|
|
4813
|
-
|
|
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
|
-
|
|
4816
|
-
|
|
4817
|
-
|
|
4818
|
-
|
|
4819
|
-
|
|
4820
|
-
|
|
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
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
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;
|