@burdenoff/website-sdk 2026.709.1 → 2026.709.3
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/launch-countdown.js +1 -1
- package/dist/components/launch-countdown.js.map +1 -1
- package/dist/components/launch-countdown.mjs +1 -1
- package/dist/components/launch-countdown.mjs.map +1 -1
- package/dist/index.d.mts +11 -2
- package/dist/index.d.ts +11 -2
- package/dist/index.js +176 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +176 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -48,7 +48,7 @@ function LaunchCountdown({
|
|
|
48
48
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
49
49
|
"div",
|
|
50
50
|
{
|
|
51
|
-
className: cn("
|
|
51
|
+
className: cn("flex flex-col items-center gap-3", className),
|
|
52
52
|
role: "timer",
|
|
53
53
|
"aria-label": launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`),
|
|
54
54
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/cn.ts","../../src/components/launch-countdown.tsx"],"names":["twMerge","clsx","useState","useEffect","jsxs","jsx","Rocket"],"mappings":";;;;;;;;AAmBO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AC6BA,SAAS,eAAe,EAAA,EAAuB;AAC7C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAI,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,KAAK,CAAA;AAAA,IACrC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,QAAS,IAAI,CAAA;AAAA,IAC/C,OAAA,EAAS,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AAAA,IAC9C,SAAS,YAAA,GAAe;AAAA,GAC1B;AACF;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClC;AAMO,SAAS,eAAA,CAAgB;AAAA,EAC9B,UAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA,GAAkB,mBAAA;AAAA,EAClB;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAIC,eAAS,MAAM,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,MAAM,cAAc,UAAA,GAAa,GAAA;AACjC,EAAA,MAAM,cAAc,WAAA,IAAe,CAAA;AAEnC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AAEjB,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IACnB,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,OAAA,EAAQ,GAAI,eAAe,WAAW,CAAA;AAEpE,EAAA,MAAM,KAAA,GAAiD;AAAA,IACrD,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC,CAAA,EAAE;AAAA,IACnD,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IACvC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,IAC3C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAAE,GAC7C;AAEA,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/components/launch-countdown.tsx"],"names":["twMerge","clsx","useState","useEffect","jsxs","jsx","Rocket"],"mappings":"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","file":"launch-countdown.js","sourcesContent":["/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\n/**\n * LaunchCountdown Component\n *\n * Reusable countdown timer counting down to a `launchDate` (epoch ms). Renders\n * a fixed-size grid of days / hours / minutes / seconds and flips to a\n * \"Launched\" message once the moment passes. Uses semantic theme tokens so it\n * works in light, dark, and high-contrast themes.\n *\n * @example\n * ```tsx\n * import { LaunchCountdown } from '@burdenoff/website-sdk'\n *\n * <LaunchCountdown launchDate={Date.UTC(2026, 7, 15, 0, 0, 0)} />\n * ```\n */\n\nimport { useEffect, useState } from \"react\";\n\nimport { Rocket } from \"lucide-react\";\n\nimport { cn } from \"../utils/cn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LaunchCountdownProps {\n /** Launch moment as epoch milliseconds. */\n launchDate: number;\n /** Optional accessible label describing the launch moment. */\n launchLabel?: string;\n /** Message shown once the countdown reaches zero. */\n launchedMessage?: string;\n /** Optional additional CSS class for the outer container. */\n className?: string;\n}\n\ninterface Remaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction splitRemaining(ms: number): Remaining {\n const clamped = Math.max(0, ms);\n const totalSeconds = Math.floor(clamped / 1000);\n return {\n days: Math.floor(totalSeconds / 86400),\n hours: Math.floor((totalSeconds % 86400) / 3600),\n minutes: Math.floor((totalSeconds % 3600) / 60),\n seconds: totalSeconds % 60,\n };\n}\n\nfunction padTwo(n: number): string {\n return String(n).padStart(2, \"0\");\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LaunchCountdown({\n launchDate,\n launchLabel,\n launchedMessage = \"We have launched!\",\n className,\n}: LaunchCountdownProps) {\n const [now, setNow] = useState(() => Date.now());\n const remainingMs = launchDate - now;\n const hasLaunched = remainingMs <= 0;\n\n useEffect(() => {\n if (hasLaunched) return;\n\n const interval = setInterval(() => {\n setNow(Date.now());\n }, 1000);\n\n return () => clearInterval(interval);\n }, [hasLaunched]);\n\n const { days, hours, minutes, seconds } = splitRemaining(remainingMs);\n\n const cells: Array<{ label: string; value: string }> = [\n { label: \"Days\", value: padTwo(Math.min(days, 99)) },\n { label: \"Hours\", value: padTwo(hours) },\n { label: \"Minutes\", value: padTwo(minutes) },\n { label: \"Seconds\", value: padTwo(seconds) },\n ];\n\n return (\n <div\n className={cn(\"flex flex-col items-center gap-3\", className)}\n role=\"timer\"\n aria-label={\n launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`)\n }\n >\n {!hasLaunched && (\n <span className=\"text-xs font-mono uppercase tracking-wider text-muted-foreground\">\n Launching in\n </span>\n )}\n\n <div className=\"flex gap-2 sm:gap-3\">\n {hasLaunched ? (\n <div\n className={cn(\n \"flex min-w-[15rem] items-center justify-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-6 py-4\",\n \"text-center\",\n )}\n >\n <Rocket className=\"h-5 w-5 text-primary\" aria-hidden=\"true\" />\n <span className=\"text-lg font-semibold text-foreground\">\n {launchedMessage}\n </span>\n </div>\n ) : (\n cells.map((cell) => (\n <div\n key={cell.label}\n className={cn(\n \"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\",\n )}\n >\n <span className=\"font-mono text-2xl font-bold tabular-nums text-foreground sm:text-3xl\">\n {cell.value}\n </span>\n <span className=\"mt-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground sm:text-xs\">\n {cell.label}\n </span>\n </div>\n ))\n )}\n </div>\n\n {!hasLaunched && launchLabel && (\n <span className=\"text-sm text-muted-foreground\">{launchLabel}</span>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -46,7 +46,7 @@ function LaunchCountdown({
|
|
|
46
46
|
return /* @__PURE__ */ jsxs(
|
|
47
47
|
"div",
|
|
48
48
|
{
|
|
49
|
-
className: cn("
|
|
49
|
+
className: cn("flex flex-col items-center gap-3", className),
|
|
50
50
|
role: "timer",
|
|
51
51
|
"aria-label": launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`),
|
|
52
52
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/cn.ts","../../src/components/launch-countdown.tsx"],"names":[],"mappings":";;;;;;AAmBO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AC6BA,SAAS,eAAe,EAAA,EAAuB;AAC7C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAI,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,KAAK,CAAA;AAAA,IACrC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,QAAS,IAAI,CAAA;AAAA,IAC/C,OAAA,EAAS,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AAAA,IAC9C,SAAS,YAAA,GAAe;AAAA,GAC1B;AACF;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClC;AAMO,SAAS,eAAA,CAAgB;AAAA,EAC9B,UAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA,GAAkB,mBAAA;AAAA,EAClB;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAI,SAAS,MAAM,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,MAAM,cAAc,UAAA,GAAa,GAAA;AACjC,EAAA,MAAM,cAAc,WAAA,IAAe,CAAA;AAEnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AAEjB,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IACnB,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,OAAA,EAAQ,GAAI,eAAe,WAAW,CAAA;AAEpE,EAAA,MAAM,KAAA,GAAiD;AAAA,IACrD,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,GAAA,CAAI,IAAA,EAAM,EAAE,CAAC,CAAA,EAAE;AAAA,IACnD,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IACvC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,IAC3C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAAE,GAC7C;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/components/launch-countdown.tsx"],"names":[],"mappings":"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","file":"launch-countdown.mjs","sourcesContent":["/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\n/**\n * LaunchCountdown Component\n *\n * Reusable countdown timer counting down to a `launchDate` (epoch ms). Renders\n * a fixed-size grid of days / hours / minutes / seconds and flips to a\n * \"Launched\" message once the moment passes. Uses semantic theme tokens so it\n * works in light, dark, and high-contrast themes.\n *\n * @example\n * ```tsx\n * import { LaunchCountdown } from '@burdenoff/website-sdk'\n *\n * <LaunchCountdown launchDate={Date.UTC(2026, 7, 15, 0, 0, 0)} />\n * ```\n */\n\nimport { useEffect, useState } from \"react\";\n\nimport { Rocket } from \"lucide-react\";\n\nimport { cn } from \"../utils/cn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LaunchCountdownProps {\n /** Launch moment as epoch milliseconds. */\n launchDate: number;\n /** Optional accessible label describing the launch moment. */\n launchLabel?: string;\n /** Message shown once the countdown reaches zero. */\n launchedMessage?: string;\n /** Optional additional CSS class for the outer container. */\n className?: string;\n}\n\ninterface Remaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction splitRemaining(ms: number): Remaining {\n const clamped = Math.max(0, ms);\n const totalSeconds = Math.floor(clamped / 1000);\n return {\n days: Math.floor(totalSeconds / 86400),\n hours: Math.floor((totalSeconds % 86400) / 3600),\n minutes: Math.floor((totalSeconds % 3600) / 60),\n seconds: totalSeconds % 60,\n };\n}\n\nfunction padTwo(n: number): string {\n return String(n).padStart(2, \"0\");\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LaunchCountdown({\n launchDate,\n launchLabel,\n launchedMessage = \"We have launched!\",\n className,\n}: LaunchCountdownProps) {\n const [now, setNow] = useState(() => Date.now());\n const remainingMs = launchDate - now;\n const hasLaunched = remainingMs <= 0;\n\n useEffect(() => {\n if (hasLaunched) return;\n\n const interval = setInterval(() => {\n setNow(Date.now());\n }, 1000);\n\n return () => clearInterval(interval);\n }, [hasLaunched]);\n\n const { days, hours, minutes, seconds } = splitRemaining(remainingMs);\n\n const cells: Array<{ label: string; value: string }> = [\n { label: \"Days\", value: padTwo(Math.min(days, 99)) },\n { label: \"Hours\", value: padTwo(hours) },\n { label: \"Minutes\", value: padTwo(minutes) },\n { label: \"Seconds\", value: padTwo(seconds) },\n ];\n\n return (\n <div\n className={cn(\"flex flex-col items-center gap-3\", className)}\n role=\"timer\"\n aria-label={\n launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`)\n }\n >\n {!hasLaunched && (\n <span className=\"text-xs font-mono uppercase tracking-wider text-muted-foreground\">\n Launching in\n </span>\n )}\n\n <div className=\"flex gap-2 sm:gap-3\">\n {hasLaunched ? (\n <div\n className={cn(\n \"flex min-w-[15rem] items-center justify-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-6 py-4\",\n \"text-center\",\n )}\n >\n <Rocket className=\"h-5 w-5 text-primary\" aria-hidden=\"true\" />\n <span className=\"text-lg font-semibold text-foreground\">\n {launchedMessage}\n </span>\n </div>\n ) : (\n cells.map((cell) => (\n <div\n key={cell.label}\n className={cn(\n \"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\",\n )}\n >\n <span className=\"font-mono text-2xl font-bold tabular-nums text-foreground sm:text-3xl\">\n {cell.value}\n </span>\n <span className=\"mt-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground sm:text-xs\">\n {cell.label}\n </span>\n </div>\n ))\n )}\n </div>\n\n {!hasLaunched && launchLabel && (\n <span className=\"text-sm text-muted-foreground\">{launchLabel}</span>\n )}\n </div>\n );\n}\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -8,7 +8,8 @@ export { WaitlistForm, WaitlistFormProps, WaitlistPage, WaitlistPageProps } from
|
|
|
8
8
|
export { UnsubscribePage, UnsubscribePageProps } from './components/unsubscribe.mjs';
|
|
9
9
|
export { SocialLinks, SocialLinksProps, SocialPlatform } from './components/social-links.mjs';
|
|
10
10
|
export { Resource, ResourceLinks, ResourceLinksProps } from './components/resource-links.mjs';
|
|
11
|
-
|
|
11
|
+
import { WebsiteSwitcherProduct } from './components/website-switcher.mjs';
|
|
12
|
+
export { WebsiteSwitcher, WebsiteSwitcherProps } from './components/website-switcher.mjs';
|
|
12
13
|
export { LaunchCountdown, LaunchCountdownProps } from './components/launch-countdown.mjs';
|
|
13
14
|
export { ProblemSolved, ProblemsSolvedSection, ProblemsSolvedSectionProps } from './components/problems-solved.mjs';
|
|
14
15
|
export { DetectedPlatform, ElectronDownloadLink, ElectronDownloadLinkProps, detectElectronPlatform } from './components/electron-download.mjs';
|
|
@@ -69,4 +70,12 @@ declare const Select: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLPro
|
|
|
69
70
|
|
|
70
71
|
declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & React.RefAttributes<HTMLTextAreaElement>>;
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Canonical Burdenoff ecosystem product list used by WebsiteSwitcher.
|
|
75
|
+
*
|
|
76
|
+
* Sourced from `~/products/websites/burdenoff-website/src/data/products.ts`.
|
|
77
|
+
* Keep this in sync when products are added, renamed, or moved.
|
|
78
|
+
*/
|
|
79
|
+
declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
|
|
80
|
+
|
|
81
|
+
export { Button, type ButtonProps, CareersApplyForm, type CareersApplyFormProps, ECOSYSTEM_PRODUCTS, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants };
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export { WaitlistForm, WaitlistFormProps, WaitlistPage, WaitlistPageProps } from
|
|
|
8
8
|
export { UnsubscribePage, UnsubscribePageProps } from './components/unsubscribe.js';
|
|
9
9
|
export { SocialLinks, SocialLinksProps, SocialPlatform } from './components/social-links.js';
|
|
10
10
|
export { Resource, ResourceLinks, ResourceLinksProps } from './components/resource-links.js';
|
|
11
|
-
|
|
11
|
+
import { WebsiteSwitcherProduct } from './components/website-switcher.js';
|
|
12
|
+
export { WebsiteSwitcher, WebsiteSwitcherProps } from './components/website-switcher.js';
|
|
12
13
|
export { LaunchCountdown, LaunchCountdownProps } from './components/launch-countdown.js';
|
|
13
14
|
export { ProblemSolved, ProblemsSolvedSection, ProblemsSolvedSectionProps } from './components/problems-solved.js';
|
|
14
15
|
export { DetectedPlatform, ElectronDownloadLink, ElectronDownloadLinkProps, detectElectronPlatform } from './components/electron-download.js';
|
|
@@ -69,4 +70,12 @@ declare const Select: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLPro
|
|
|
69
70
|
|
|
70
71
|
declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & React.RefAttributes<HTMLTextAreaElement>>;
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Canonical Burdenoff ecosystem product list used by WebsiteSwitcher.
|
|
75
|
+
*
|
|
76
|
+
* Sourced from `~/products/websites/burdenoff-website/src/data/products.ts`.
|
|
77
|
+
* Keep this in sync when products are added, renamed, or moved.
|
|
78
|
+
*/
|
|
79
|
+
declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
|
|
80
|
+
|
|
81
|
+
export { Button, type ButtonProps, CareersApplyForm, type CareersApplyFormProps, ECOSYSTEM_PRODUCTS, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants };
|
package/dist/index.js
CHANGED
|
@@ -4093,7 +4093,7 @@ function LaunchCountdown({
|
|
|
4093
4093
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4094
4094
|
"div",
|
|
4095
4095
|
{
|
|
4096
|
-
className: cn("
|
|
4096
|
+
className: cn("flex flex-col items-center gap-3", className),
|
|
4097
4097
|
role: "timer",
|
|
4098
4098
|
"aria-label": launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`),
|
|
4099
4099
|
children: [
|
|
@@ -6225,6 +6225,180 @@ function ContractsPage(props) {
|
|
|
6225
6225
|
] });
|
|
6226
6226
|
}
|
|
6227
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
|
+
|
|
6228
6402
|
exports.BlogListPage = BlogListPage;
|
|
6229
6403
|
exports.BlogPostPage = BlogPostPage;
|
|
6230
6404
|
exports.Button = Button;
|
|
@@ -6236,6 +6410,7 @@ exports.ContactPage = ContactPage;
|
|
|
6236
6410
|
exports.ContentRenderer = ContentRenderer;
|
|
6237
6411
|
exports.ContractsPage = ContractsPage;
|
|
6238
6412
|
exports.DEFAULT_CONTACT_CATEGORIES = DEFAULT_CONTACT_CATEGORIES;
|
|
6413
|
+
exports.ECOSYSTEM_PRODUCTS = ECOSYSTEM_PRODUCTS;
|
|
6239
6414
|
exports.ElectronDownloadLink = ElectronDownloadLink;
|
|
6240
6415
|
exports.Input = Input;
|
|
6241
6416
|
exports.Label = Label;
|