@busiverse/ui 0.1.0
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/README.md +148 -0
- package/dist/api/createGatewayClient.d.ts +27 -0
- package/dist/api/createGatewayClient.d.ts.map +1 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/assets/assets.d.ts +31 -0
- package/dist/assets/assets.d.ts.map +1 -0
- package/dist/assets/favicon.io/android-chrome-192x192.png +0 -0
- package/dist/assets/favicon.io/android-chrome-512x512.png +0 -0
- package/dist/assets/favicon.io/android-icon-144x144.png +0 -0
- package/dist/assets/favicon.io/android-icon-192x192.png +0 -0
- package/dist/assets/favicon.io/android-icon-36x36.png +0 -0
- package/dist/assets/favicon.io/android-icon-48x48.png +0 -0
- package/dist/assets/favicon.io/android-icon-72x72.png +0 -0
- package/dist/assets/favicon.io/android-icon-96x96.png +0 -0
- package/dist/assets/favicon.io/apple-icon-114x114.png +0 -0
- package/dist/assets/favicon.io/apple-icon-120x120.png +0 -0
- package/dist/assets/favicon.io/apple-icon-144x144.png +0 -0
- package/dist/assets/favicon.io/apple-icon-152x152.png +0 -0
- package/dist/assets/favicon.io/apple-icon-180x180.png +0 -0
- package/dist/assets/favicon.io/apple-icon-57x57.png +0 -0
- package/dist/assets/favicon.io/apple-icon-60x60.png +0 -0
- package/dist/assets/favicon.io/apple-icon-72x72.png +0 -0
- package/dist/assets/favicon.io/apple-icon-76x76.png +0 -0
- package/dist/assets/favicon.io/apple-icon-precomposed.png +0 -0
- package/dist/assets/favicon.io/apple-icon.png +0 -0
- package/dist/assets/favicon.io/apple-touch-icon.png +0 -0
- package/dist/assets/favicon.io/browserconfig.xml +2 -0
- package/dist/assets/favicon.io/favicon-16x16.png +0 -0
- package/dist/assets/favicon.io/favicon-32x32.png +0 -0
- package/dist/assets/favicon.io/favicon-96x96.png +0 -0
- package/dist/assets/favicon.io/favicon.ico +0 -0
- package/dist/assets/favicon.io/manifest.json +41 -0
- package/dist/assets/favicon.io/ms-icon-144x144.png +0 -0
- package/dist/assets/favicon.io/ms-icon-150x150.png +0 -0
- package/dist/assets/favicon.io/ms-icon-310x310.png +0 -0
- package/dist/assets/favicon.io/ms-icon-70x70.png +0 -0
- package/dist/assets/favicon.io/site.webmanifest +1 -0
- package/dist/assets/icon/busiverse-icon-only---black-1x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---black-2x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---black-4x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---black.svg +1 -0
- package/dist/assets/icon/busiverse-icon-only---color-1x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---color-2x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---color-4x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---color.svg +1 -0
- package/dist/assets/icon/busiverse-icon-only---white-1x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---white-2x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---white-4x.png +0 -0
- package/dist/assets/icon/busiverse-icon-only---white.svg +1 -0
- package/dist/assets/logo/busiverse-horizontal---black-1x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---black-2x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---black-4x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---black.svg +1 -0
- package/dist/assets/logo/busiverse-horizontal---color-1x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---color-2x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---color-4x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---color.svg +1 -0
- package/dist/assets/logo/busiverse-horizontal---white-1x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---white-2x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---white-4x.png +0 -0
- package/dist/assets/logo/busiverse-horizontal---white.svg +1 -0
- package/dist/assets/logo/busiverse-primary-full-logo---black-1x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---black-2x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---black-4x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---black.svg +1 -0
- package/dist/assets/logo/busiverse-primary-full-logo---color-1x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---color-2x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---color-4x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---color.svg +1 -0
- package/dist/assets/logo/busiverse-primary-full-logo---white-1x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---white-2x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---white-4x.png +0 -0
- package/dist/assets/logo/busiverse-primary-full-logo---white.svg +1 -0
- package/dist/assets/logo/busiverse-vertical---black-1x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---black-2x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---black-4x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---black.svg +1 -0
- package/dist/assets/logo/busiverse-vertical---color-1x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---color-2x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---color-4x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---color.svg +1 -0
- package/dist/assets/logo/busiverse-vertical---white-1x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---white-2x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---white-4x.png +0 -0
- package/dist/assets/logo/busiverse-vertical---white.svg +1 -0
- package/dist/assets/social/busiverse-facebook-cover-photo-1.7333333333333334x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-facebook-profile-picture-1x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-instagram-post-6x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-instagram-profile-picture-1.7777777777777777x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-linkedin-cover-photo-2.64x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-linkedin-profile-picture-2.2222222222222223x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-twitter_x-header-2.7777777777777777x-darkbg.png +0 -0
- package/dist/assets/social/busiverse-twitter_x-profile-picture-2.2222222222222223x-darkbg.png +0 -0
- package/dist/auth/AuthSessionProvider.d.ts +22 -0
- package/dist/auth/AuthSessionProvider.d.ts.map +1 -0
- package/dist/auth/RequireAuth.d.ts +5 -0
- package/dist/auth/RequireAuth.d.ts.map +1 -0
- package/dist/auth/SignUpLink.d.ts +6 -0
- package/dist/auth/SignUpLink.d.ts.map +1 -0
- package/dist/auth/UserMenu.d.ts +3 -0
- package/dist/auth/UserMenu.d.ts.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/chunk-BEOTRCGO.js +105 -0
- package/dist/chunk-BEOTRCGO.js.map +1 -0
- package/dist/components/billing/CurrencyAmount.d.ts +9 -0
- package/dist/components/billing/CurrencyAmount.d.ts.map +1 -0
- package/dist/components/billing/UsageQuotaBar.d.ts +7 -0
- package/dist/components/billing/UsageQuotaBar.d.ts.map +1 -0
- package/dist/components/billing/index.d.ts +3 -0
- package/dist/components/billing/index.d.ts.map +1 -0
- package/dist/components/brand/BusiverseLogo.d.ts +10 -0
- package/dist/components/brand/BusiverseLogo.d.ts.map +1 -0
- package/dist/components/brand/index.d.ts +2 -0
- package/dist/components/brand/index.d.ts.map +1 -0
- package/dist/components/data/DataTable.d.ts +19 -0
- package/dist/components/data/DataTable.d.ts.map +1 -0
- package/dist/components/data/StatCard.d.ts +8 -0
- package/dist/components/data/StatCard.d.ts.map +1 -0
- package/dist/components/data/StatusPill.d.ts +5 -0
- package/dist/components/data/StatusPill.d.ts.map +1 -0
- package/dist/components/data/TimeSeriesTable.d.ts +13 -0
- package/dist/components/data/TimeSeriesTable.d.ts.map +1 -0
- package/dist/components/data/index.d.ts +5 -0
- package/dist/components/data/index.d.ts.map +1 -0
- package/dist/components/feedback/States.d.ts +12 -0
- package/dist/components/feedback/States.d.ts.map +1 -0
- package/dist/components/feedback/index.d.ts +2 -0
- package/dist/components/feedback/index.d.ts.map +1 -0
- package/dist/components/forms/Field.d.ts +11 -0
- package/dist/components/forms/Field.d.ts.map +1 -0
- package/dist/components/forms/index.d.ts +2 -0
- package/dist/components/forms/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/layout/AppShell.d.ts +14 -0
- package/dist/components/layout/AppShell.d.ts.map +1 -0
- package/dist/components/layout/ContentContainer.d.ts +3 -0
- package/dist/components/layout/ContentContainer.d.ts.map +1 -0
- package/dist/components/layout/PageHeader.d.ts +10 -0
- package/dist/components/layout/PageHeader.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +4 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/marketing/HeroSection.d.ts +9 -0
- package/dist/components/marketing/HeroSection.d.ts.map +1 -0
- package/dist/components/marketing/index.d.ts +2 -0
- package/dist/components/marketing/index.d.ts.map +1 -0
- package/dist/components/primitives/Badge.d.ts +7 -0
- package/dist/components/primitives/Badge.d.ts.map +1 -0
- package/dist/components/primitives/Button.d.ts +11 -0
- package/dist/components/primitives/Button.d.ts.map +1 -0
- package/dist/components/primitives/Card.d.ts +10 -0
- package/dist/components/primitives/Card.d.ts.map +1 -0
- package/dist/components/primitives/Input.d.ts +4 -0
- package/dist/components/primitives/Input.d.ts.map +1 -0
- package/dist/components/primitives/Select.d.ts +4 -0
- package/dist/components/primitives/Select.d.ts.map +1 -0
- package/dist/components/primitives/Skeleton.d.ts +3 -0
- package/dist/components/primitives/Skeleton.d.ts.map +1 -0
- package/dist/components/primitives/Textarea.d.ts +4 -0
- package/dist/components/primitives/Textarea.d.ts.map +1 -0
- package/dist/components/primitives/index.d.ts +8 -0
- package/dist/components/primitives/index.d.ts.map +1 -0
- package/dist/i18n/BusiverseI18nProvider.d.ts +17 -0
- package/dist/i18n/BusiverseI18nProvider.d.ts.map +1 -0
- package/dist/i18n/format.d.ts +6 -0
- package/dist/i18n/format.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +10 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +606 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/services.d.ts +13 -0
- package/dist/registry/services.d.ts.map +1 -0
- package/dist/styles.css +216 -0
- package/dist/tailwind/index.d.ts +59 -0
- package/dist/tailwind/index.d.ts.map +1 -0
- package/dist/tailwind/index.js +30 -0
- package/dist/tailwind/index.js.map +1 -0
- package/dist/tokens/colors.d.ts +42 -0
- package/dist/tokens/colors.d.ts.map +1 -0
- package/dist/tokens/index.d.ts +6 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/motion.d.ts +7 -0
- package/dist/tokens/motion.d.ts.map +1 -0
- package/dist/tokens/radius.d.ts +9 -0
- package/dist/tokens/radius.d.ts.map +1 -0
- package/dist/tokens/spacing.d.ts +22 -0
- package/dist/tokens/spacing.d.ts.map +1 -0
- package/dist/tokens/typography.d.ts +64 -0
- package/dist/tokens/typography.d.ts.map +1 -0
- package/dist/utils/cn.d.ts +3 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/package.json +84 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
import {
|
|
2
|
+
busiverseColors,
|
|
3
|
+
busiverseContainers,
|
|
4
|
+
busiverseRadius,
|
|
5
|
+
busiverseSpacing,
|
|
6
|
+
busiverseTypography
|
|
7
|
+
} from "./chunk-BEOTRCGO.js";
|
|
8
|
+
|
|
9
|
+
// src/tokens/motion.ts
|
|
10
|
+
var busiverseMotion = {
|
|
11
|
+
fast: "150ms",
|
|
12
|
+
default: "200ms",
|
|
13
|
+
slow: "300ms",
|
|
14
|
+
easeStandard: "cubic-bezier(0.16, 1, 0.3, 1)"
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/assets/assets.ts
|
|
18
|
+
var busiverseAssets = {
|
|
19
|
+
logo: {
|
|
20
|
+
horizontal: {
|
|
21
|
+
white: new URL("./assets/logo/busiverse-horizontal---white.svg", import.meta.url).href,
|
|
22
|
+
black: new URL("./assets/logo/busiverse-horizontal---black.svg", import.meta.url).href,
|
|
23
|
+
color: new URL("./assets/logo/busiverse-horizontal---color.svg", import.meta.url).href
|
|
24
|
+
},
|
|
25
|
+
full: {
|
|
26
|
+
white: new URL("./assets/logo/busiverse-primary-full-logo---white.svg", import.meta.url).href,
|
|
27
|
+
black: new URL("./assets/logo/busiverse-primary-full-logo---black.svg", import.meta.url).href,
|
|
28
|
+
color: new URL("./assets/logo/busiverse-primary-full-logo---color.svg", import.meta.url).href
|
|
29
|
+
},
|
|
30
|
+
vertical: {
|
|
31
|
+
white: new URL("./assets/logo/busiverse-vertical---white.svg", import.meta.url).href,
|
|
32
|
+
black: new URL("./assets/logo/busiverse-vertical---black.svg", import.meta.url).href,
|
|
33
|
+
color: new URL("./assets/logo/busiverse-vertical---color.svg", import.meta.url).href
|
|
34
|
+
},
|
|
35
|
+
icon: {
|
|
36
|
+
white: new URL("./assets/icon/busiverse-icon-only---white.svg", import.meta.url).href,
|
|
37
|
+
black: new URL("./assets/icon/busiverse-icon-only---black.svg", import.meta.url).href,
|
|
38
|
+
color: new URL("./assets/icon/busiverse-icon-only---color.svg", import.meta.url).href
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
favicon: {
|
|
42
|
+
ico: new URL("./assets/favicon.io/favicon.ico", import.meta.url).href,
|
|
43
|
+
png16: new URL("./assets/favicon.io/favicon-16x16.png", import.meta.url).href,
|
|
44
|
+
png32: new URL("./assets/favicon.io/favicon-32x32.png", import.meta.url).href,
|
|
45
|
+
appleTouchIcon: new URL("./assets/favicon.io/apple-touch-icon.png", import.meta.url).href
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// src/utils/cn.ts
|
|
50
|
+
function cn(...values) {
|
|
51
|
+
const out = [];
|
|
52
|
+
const push = (value) => {
|
|
53
|
+
if (!value) return;
|
|
54
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
55
|
+
out.push(String(value));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
value.forEach(push);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
Object.entries(value).forEach(([key, enabled]) => {
|
|
63
|
+
if (enabled) out.push(key);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
values.forEach(push);
|
|
67
|
+
return out.join(" ");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/components/brand/BusiverseLogo.tsx
|
|
71
|
+
import { jsx } from "react/jsx-runtime";
|
|
72
|
+
var icon_white = `<svg width="100" height="100" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><circle cx="90" cy="90" r="16" fill="#FFFFFF"/><circle cx="50" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#FFFFFF" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#FFFFFF" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#FFFFFF" stroke-width="1.5" fill="none" opacity="0.2"/></svg>`;
|
|
73
|
+
var icon_black = `<svg width="100" height="100" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><circle cx="90" cy="90" r="16" fill="#000000"/><circle cx="50" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#000000" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#000000" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#000000" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#000000" stroke-width="1.5" fill="none" opacity="0.2"/></svg>`;
|
|
74
|
+
var icon_color = `<svg width="100" height="100" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><circle cx="90" cy="90" r="16" fill="#3B82F6"/><circle cx="50" cy="50" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#06B6D4" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#06B6D4" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#3B82F6" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#8B5CF6" stroke-width="1.5" fill="none" opacity="0.2"/></svg>`;
|
|
75
|
+
var horizontal_white = `<svg width="300" height="75" viewBox="0 0 800 200" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g transform="translate(20, 10)"><circle cx="90" cy="90" r="16" fill="#FFFFFF"/><circle cx="50" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#FFFFFF" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#FFFFFF" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#FFFFFF" stroke-width="1.5" fill="none" opacity="0.2"/></g><text x="240" y="120" font-family="Space Grotesk, sans-serif" font-size="64" font-weight="700" fill="#FFFFFF" letter-spacing="-0.02em">BUSIVERSE</text></svg>`;
|
|
76
|
+
var horizontal_black = `<svg width="300" height="75" viewBox="0 0 800 200" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g transform="translate(20, 10)"><circle cx="90" cy="90" r="16" fill="#000000"/><circle cx="50" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#000000" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#000000" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#000000" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#000000" stroke-width="1.5" fill="none" opacity="0.2"/></g><text x="240" y="120" font-family="Space Grotesk, sans-serif" font-size="64" font-weight="700" fill="#000000" letter-spacing="-0.02em">BUSIVERSE</text></svg>`;
|
|
77
|
+
var horizontal_color = `<svg width="300" height="75" viewBox="0 0 800 200" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g transform="translate(20, 10)"><circle cx="90" cy="90" r="16" fill="#3B82F6"/><circle cx="50" cy="50" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#06B6D4" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#06B6D4" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#3B82F6" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#8B5CF6" stroke-width="1.5" fill="none" opacity="0.2"/></g><text x="240" y="120" font-family="Space Grotesk, sans-serif" font-size="64" font-weight="700" fill="#0F172A" letter-spacing="-0.02em">BUSIVERSE</text></svg>`;
|
|
78
|
+
var full_white = `<svg width="200" height="60" viewBox="0 0 600 180" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g id="icon"><circle cx="90" cy="90" r="16" fill="#FFFFFF"/><circle cx="50" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#FFFFFF" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#FFFFFF" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#FFFFFF" stroke-width="1.5" fill="none" opacity="0.2"/></g><g id="wordmark"><text x="190" y="105" font-family="Space Grotesk, sans-serif" font-size="52" font-weight="700" fill="#FFFFFF" letter-spacing="-0.02em">BUSIVERSE</text><text x="190" y="130" font-family="Inter, sans-serif" font-size="14" font-weight="500" fill="#FFFFFF" opacity="0.7" letter-spacing="0.05em">TURN IDEAS INTO OPERATING BUSINESSES</text></g></svg>`;
|
|
79
|
+
var full_black = `<svg width="200" height="60" viewBox="0 0 600 180" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g id="icon"><circle cx="90" cy="90" r="16" fill="#000000"/><circle cx="50" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#000000" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#000000" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#000000" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#000000" stroke-width="1.5" fill="none" opacity="0.2"/></g><g id="wordmark"><text x="190" y="105" font-family="Space Grotesk, sans-serif" font-size="52" font-weight="700" fill="#000000" letter-spacing="-0.02em">BUSIVERSE</text><text x="190" y="130" font-family="Inter, sans-serif" font-size="14" font-weight="500" fill="#000000" opacity="0.7" letter-spacing="0.05em">TURN IDEAS INTO OPERATING BUSINESSES</text></g></svg>`;
|
|
80
|
+
var full_color = `<svg width="200" height="60" viewBox="0 0 600 180" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g id="icon"><circle cx="90" cy="90" r="16" fill="#3B82F6"/><circle cx="50" cy="50" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#06B6D4" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#06B6D4" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#3B82F6" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#8B5CF6" stroke-width="1.5" fill="none" opacity="0.2"/></g><g id="wordmark"><text x="190" y="105" font-family="Space Grotesk, sans-serif" font-size="52" font-weight="700" fill="#0F172A" letter-spacing="-0.02em">BUSIVERSE</text><text x="190" y="130" font-family="Inter, sans-serif" font-size="14" font-weight="500" fill="#0F172A" opacity="0.7" letter-spacing="0.05em">TURN IDEAS INTO OPERATING BUSINESSES</text></g></svg>`;
|
|
81
|
+
var vertical_white = `<svg width="200" height="300" viewBox="0 0 400 600" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g transform="translate(110, 40)"><circle cx="90" cy="90" r="16" fill="#FFFFFF"/><circle cx="50" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#FFFFFF" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#FFFFFF" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#FFFFFF" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#FFFFFF" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#FFFFFF" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#FFFFFF" stroke-width="1.5" fill="none" opacity="0.2"/></g><text x="200" y="350" font-family="Space Grotesk, sans-serif" font-size="48" font-weight="700" fill="#FFFFFF" letter-spacing="-0.02em" text-anchor="middle">BUSIVERSE</text><text x="200" y="390" font-family="Inter, sans-serif" font-size="12" font-weight="500" fill="#FFFFFF" opacity="0.7" letter-spacing="0.08em" text-anchor="middle">TURN IDEAS INTO</text><text x="200" y="410" font-family="Inter, sans-serif" font-size="12" font-weight="500" fill="#FFFFFF" opacity="0.7" letter-spacing="0.08em" text-anchor="middle">OPERATING BUSINESSES</text></svg>`;
|
|
82
|
+
var vertical_black = `<svg width="200" height="300" viewBox="0 0 400 600" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g transform="translate(110, 40)"><circle cx="90" cy="90" r="16" fill="#000000"/><circle cx="50" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#000000" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#000000" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#000000" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#000000" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#000000" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#000000" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#000000" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#000000" stroke-width="1.5" fill="none" opacity="0.2"/></g><text x="200" y="350" font-family="Space Grotesk, sans-serif" font-size="48" font-weight="700" fill="#000000" letter-spacing="-0.02em" text-anchor="middle">BUSIVERSE</text><text x="200" y="390" font-family="Inter, sans-serif" font-size="12" font-weight="500" fill="#000000" opacity="0.7" letter-spacing="0.08em" text-anchor="middle">TURN IDEAS INTO</text><text x="200" y="410" font-family="Inter, sans-serif" font-size="12" font-weight="500" fill="#000000" opacity="0.7" letter-spacing="0.08em" text-anchor="middle">OPERATING BUSINESSES</text></svg>`;
|
|
83
|
+
var vertical_color = `<svg width="200" height="300" viewBox="0 0 400 600" fill="none" xmlns="http://www.w3.org/2000/svg" class=""><g transform="translate(110, 40)"><circle cx="90" cy="90" r="16" fill="#3B82F6"/><circle cx="50" cy="50" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="130" cy="50" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="50" cy="130" r="10" fill="#06B6D4" opacity="0.9"/><circle cx="130" cy="130" r="10" fill="#8B5CF6" opacity="0.9"/><circle cx="30" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="150" cy="90" r="8" fill="#3B82F6" opacity="0.7"/><circle cx="90" cy="30" r="8" fill="#06B6D4" opacity="0.7"/><circle cx="90" cy="150" r="8" fill="#06B6D4" opacity="0.7"/><line x1="90" y1="90" x2="50" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="50" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="50" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="130" y2="130" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="30" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="150" y2="90" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="30" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><line x1="90" y1="90" x2="90" y2="150" stroke="#3B82F6" stroke-width="2" opacity="0.4"/><circle cx="90" cy="90" r="65" stroke="#3B82F6" stroke-width="2.5" fill="none" opacity="0.3"/><circle cx="90" cy="90" r="75" stroke="#8B5CF6" stroke-width="1.5" fill="none" opacity="0.2"/></g><text x="200" y="350" font-family="Space Grotesk, sans-serif" font-size="48" font-weight="700" fill="#0F172A" letter-spacing="-0.02em" text-anchor="middle">BUSIVERSE</text><text x="200" y="390" font-family="Inter, sans-serif" font-size="12" font-weight="500" fill="#0F172A" opacity="0.7" letter-spacing="0.08em" text-anchor="middle">TURN IDEAS INTO</text><text x="200" y="410" font-family="Inter, sans-serif" font-size="12" font-weight="500" fill="#0F172A" opacity="0.7" letter-spacing="0.08em" text-anchor="middle">OPERATING BUSINESSES</text></svg>`;
|
|
84
|
+
var svgMap = {
|
|
85
|
+
icon: { white: icon_white, black: icon_black, color: icon_color },
|
|
86
|
+
horizontal: { white: horizontal_white, black: horizontal_black, color: horizontal_color },
|
|
87
|
+
full: { white: full_white, black: full_black, color: full_color },
|
|
88
|
+
vertical: { white: vertical_white, black: vertical_black, color: vertical_color }
|
|
89
|
+
};
|
|
90
|
+
function BusiverseLogo({ variant = "horizontal", tone = "white", label = "BUSIVERSE", className, ...props }) {
|
|
91
|
+
return /* @__PURE__ */ jsx(
|
|
92
|
+
"span",
|
|
93
|
+
{
|
|
94
|
+
role: "img",
|
|
95
|
+
"aria-label": label,
|
|
96
|
+
className: cn("busiverse-logo", className),
|
|
97
|
+
dangerouslySetInnerHTML: { __html: svgMap[variant][tone] },
|
|
98
|
+
...props
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/components/primitives/Button.tsx
|
|
104
|
+
import * as React from "react";
|
|
105
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
106
|
+
var variants = {
|
|
107
|
+
primary: "busiverse-btn-primary",
|
|
108
|
+
secondary: "busiverse-btn-secondary",
|
|
109
|
+
ghost: "busiverse-btn-ghost",
|
|
110
|
+
danger: "busiverse-btn-danger",
|
|
111
|
+
success: "busiverse-btn-success",
|
|
112
|
+
link: "busiverse-btn-link"
|
|
113
|
+
};
|
|
114
|
+
var sizes = {
|
|
115
|
+
sm: "busiverse-btn-sm",
|
|
116
|
+
md: "busiverse-btn-md",
|
|
117
|
+
lg: "busiverse-btn-lg"
|
|
118
|
+
};
|
|
119
|
+
var Button = React.forwardRef(function Button2({ className, variant = "primary", size = "md", isLoading, children, disabled, ...props }, ref) {
|
|
120
|
+
return /* @__PURE__ */ jsxs(
|
|
121
|
+
"button",
|
|
122
|
+
{
|
|
123
|
+
ref,
|
|
124
|
+
className: cn("busiverse-focus-ring busiverse-btn", variants[variant], sizes[size], className),
|
|
125
|
+
disabled: disabled || isLoading,
|
|
126
|
+
"aria-busy": isLoading || void 0,
|
|
127
|
+
...props,
|
|
128
|
+
children: [
|
|
129
|
+
isLoading && /* @__PURE__ */ jsx2("span", { className: "busiverse-spinner", "aria-hidden": "true" }),
|
|
130
|
+
/* @__PURE__ */ jsx2("span", { children })
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// src/components/primitives/Card.tsx
|
|
137
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
138
|
+
function Card({ className, interactive, ...props }) {
|
|
139
|
+
return /* @__PURE__ */ jsx3("div", { className: cn("busiverse-card", interactive && "busiverse-card-interactive", className), ...props });
|
|
140
|
+
}
|
|
141
|
+
function CardHeader({ className, ...props }) {
|
|
142
|
+
return /* @__PURE__ */ jsx3("div", { className: cn("busiverse-card-header", className), ...props });
|
|
143
|
+
}
|
|
144
|
+
function CardTitle({ className, ...props }) {
|
|
145
|
+
return /* @__PURE__ */ jsx3("h3", { className: cn("busiverse-card-title", className), ...props });
|
|
146
|
+
}
|
|
147
|
+
function CardDescription({ className, ...props }) {
|
|
148
|
+
return /* @__PURE__ */ jsx3("p", { className: cn("busiverse-card-description", className), ...props });
|
|
149
|
+
}
|
|
150
|
+
function CardContent({ className, ...props }) {
|
|
151
|
+
return /* @__PURE__ */ jsx3("div", { className: cn("busiverse-card-content", className), ...props });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// src/components/primitives/Badge.tsx
|
|
155
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
156
|
+
function Badge({ className, tone = "blue", ...props }) {
|
|
157
|
+
return /* @__PURE__ */ jsx4("span", { className: cn("busiverse-badge", `busiverse-badge-${tone}`, className), ...props });
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// src/components/primitives/Input.tsx
|
|
161
|
+
import * as React2 from "react";
|
|
162
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
163
|
+
var Input = React2.forwardRef(function Input2({ className, ...props }, ref) {
|
|
164
|
+
return /* @__PURE__ */ jsx5("input", { ref, className: cn("busiverse-focus-ring busiverse-input", className), ...props });
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// src/components/primitives/Select.tsx
|
|
168
|
+
import * as React3 from "react";
|
|
169
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
170
|
+
var Select = React3.forwardRef(function Select2({ className, ...props }, ref) {
|
|
171
|
+
return /* @__PURE__ */ jsx6("select", { ref, className: cn("busiverse-focus-ring busiverse-input", className), ...props });
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// src/components/primitives/Textarea.tsx
|
|
175
|
+
import * as React4 from "react";
|
|
176
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
177
|
+
var Textarea = React4.forwardRef(function Textarea2({ className, ...props }, ref) {
|
|
178
|
+
return /* @__PURE__ */ jsx7("textarea", { ref, className: cn("busiverse-focus-ring busiverse-input busiverse-textarea", className), ...props });
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// src/components/primitives/Skeleton.tsx
|
|
182
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
183
|
+
function Skeleton({ className, ...props }) {
|
|
184
|
+
return /* @__PURE__ */ jsx8("div", { className: cn("busiverse-skeleton", className), ...props });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/registry/services.ts
|
|
188
|
+
var busiverseServices = [
|
|
189
|
+
{ key: "account", name: "Account", category: "finance", frontendHost: "account.busiversehq.com", apiPrefix: "/account/api/v1", description: "Billing, ledger, invoices, subscriptions, and accounting." },
|
|
190
|
+
{ key: "ai", name: "AI", category: "intelligence", frontendHost: "ai.busiversehq.com", apiPrefix: "/ai/api/v1", description: "AI agents, automation, copilots, and approved execution.", usesTimeSeries: true },
|
|
191
|
+
{ key: "authentication", name: "Authentication", category: "security", frontendHost: "authentication.busiversehq.com", apiPrefix: "/authentication/api/v1", description: "OAuth2/OIDC, MFA, sessions, clients, and identity security.", usesTimeSeries: true },
|
|
192
|
+
{ key: "authorization", name: "Authorization", category: "security", frontendHost: "authorization.busiversehq.com", apiPrefix: "/authorization/api/v1", description: "ABAC policy, access decisions, simulations, and reviews.", usesTimeSeries: true },
|
|
193
|
+
{ key: "bank", name: "Bank", category: "finance", frontendHost: "bank.busiversehq.com", apiPrefix: "/bank/api/v1", description: "Bank accounts, transfers, escrow, cards, loans, and settlement." },
|
|
194
|
+
{ key: "blockchain", name: "Blockchain", category: "blockchain", frontendHost: "blockchain.busiversehq.com", apiPrefix: "/blockchain/api/v1", description: "Proofs, blocks, transaction status, history, and explorer APIs.", usesTimeSeries: true },
|
|
195
|
+
{ key: "business", name: "Business", category: "business", frontendHost: "business.busiversehq.com", apiPrefix: "/business/api/v1", description: "Business records, workspaces, departments, and operations." },
|
|
196
|
+
{ key: "business-plan", name: "Business Plan", category: "business", frontendHost: "business-plan.busiversehq.com", apiPrefix: "/business-plan/api/v1", description: "Business plans, projections, assumptions, and investor-ready exports." },
|
|
197
|
+
{ key: "communication", name: "Communication", category: "operations", frontendHost: "communication.busiversehq.com", apiPrefix: "/communication/api/v1", description: "Email, SMS, push, in-app, campaigns, notifications, and webhooks.", usesTimeSeries: true },
|
|
198
|
+
{ key: "employee", name: "Employee", category: "business", frontendHost: "employee.busiversehq.com", apiPrefix: "/employee/api/v1", description: "Employment lifecycle, employee records, payroll context, and AI employees." },
|
|
199
|
+
{ key: "job", name: "Job", category: "business", frontendHost: "job.busiversehq.com", apiPrefix: "/job/api/v1", description: "Jobs, applications, interviews, offers, and candidate matching." },
|
|
200
|
+
{ key: "location", name: "Location", category: "operations", frontendHost: "location.busiversehq.com", apiPrefix: "/location/api/v1", description: "Countries, regions, addresses, geocoding, and pricing context." },
|
|
201
|
+
{ key: "logistics", name: "Logistics", category: "commerce", frontendHost: "logistics.busiversehq.com", apiPrefix: "/logistics/api/v1", description: "Shipments, delivery, vehicles, transport, and fulfillment." },
|
|
202
|
+
{ key: "marketplace", name: "Marketplace", category: "commerce", frontendHost: "marketplace.busiversehq.com", apiPrefix: "/marketplace/api/v1", description: "Listings, orders, auctions, bids, vendor stores, and commerce." },
|
|
203
|
+
{ key: "mint", name: "Mint", category: "finance", frontendHost: "mint.busiversehq.com", apiPrefix: "/mint/api/v1", description: "Currency, monetary rules, reserves, settlement, and policy." },
|
|
204
|
+
{ key: "ml", name: "ML", category: "intelligence", frontendHost: "ml.busiversehq.com", apiPrefix: "/ml/api/v1", description: "Training, experiments, feature engineering, evaluation, and agent training.", usesTimeSeries: true },
|
|
205
|
+
{ key: "project", name: "Project", category: "business", frontendHost: "project.busiversehq.com", apiPrefix: "/project/api/v1", description: "Projects, tasks, milestones, budgets, teams, and deliverables." },
|
|
206
|
+
{ key: "registry", name: "Registry", category: "developer", frontendHost: "registry.busiversehq.com", apiPrefix: "/registry/api/v1", description: "Legacy registry frontend retained for migration/reference." },
|
|
207
|
+
{ key: "scraper", name: "Scraper", category: "intelligence", frontendHost: "scraper.busiversehq.com", apiPrefix: "/scraper/api/v1", description: "Data acquisition, scheduled feeds, connectors, and datasets.", usesTimeSeries: true },
|
|
208
|
+
{ key: "storage", name: "Storage", category: "core", frontendHost: "storage.busiversehq.com", apiPrefix: "/storage/api/v1", description: "Object custody, files, assets, evidence packs, backups, and retention." },
|
|
209
|
+
{ key: "template", name: "Template", category: "business", frontendHost: "template.busiversehq.com", apiPrefix: "/template/api/v1", description: "Templates, rendering, previews, versions, and branded exports." },
|
|
210
|
+
{ key: "user", name: "User", category: "core", frontendHost: "user.busiversehq.com", apiPrefix: "/user/api/v1", description: "Human profile, preferences, memberships, and signup entry." }
|
|
211
|
+
];
|
|
212
|
+
function getBusiverseService(key) {
|
|
213
|
+
return busiverseServices.find((service) => service.key === key);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/components/layout/AppShell.tsx
|
|
217
|
+
import { jsx as jsx9, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
218
|
+
function AppShell({ children, service, navigation, rightSlot, className }) {
|
|
219
|
+
const current = getBusiverseService(service);
|
|
220
|
+
const nav = navigation ?? [
|
|
221
|
+
{ label: "Dashboard", href: "/" },
|
|
222
|
+
{ label: "Records", href: "/records" },
|
|
223
|
+
{ label: "Billing", href: "/billing" },
|
|
224
|
+
{ label: "Settings", href: "/settings" }
|
|
225
|
+
];
|
|
226
|
+
return /* @__PURE__ */ jsxs2("div", { className: cn("busiverse-app-shell", className), children: [
|
|
227
|
+
/* @__PURE__ */ jsxs2("aside", { className: "busiverse-sidebar", children: [
|
|
228
|
+
/* @__PURE__ */ jsxs2("a", { className: "busiverse-sidebar-brand", href: "/", children: [
|
|
229
|
+
/* @__PURE__ */ jsx9(BusiverseLogo, { variant: "icon", tone: "color", className: "busiverse-sidebar-logo" }),
|
|
230
|
+
/* @__PURE__ */ jsx9("span", { children: current?.name ?? "BUSIVERSE" })
|
|
231
|
+
] }),
|
|
232
|
+
/* @__PURE__ */ jsx9("nav", { className: "busiverse-sidebar-nav", "aria-label": "Service navigation", children: nav.map((item) => /* @__PURE__ */ jsx9("a", { href: item.href, className: cn("busiverse-sidebar-link", item.active && "is-active"), children: item.label }, item.href)) }),
|
|
233
|
+
/* @__PURE__ */ jsxs2("div", { className: "busiverse-sidebar-services", children: [
|
|
234
|
+
/* @__PURE__ */ jsx9("span", { className: "busiverse-sidebar-kicker", children: "Ecosystem" }),
|
|
235
|
+
busiverseServices.slice(0, 8).map((item) => /* @__PURE__ */ jsx9("a", { href: `https://${item.frontendHost}`, className: "busiverse-sidebar-service-link", children: item.name }, item.key))
|
|
236
|
+
] })
|
|
237
|
+
] }),
|
|
238
|
+
/* @__PURE__ */ jsxs2("div", { className: "busiverse-main-panel", children: [
|
|
239
|
+
/* @__PURE__ */ jsxs2("header", { className: "busiverse-topbar", children: [
|
|
240
|
+
/* @__PURE__ */ jsx9(BusiverseLogo, { variant: "horizontal", tone: "white", className: "busiverse-topbar-logo" }),
|
|
241
|
+
/* @__PURE__ */ jsx9("div", { className: "busiverse-topbar-right", children: rightSlot })
|
|
242
|
+
] }),
|
|
243
|
+
/* @__PURE__ */ jsx9("main", { id: "main", className: "busiverse-main-content", children })
|
|
244
|
+
] })
|
|
245
|
+
] });
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// src/components/layout/PageHeader.tsx
|
|
249
|
+
import { jsx as jsx10, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
250
|
+
function PageHeader({ title, description, eyebrow, action, className }) {
|
|
251
|
+
return /* @__PURE__ */ jsxs3("div", { className: cn("busiverse-page-header", className), children: [
|
|
252
|
+
/* @__PURE__ */ jsxs3("div", { children: [
|
|
253
|
+
eyebrow && /* @__PURE__ */ jsx10("p", { className: "busiverse-eyebrow", children: eyebrow }),
|
|
254
|
+
/* @__PURE__ */ jsx10("h1", { children: title }),
|
|
255
|
+
description && /* @__PURE__ */ jsx10("p", { children: description })
|
|
256
|
+
] }),
|
|
257
|
+
action && /* @__PURE__ */ jsx10("div", { className: "busiverse-page-header-action", children: action })
|
|
258
|
+
] });
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// src/components/layout/ContentContainer.tsx
|
|
262
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
263
|
+
function ContentContainer({ className, ...props }) {
|
|
264
|
+
return /* @__PURE__ */ jsx11("div", { className: cn("busiverse-container", className), ...props });
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// src/components/data/DataTable.tsx
|
|
268
|
+
import { jsx as jsx12, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
269
|
+
function getCellValue(row, key) {
|
|
270
|
+
const value = row[String(key)];
|
|
271
|
+
if (value == null) return "\u2014";
|
|
272
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
|
|
273
|
+
return JSON.stringify(value);
|
|
274
|
+
}
|
|
275
|
+
function DataTable({ rows, columns, getRowKey, isLoading, emptyState, className, dense }) {
|
|
276
|
+
if (isLoading) return /* @__PURE__ */ jsx12("div", { className: "busiverse-table-state", children: "Loading records\u2026" });
|
|
277
|
+
if (!rows.length) return /* @__PURE__ */ jsx12("div", { className: "busiverse-table-state", children: emptyState ?? "No records found." });
|
|
278
|
+
return /* @__PURE__ */ jsx12("div", { className: cn("busiverse-table-wrap", className), children: /* @__PURE__ */ jsxs4("table", { className: cn("busiverse-table", dense && "is-dense"), children: [
|
|
279
|
+
/* @__PURE__ */ jsx12("thead", { children: /* @__PURE__ */ jsx12("tr", { children: columns.map((column) => /* @__PURE__ */ jsx12("th", { style: { width: column.width, textAlign: column.align }, children: column.header }, String(column.key))) }) }),
|
|
280
|
+
/* @__PURE__ */ jsx12("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx12("tr", { children: columns.map((column) => /* @__PURE__ */ jsx12("td", { style: { textAlign: column.align }, children: column.render ? column.render(row, rowIndex) : getCellValue(row, column.key) }, String(column.key))) }, getRowKey?.(row, rowIndex) ?? rowIndex)) })
|
|
281
|
+
] }) });
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// src/components/data/TimeSeriesTable.tsx
|
|
285
|
+
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
286
|
+
function formatTimestamp(value, locale, timeZone, granularity) {
|
|
287
|
+
const date = new Date(String(value));
|
|
288
|
+
const base = { timeZone };
|
|
289
|
+
const options = granularity === "second" ? { ...base, dateStyle: "medium", timeStyle: "medium" } : granularity === "minute" || granularity === "hour" ? { ...base, dateStyle: "medium", timeStyle: "short" } : granularity === "year" ? { ...base, year: "numeric" } : granularity === "month" ? { ...base, year: "numeric", month: "short" } : { ...base, dateStyle: "medium" };
|
|
290
|
+
return new Intl.DateTimeFormat(locale, options).format(date);
|
|
291
|
+
}
|
|
292
|
+
function TimeSeriesTable({
|
|
293
|
+
rows,
|
|
294
|
+
timestampKey,
|
|
295
|
+
valueColumns,
|
|
296
|
+
locale = "en-NG",
|
|
297
|
+
timeZone = "Africa/Lagos",
|
|
298
|
+
granularity = "minute",
|
|
299
|
+
isLoading
|
|
300
|
+
}) {
|
|
301
|
+
const columns = [
|
|
302
|
+
{
|
|
303
|
+
key: String(timestampKey),
|
|
304
|
+
header: "Time",
|
|
305
|
+
render: (row) => formatTimestamp(row[String(timestampKey)], locale, timeZone, granularity)
|
|
306
|
+
},
|
|
307
|
+
...valueColumns.map((key) => ({
|
|
308
|
+
key: String(key),
|
|
309
|
+
header: String(key),
|
|
310
|
+
align: "right",
|
|
311
|
+
render: (row) => {
|
|
312
|
+
const value = row[String(key)];
|
|
313
|
+
return typeof value === "number" ? new Intl.NumberFormat(locale, { maximumFractionDigits: 3 }).format(value) : String(value ?? "\u2014");
|
|
314
|
+
}
|
|
315
|
+
}))
|
|
316
|
+
];
|
|
317
|
+
return /* @__PURE__ */ jsx13(DataTable, { rows, columns, isLoading, dense: true });
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// src/components/data/StatCard.tsx
|
|
321
|
+
import { jsx as jsx14, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
322
|
+
function StatCard({ label, value, helper }) {
|
|
323
|
+
return /* @__PURE__ */ jsxs5(Card, { className: "busiverse-stat-card", children: [
|
|
324
|
+
/* @__PURE__ */ jsx14("span", { children: label }),
|
|
325
|
+
/* @__PURE__ */ jsx14("strong", { children: value }),
|
|
326
|
+
helper && /* @__PURE__ */ jsx14("small", { children: helper })
|
|
327
|
+
] });
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// src/components/data/StatusPill.tsx
|
|
331
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
332
|
+
var toneByStatus = {
|
|
333
|
+
active: "success",
|
|
334
|
+
healthy: "success",
|
|
335
|
+
running: "success",
|
|
336
|
+
pending: "warning",
|
|
337
|
+
warning: "warning",
|
|
338
|
+
failed: "danger",
|
|
339
|
+
error: "danger",
|
|
340
|
+
disabled: "slate"
|
|
341
|
+
};
|
|
342
|
+
function StatusPill({ status }) {
|
|
343
|
+
const key = status.toLowerCase();
|
|
344
|
+
return /* @__PURE__ */ jsx15(Badge, { tone: toneByStatus[key] ?? "blue", children: status });
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// src/components/forms/Field.tsx
|
|
348
|
+
import { jsx as jsx16, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
349
|
+
function Field({ label, htmlFor, hint, error, children, className }) {
|
|
350
|
+
return /* @__PURE__ */ jsxs6("div", { className: cn("busiverse-field", className), children: [
|
|
351
|
+
/* @__PURE__ */ jsx16("label", { htmlFor, children: label }),
|
|
352
|
+
children,
|
|
353
|
+
hint && !error && /* @__PURE__ */ jsx16("p", { className: "busiverse-field-hint", children: hint }),
|
|
354
|
+
error && /* @__PURE__ */ jsx16("p", { className: "busiverse-field-error", children: error })
|
|
355
|
+
] });
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// src/components/feedback/States.tsx
|
|
359
|
+
import { jsx as jsx17, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
360
|
+
function EmptyState({ title, description, action }) {
|
|
361
|
+
return /* @__PURE__ */ jsxs7(Card, { className: "busiverse-state", children: [
|
|
362
|
+
/* @__PURE__ */ jsx17("h2", { children: title }),
|
|
363
|
+
description && /* @__PURE__ */ jsx17("p", { children: description }),
|
|
364
|
+
action
|
|
365
|
+
] });
|
|
366
|
+
}
|
|
367
|
+
function ErrorState({ title = "Something went wrong", description, action }) {
|
|
368
|
+
return /* @__PURE__ */ jsxs7(Card, { className: "busiverse-state busiverse-state-error", children: [
|
|
369
|
+
/* @__PURE__ */ jsx17("h2", { children: title }),
|
|
370
|
+
description && /* @__PURE__ */ jsx17("p", { children: description }),
|
|
371
|
+
action
|
|
372
|
+
] });
|
|
373
|
+
}
|
|
374
|
+
function ForbiddenState({ description = "You do not have permission to access this resource." }) {
|
|
375
|
+
return /* @__PURE__ */ jsx17(ErrorState, { title: "Access denied", description, action: /* @__PURE__ */ jsx17(Button, { variant: "secondary", children: "Go back" }) });
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// src/i18n/format.ts
|
|
379
|
+
function formatCurrency(amount, region, options) {
|
|
380
|
+
return new Intl.NumberFormat(region.locale, { style: "currency", currency: region.currencyCode, ...options }).format(amount);
|
|
381
|
+
}
|
|
382
|
+
function formatNumber(value, locale = "en-NG", options) {
|
|
383
|
+
return new Intl.NumberFormat(locale, options).format(value);
|
|
384
|
+
}
|
|
385
|
+
function formatDate(value, region, options) {
|
|
386
|
+
return new Intl.DateTimeFormat(region.locale, { timeZone: region.timeZone, dateStyle: "medium", timeStyle: "short", ...options }).format(new Date(value));
|
|
387
|
+
}
|
|
388
|
+
function toRegionHeaders(region) {
|
|
389
|
+
return {
|
|
390
|
+
"Accept-Language": region.locale,
|
|
391
|
+
"X-Busiverse-Country": region.countryCode,
|
|
392
|
+
"X-Busiverse-Region": region.regionCode ?? region.countryCode,
|
|
393
|
+
"X-Busiverse-Currency": region.currencyCode,
|
|
394
|
+
"X-Busiverse-Timezone": region.timeZone
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// src/components/billing/CurrencyAmount.tsx
|
|
399
|
+
import { Fragment, jsx as jsx18 } from "react/jsx-runtime";
|
|
400
|
+
function CurrencyAmount({ amount, currency = "NGN", locale = "en-NG", minimumFractionDigits, maximumFractionDigits }) {
|
|
401
|
+
const region = { locale, currencyCode: currency };
|
|
402
|
+
return /* @__PURE__ */ jsx18(Fragment, { children: formatCurrency(amount, region, { minimumFractionDigits, maximumFractionDigits }) });
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// src/components/billing/UsageQuotaBar.tsx
|
|
406
|
+
import { jsx as jsx19, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
407
|
+
function UsageQuotaBar({ used, limit, label }) {
|
|
408
|
+
const percent = limit > 0 ? Math.min(100, Math.round(used / limit * 100)) : 0;
|
|
409
|
+
return /* @__PURE__ */ jsxs8("div", { className: "busiverse-quota", children: [
|
|
410
|
+
/* @__PURE__ */ jsxs8("div", { className: "busiverse-quota-row", children: [
|
|
411
|
+
/* @__PURE__ */ jsx19("span", { children: label }),
|
|
412
|
+
/* @__PURE__ */ jsxs8("span", { children: [
|
|
413
|
+
used.toLocaleString(),
|
|
414
|
+
" / ",
|
|
415
|
+
limit.toLocaleString()
|
|
416
|
+
] })
|
|
417
|
+
] }),
|
|
418
|
+
/* @__PURE__ */ jsx19("div", { className: "busiverse-quota-track", children: /* @__PURE__ */ jsx19("div", { className: "busiverse-quota-fill", style: { width: `${percent}%` } }) })
|
|
419
|
+
] });
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// src/components/marketing/HeroSection.tsx
|
|
423
|
+
import { jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
424
|
+
function HeroSection({
|
|
425
|
+
title = "Turn Ideas Into Operating Businesses",
|
|
426
|
+
subtitle = "BUSIVERSE combines AI automation, blockchain-backed trust, and modular business services to help teams launch and operate ventures faster.",
|
|
427
|
+
primaryCta = /* @__PURE__ */ jsx20(Button, { children: "Start Building" }),
|
|
428
|
+
secondaryCta = /* @__PURE__ */ jsx20(Button, { variant: "secondary", children: "Explore the Platform" })
|
|
429
|
+
}) {
|
|
430
|
+
return /* @__PURE__ */ jsx20("section", { className: "busiverse-hero", children: /* @__PURE__ */ jsxs9("div", { className: "busiverse-hero-content", children: [
|
|
431
|
+
/* @__PURE__ */ jsx20(BusiverseLogo, { variant: "full", tone: "white", className: "busiverse-hero-logo" }),
|
|
432
|
+
/* @__PURE__ */ jsx20("h1", { children: title }),
|
|
433
|
+
/* @__PURE__ */ jsx20("p", { children: subtitle }),
|
|
434
|
+
/* @__PURE__ */ jsxs9("div", { className: "busiverse-hero-actions", children: [
|
|
435
|
+
primaryCta,
|
|
436
|
+
secondaryCta
|
|
437
|
+
] })
|
|
438
|
+
] }) });
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// src/api/createGatewayClient.ts
|
|
442
|
+
var GatewayApiError = class extends Error {
|
|
443
|
+
status;
|
|
444
|
+
body;
|
|
445
|
+
constructor(status, body, message = `Gateway request failed with ${status}`) {
|
|
446
|
+
super(message);
|
|
447
|
+
this.name = "GatewayApiError";
|
|
448
|
+
this.status = status;
|
|
449
|
+
this.body = body;
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
async function parseBody(response) {
|
|
453
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
454
|
+
if (contentType.includes("application/json")) return response.json();
|
|
455
|
+
return response.text();
|
|
456
|
+
}
|
|
457
|
+
function createGatewayClient(options) {
|
|
458
|
+
const request = async (path, init = {}) => {
|
|
459
|
+
const token = typeof options.getAccessToken === "function" ? await options.getAccessToken() : options.getAccessToken;
|
|
460
|
+
const region = init.region ?? options.region;
|
|
461
|
+
const headers = new Headers(options.defaultHeaders);
|
|
462
|
+
headers.set("Accept", "application/json");
|
|
463
|
+
if (!(init.body instanceof FormData)) headers.set("Content-Type", "application/json");
|
|
464
|
+
if (token) headers.set("Authorization", `Bearer ${token}`);
|
|
465
|
+
if (init.idempotencyKey) headers.set("Idempotency-Key", init.idempotencyKey);
|
|
466
|
+
if (init.correlationId) headers.set("X-Correlation-Id", init.correlationId);
|
|
467
|
+
if (region) Object.entries(toRegionHeaders(region)).forEach(([key, value]) => headers.set(key, value));
|
|
468
|
+
new Headers(init.headers).forEach((value, key) => headers.set(key, value));
|
|
469
|
+
const response = await fetch(new URL(path, options.baseUrl).toString(), { ...init, headers });
|
|
470
|
+
if (response.status === 401) options.onUnauthorized?.();
|
|
471
|
+
if (!response.ok) throw new GatewayApiError(response.status, await parseBody(response));
|
|
472
|
+
if (response.status === 204) return void 0;
|
|
473
|
+
return parseBody(response);
|
|
474
|
+
};
|
|
475
|
+
return {
|
|
476
|
+
request,
|
|
477
|
+
get: (path, init) => request(path, { ...init, method: "GET" }),
|
|
478
|
+
post: (path, body, init) => request(path, { ...init, method: "POST", body: body instanceof FormData ? body : JSON.stringify(body ?? {}) }),
|
|
479
|
+
put: (path, body, init) => request(path, { ...init, method: "PUT", body: body instanceof FormData ? body : JSON.stringify(body ?? {}) }),
|
|
480
|
+
patch: (path, body, init) => request(path, { ...init, method: "PATCH", body: body instanceof FormData ? body : JSON.stringify(body ?? {}) }),
|
|
481
|
+
delete: (path, init) => request(path, { ...init, method: "DELETE" })
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// src/auth/AuthSessionProvider.tsx
|
|
486
|
+
import * as React5 from "react";
|
|
487
|
+
import { jsx as jsx21 } from "react/jsx-runtime";
|
|
488
|
+
var AuthContext = React5.createContext(null);
|
|
489
|
+
function AuthSessionProvider({ children, session }) {
|
|
490
|
+
return /* @__PURE__ */ jsx21(AuthContext.Provider, { value: session, children });
|
|
491
|
+
}
|
|
492
|
+
function useBusiverseAuth() {
|
|
493
|
+
const value = React5.useContext(AuthContext);
|
|
494
|
+
if (!value) throw new Error("useBusiverseAuth must be used inside AuthSessionProvider");
|
|
495
|
+
return value;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// src/auth/RequireAuth.tsx
|
|
499
|
+
import { Fragment as Fragment2, jsx as jsx22, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
500
|
+
function RequireAuth({ children }) {
|
|
501
|
+
const auth = useBusiverseAuth();
|
|
502
|
+
if (auth.isLoading) return /* @__PURE__ */ jsx22("div", { className: "busiverse-loading-state", children: "Checking session\u2026" });
|
|
503
|
+
if (!auth.isAuthenticated) {
|
|
504
|
+
return /* @__PURE__ */ jsxs10("div", { className: "busiverse-auth-required", children: [
|
|
505
|
+
/* @__PURE__ */ jsx22("h1", { children: "Sign in required" }),
|
|
506
|
+
/* @__PURE__ */ jsx22("p", { children: "Use your BUSIVERSE account to continue." }),
|
|
507
|
+
/* @__PURE__ */ jsx22(Button, { onClick: () => void auth.signIn(), children: "Sign in" })
|
|
508
|
+
] });
|
|
509
|
+
}
|
|
510
|
+
return /* @__PURE__ */ jsx22(Fragment2, { children });
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// src/auth/SignUpLink.tsx
|
|
514
|
+
import { jsx as jsx23 } from "react/jsx-runtime";
|
|
515
|
+
function SignUpLink({ signupUrl = "https://user.busiversehq.com/signup", children = "Create your Busiverse account", ...props }) {
|
|
516
|
+
return /* @__PURE__ */ jsx23("a", { href: signupUrl, ...props, children });
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// src/auth/UserMenu.tsx
|
|
520
|
+
import { jsx as jsx24, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
521
|
+
function UserMenu() {
|
|
522
|
+
const auth = useBusiverseAuth();
|
|
523
|
+
if (!auth.isAuthenticated || !auth.user) return /* @__PURE__ */ jsx24(Button, { size: "sm", onClick: () => void auth.signIn(), children: "Sign in" });
|
|
524
|
+
return /* @__PURE__ */ jsxs11("div", { className: "busiverse-user-menu", children: [
|
|
525
|
+
/* @__PURE__ */ jsx24("span", { children: auth.user.name ?? auth.user.email ?? "User" }),
|
|
526
|
+
/* @__PURE__ */ jsx24(Button, { size: "sm", variant: "ghost", onClick: () => void auth.signOut(), children: "Sign out" })
|
|
527
|
+
] });
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// src/i18n/BusiverseI18nProvider.tsx
|
|
531
|
+
import * as React6 from "react";
|
|
532
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
533
|
+
var defaultRegion = {
|
|
534
|
+
locale: "en-NG",
|
|
535
|
+
countryCode: "NG",
|
|
536
|
+
regionCode: "NG-LA",
|
|
537
|
+
currencyCode: "NGN",
|
|
538
|
+
timeZone: "Africa/Lagos"
|
|
539
|
+
};
|
|
540
|
+
var I18nContext = React6.createContext(null);
|
|
541
|
+
function BusiverseI18nProvider({ children, initialRegion, bundles = {} }) {
|
|
542
|
+
const [region, setRegion] = React6.useState({ ...defaultRegion, ...initialRegion });
|
|
543
|
+
const t = React6.useCallback((key, fallback, vars) => {
|
|
544
|
+
const value = bundles[region.locale]?.[key] ?? bundles[region.locale.split("-")[0]]?.[key] ?? fallback ?? key;
|
|
545
|
+
if (!vars) return value;
|
|
546
|
+
return Object.entries(vars).reduce((acc, [name, val]) => acc.replaceAll(`{${name}}`, String(val)), value);
|
|
547
|
+
}, [bundles, region.locale]);
|
|
548
|
+
return /* @__PURE__ */ jsx25(I18nContext.Provider, { value: { region, bundles, setRegion, t }, children });
|
|
549
|
+
}
|
|
550
|
+
function useBusiverseI18n() {
|
|
551
|
+
const ctx = React6.useContext(I18nContext);
|
|
552
|
+
if (!ctx) throw new Error("useBusiverseI18n must be used inside BusiverseI18nProvider");
|
|
553
|
+
return ctx;
|
|
554
|
+
}
|
|
555
|
+
export {
|
|
556
|
+
AppShell,
|
|
557
|
+
AuthSessionProvider,
|
|
558
|
+
Badge,
|
|
559
|
+
BusiverseI18nProvider,
|
|
560
|
+
BusiverseLogo,
|
|
561
|
+
Button,
|
|
562
|
+
Card,
|
|
563
|
+
CardContent,
|
|
564
|
+
CardDescription,
|
|
565
|
+
CardHeader,
|
|
566
|
+
CardTitle,
|
|
567
|
+
ContentContainer,
|
|
568
|
+
CurrencyAmount,
|
|
569
|
+
DataTable,
|
|
570
|
+
EmptyState,
|
|
571
|
+
ErrorState,
|
|
572
|
+
Field,
|
|
573
|
+
ForbiddenState,
|
|
574
|
+
GatewayApiError,
|
|
575
|
+
HeroSection,
|
|
576
|
+
Input,
|
|
577
|
+
PageHeader,
|
|
578
|
+
RequireAuth,
|
|
579
|
+
Select,
|
|
580
|
+
SignUpLink,
|
|
581
|
+
Skeleton,
|
|
582
|
+
StatCard,
|
|
583
|
+
StatusPill,
|
|
584
|
+
Textarea,
|
|
585
|
+
TimeSeriesTable,
|
|
586
|
+
UsageQuotaBar,
|
|
587
|
+
UserMenu,
|
|
588
|
+
busiverseAssets,
|
|
589
|
+
busiverseColors,
|
|
590
|
+
busiverseContainers,
|
|
591
|
+
busiverseMotion,
|
|
592
|
+
busiverseRadius,
|
|
593
|
+
busiverseServices,
|
|
594
|
+
busiverseSpacing,
|
|
595
|
+
busiverseTypography,
|
|
596
|
+
cn,
|
|
597
|
+
createGatewayClient,
|
|
598
|
+
formatCurrency,
|
|
599
|
+
formatDate,
|
|
600
|
+
formatNumber,
|
|
601
|
+
getBusiverseService,
|
|
602
|
+
toRegionHeaders,
|
|
603
|
+
useBusiverseAuth,
|
|
604
|
+
useBusiverseI18n
|
|
605
|
+
};
|
|
606
|
+
//# sourceMappingURL=index.js.map
|