@busiverse/ui 0.2.5 → 0.2.7

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 CHANGED
@@ -1,282 +1,39 @@
1
1
  # @busiverse/ui
2
2
 
3
- Shared BUSIVERSE frontend package for separately deployed React/Vercel applications.
3
+ Shared BUSIVERSE frontend UI package.
4
4
 
5
- It contains:
5
+ Version: `0.2.7`
6
6
 
7
- - Official BUSIVERSE brand asset wrappers.
8
- - Design tokens and Tailwind 4-compatible theme helpers.
9
- - Global CSS, fonts, reduced-motion, focus states, glass cards, buttons, tables, forms, and app shell.
10
- - Gateway-only API client foundation.
11
- - OIDC/auth UI helpers for signin and user-frontend-only signup routing.
12
- - Internationalization, country/region/currency, timezone, and locale utilities.
13
- - CRUD and time-series-ready table components.
14
- - Dashboard, billing, feedback, and marketing primitives.
7
+ ## Purpose
15
8
 
16
- ## Requirements
9
+ `@busiverse/ui` is the shared UI foundation for separately deployed Busiverse frontends on Vercel. It owns reusable brand assets, design tokens, shared CSS, brand metadata, social icons, i18n region context, reusable app-shell primitives, data tables, internal pricing tooling, and customer-facing marketing primitives.
17
10
 
18
- - Node.js `>=22.12.0`
19
- - npm `>=10.9.0`
20
- - React `19.2.7` compatible frontend applications
11
+ The package remains network-neutral. It does not call `fetch`, load remote fonts, open sockets, or make network requests by itself. Frontends inject their own Gateway transport when they need API access.
21
12
 
22
- This package is ESM-only. It does not publish CommonJS output.
13
+ ## Public vs internal pricing
23
14
 
24
- ## Tailwind 4 note
15
+ The package contains two separate layers:
25
16
 
26
- `@busiverse/ui` does not require PostCSS.
17
+ - `@busiverse/ui/marketing`: public/customer-facing pricing cards and marketing primitives.
18
+ - `@busiverse/ui/billing`: internal/admin pricing explorer for operation-level tariffs, costs, margins, and chargeback visibility.
27
19
 
28
- The package ships its own compiled/global CSS as `@busiverse/ui/styles.css` and exports a plain Tailwind-compatible preset object from `@busiverse/ui/tailwind`. Consuming applications may use Tailwind through Vite, PostCSS, or another supported integration. The UI package itself does not force `@tailwindcss/postcss` or `@tailwindcss/vite` on consumers.
20
+ BusiLand should use the marketing layer. Internal/admin frontends may use the billing layer.
29
21
 
30
- ## Install in separately deployed Vercel frontends
31
-
32
- Recommended production option: publish to a private npm registry package.
33
-
34
- ```bash
35
- npm install @busiverse/ui
36
- ```
37
-
38
- Local package test option:
39
-
40
- ```bash
41
- cd packages/busiverse-ui
42
- npm install
43
- npm run build
44
- npm pack
45
- # then in each frontend
46
- npm install ../packages/busiverse-ui/busiverse-ui-0.1.0.tgz
47
- ```
48
-
49
- ## Add CSS once per frontend
50
-
51
- In `src/main.tsx` or `src/App.tsx`:
22
+ ## Imports
52
23
 
53
24
  ```tsx
54
25
  import "@busiverse/ui/styles.css";
26
+ import { BusiverseBrandHead, BusiverseLogo } from "@busiverse/ui/brand";
27
+ import { BusiverseI18nProvider } from "@busiverse/ui/i18n";
28
+ import { MarketingPricingCard } from "@busiverse/ui/marketing";
29
+ import { BusiverseGithubIcon } from "@busiverse/ui/social";
55
30
  ```
56
31
 
57
- ## Configure env per Vercel frontend
58
-
59
- ```env
60
- VITE_GATEWAY_API_URL=https://api.busiversehq.com
61
- VITE_SIGNUP_URL=https://user.busiversehq.com/signup
62
- VITE_SERVICE_KEY=communication
63
- VITE_DEFAULT_LOCALE=en-NG
64
- VITE_DEFAULT_COUNTRY=NG
65
- VITE_DEFAULT_REGION=NG-LA
66
- VITE_DEFAULT_CURRENCY=NGN
67
- VITE_DEFAULT_TIME_ZONE=Africa/Lagos
68
- ```
69
-
70
- ## Use AppShell
71
-
72
- ```tsx
73
- import { AppShell, PageHeader, Button } from "@busiverse/ui";
74
-
75
- export function Dashboard() {
76
- return (
77
- <AppShell service="communication">
78
- <PageHeader
79
- title="Communication"
80
- description="Send, automate, and track messages across Busiverse."
81
- action={<Button>New message</Button>}
82
- />
83
- </AppShell>
84
- );
85
- }
86
- ```
87
-
88
- ## Use Gateway client
89
-
90
- ```tsx
91
- import { createGatewayClient } from "@busiverse/ui";
92
-
93
- const gateway = createGatewayClient({
94
- baseUrl: import.meta.env.VITE_GATEWAY_API_URL,
95
- getAccessToken: async () => token,
96
- region: {
97
- locale: "en-NG",
98
- countryCode: "NG",
99
- regionCode: "NG-LA",
100
- currencyCode: "NGN",
101
- timeZone: "Africa/Lagos"
102
- }
103
- });
104
-
105
- await gateway.get("/communication/api/v1/messages");
106
- ```
107
-
108
- ## Use the Tailwind preset only when needed
109
-
110
- If a consuming app uses Tailwind and wants Busiverse tokens:
111
-
112
- ```ts
113
- import { busiverseTailwindPreset } from "@busiverse/ui/tailwind";
114
-
115
- export default {
116
- presets: [busiverseTailwindPreset],
117
- content: ["./index.html", "./src/**/*.{ts,tsx}"]
118
- };
119
- ```
120
-
121
- For Busiverse Vite frontends, Tailwind itself should be configured in the frontend app, not inside this UI package.
122
-
123
- ## Timeseries table
124
-
125
- ```tsx
126
- import { TimeSeriesTable } from "@busiverse/ui";
127
-
128
- <TimeSeriesTable
129
- rows={metrics}
130
- timestampKey="createdAt"
131
- valueColumns={["requestCount", "p95LatencyMs", "errorRate"]}
132
- />
133
- ```
134
-
135
- ## Signup rule
136
-
137
- Only `user-frontend` should own real signup. Other frontends should use `<SignUpLink />` and route users to `https://user.busiversehq.com/signup`.
138
-
139
- ## Build and publish
32
+ ## Publish
140
33
 
141
34
  ```bash
142
35
  npm install
143
36
  npm run typecheck
144
37
  npm run build
145
- npm audit --audit-level=low
146
- npm pack --dry-run
147
38
  npm publish --access public
148
39
  ```
149
-
150
- ## Version 0.2.0 additions
151
-
152
- This release adds the BUSIVERSE standardized service pricing system used by `busiverse-landing` and reusable by every separately deployed Vercel frontend.
153
-
154
- ### Added
155
-
156
- - `busiverseServicePricingCatalog` with 257 Account-rated operation rows.
157
- - `ServicePricingExplorer` for external pricing, internal Busiverse chargeback, estimated direct cost, margin, and standardized equivalents.
158
- - `RegionSelector` and supported pricing regions.
159
- - Country/region/currency/time-zone aware pricing display helpers.
160
- - Time-series aware service metadata for services that surface metrics, decision history, request metering, blockchain events, model jobs, and market data.
161
-
162
- ### Vercel frontend usage
163
-
164
- Install from public npm after publishing this version:
165
-
166
- ```bash
167
- npm install @busiverse/ui@^0.2.0
168
- ```
169
-
170
- Import shared styles once in each Vite frontend entrypoint:
171
-
172
- ```tsx
173
- import "@busiverse/ui/styles.css";
174
- ```
175
-
176
- Wrap the frontend with the i18n provider:
177
-
178
- ```tsx
179
- import { BusiverseI18nProvider } from "@busiverse/ui";
180
-
181
- <BusiverseI18nProvider
182
- initialRegion={{
183
- locale: import.meta.env.VITE_DEFAULT_LOCALE ?? "en-NG",
184
- countryCode: import.meta.env.VITE_DEFAULT_COUNTRY ?? "NG",
185
- regionCode: import.meta.env.VITE_DEFAULT_REGION ?? "NG-LA",
186
- currencyCode: import.meta.env.VITE_DEFAULT_CURRENCY ?? "NGN",
187
- timeZone: import.meta.env.VITE_DEFAULT_TIME_ZONE ?? "Africa/Lagos",
188
- }}
189
- >
190
- <App />
191
- </BusiverseI18nProvider>
192
- ```
193
-
194
- Use the standardized pricing explorer anywhere pricing must be shown:
195
-
196
- ```tsx
197
- import { ServicePricingExplorer } from "@busiverse/ui";
198
-
199
- <ServicePricingExplorer />
200
- ```
201
-
202
- The current currency conversion rates are display fallbacks only. Final production charging still belongs to Account, with Location and Mint resolving region, currency, taxes, pass-through cost, and local pricing rules.
203
-
204
-
205
- ## v0.2.1 network-neutral security patch
206
-
207
- `@busiverse/ui` no longer performs direct network access from inside the package. The previous `createGatewayClient` implementation used the browser `fetch` global directly, which can be flagged by npm/package scanners as “network access”. The package now requires the consuming frontend to inject a transport function.
208
-
209
- ```ts
210
- import { createGatewayClient } from "@busiverse/ui";
211
-
212
- export const gateway = createGatewayClient({
213
- baseUrl: import.meta.env.VITE_GATEWAY_API_URL,
214
- transport: window.fetch.bind(window),
215
- getAccessToken: async () => accessToken,
216
- });
217
- ```
218
-
219
- Font loading is also app-owned. The shared CSS does not import Google Fonts or any remote stylesheet. Each separately deployed Vercel frontend should self-host the BUSIVERSE fonts or load them explicitly at the app level.
220
-
221
-
222
- ## v0.2.2 brand asset ownership
223
-
224
- `@busiverse/ui` is now the owner of BUSIVERSE favicons, platform icons, social preview defaults, and logo assets. Consuming frontends should not duplicate BUSIVERSE favicon/logo assets in their own `public/` folders unless a deployment platform explicitly requires a static file before JavaScript loads.
225
-
226
- Use `BusiverseBrandHead` once near the root of each frontend to inject the shared favicons, app manifest, Open Graph metadata, Twitter card metadata, and Microsoft tile metadata from package-owned assets.
227
-
228
- ```tsx
229
- import { BusiverseBrandHead } from "@busiverse/ui";
230
-
231
- <BusiverseBrandHead
232
- title="BUSIVERSE — Turn Ideas Into Operating Businesses"
233
- description="BUSIVERSE combines AI automation, blockchain-backed trust, and modular business services to help teams launch and operate ventures faster."
234
- />
235
- ```
236
-
237
- The package remains network-neutral: it does not call `fetch`, open sockets, or import remote fonts.
238
-
239
-
240
- ## v0.2.4 social icon ownership
241
-
242
- `@busiverse/ui` owns BUSIVERSE-approved social icon wrappers so separately deployed frontends do not import brand icons from `lucide-react`. Lucide is an outline UI-icon library and newer builds do not export brand icons such as `Github`, `Twitter`, or `Linkedin`. Use:
243
-
244
- ```tsx
245
- import { BusiverseGithubIcon, BusiverseXIcon, BusiverseLinkedInIcon, BusiverseMailIcon } from "@busiverse/ui";
246
- ```
247
-
248
- The package remains network-neutral. The icons are inline SVG React components and do not fetch remote assets.
249
-
250
- ## v0.2.5 root export and asset policy
251
-
252
- The root `@busiverse/ui` entry no longer re-exports the full brand asset manifest. This prevents every separately deployed frontend from emitting all social/profile/cover assets just because it imports a component from `@busiverse/ui`.
253
-
254
- Use root imports for components and helpers:
255
-
256
- ```ts
257
- import { BusiverseBrandHead, BusiverseLogo, ServicePricingExplorer } from "@busiverse/ui";
258
- ```
259
-
260
- Use the explicit asset subpath only when an app truly needs the raw asset manifest:
261
-
262
- ```ts
263
- import { busiverseAssets } from "@busiverse/ui/assets";
264
- ```
265
-
266
- This keeps BusiLand and the other Vercel frontends smaller while preserving the shared asset source of truth.
267
-
268
- ## v0.2.5 subpath imports
269
-
270
- `@busiverse/ui` now publishes explicit subpath entrypoints so separately deployed Vercel frontends can avoid pulling unrelated pricing, social, or raw asset modules into the initial bundle.
271
-
272
- Preferred imports:
273
-
274
- ```ts
275
- import { BusiverseLogo, BusiverseBrandHead } from "@busiverse/ui/brand";
276
- import { BusiverseI18nProvider, RegionSelector } from "@busiverse/ui/i18n";
277
- import { ServicePricingExplorer } from "@busiverse/ui/billing";
278
- import { BusiverseGithubIcon, BusiverseXIcon } from "@busiverse/ui/social";
279
- import { busiverseAssets } from "@busiverse/ui/assets";
280
- ```
281
-
282
- The root package export remains for compatibility, but production frontends should use subpath imports when working with large modules.
@@ -0,0 +1,49 @@
1
+ // src/assets/assets.ts
2
+ var busiverseAssets = {
3
+ logo: {
4
+ horizontal: {
5
+ white: new URL("./logo/busiverse-horizontal---white.svg", import.meta.url).href,
6
+ black: new URL("./logo/busiverse-horizontal---black.svg", import.meta.url).href,
7
+ color: new URL("./logo/busiverse-horizontal---color.svg", import.meta.url).href
8
+ },
9
+ full: {
10
+ white: new URL("./logo/busiverse-primary-full-logo---white.svg", import.meta.url).href,
11
+ black: new URL("./logo/busiverse-primary-full-logo---black.svg", import.meta.url).href,
12
+ color: new URL("./logo/busiverse-primary-full-logo---color.svg", import.meta.url).href
13
+ },
14
+ vertical: {
15
+ white: new URL("./logo/busiverse-vertical---white.svg", import.meta.url).href,
16
+ black: new URL("./logo/busiverse-vertical---black.svg", import.meta.url).href,
17
+ color: new URL("./logo/busiverse-vertical---color.svg", import.meta.url).href
18
+ },
19
+ icon: {
20
+ white: new URL("./icon/busiverse-icon-only---white.svg", import.meta.url).href,
21
+ black: new URL("./icon/busiverse-icon-only---black.svg", import.meta.url).href,
22
+ color: new URL("./icon/busiverse-icon-only---color.svg", import.meta.url).href
23
+ }
24
+ },
25
+ favicon: {
26
+ ico: new URL("./favicon.io/favicon.ico", import.meta.url).href,
27
+ png16: new URL("./favicon.io/favicon-16x16.png", import.meta.url).href,
28
+ png32: new URL("./favicon.io/favicon-32x32.png", import.meta.url).href,
29
+ png96: new URL("./favicon.io/favicon-96x96.png", import.meta.url).href,
30
+ appleTouchIcon: new URL("./favicon.io/apple-touch-icon.png", import.meta.url).href,
31
+ androidChrome192: new URL("./favicon.io/android-chrome-192x192.png", import.meta.url).href,
32
+ androidChrome512: new URL("./favicon.io/android-chrome-512x512.png", import.meta.url).href,
33
+ androidIcon192: new URL("./favicon.io/android-icon-192x192.png", import.meta.url).href,
34
+ msTile144: new URL("./favicon.io/ms-icon-144x144.png", import.meta.url).href
35
+ },
36
+ social: {
37
+ xHeader: new URL("./social/busiverse-twitter_x-header-2.7777777777777777x-darkbg.png", import.meta.url).href,
38
+ xProfile: new URL("./social/busiverse-twitter_x-profile-picture-2.2222222222222223x-darkbg.png", import.meta.url).href,
39
+ linkedInCover: new URL("./social/busiverse-linkedin-cover-photo-2.64x-darkbg.png", import.meta.url).href,
40
+ linkedInProfile: new URL("./social/busiverse-linkedin-profile-picture-2.2222222222222223x-darkbg.png", import.meta.url).href,
41
+ facebookCover: new URL("./social/busiverse-facebook-cover-photo-1.7333333333333334x-darkbg.png", import.meta.url).href,
42
+ facebookProfile: new URL("./social/busiverse-facebook-profile-picture-1x-darkbg.png", import.meta.url).href,
43
+ instagramPost: new URL("./social/busiverse-instagram-post-6x-darkbg.png", import.meta.url).href,
44
+ instagramProfile: new URL("./social/busiverse-instagram-profile-picture-1.7777777777777777x-darkbg.png", import.meta.url).href
45
+ }
46
+ };
47
+ export {
48
+ busiverseAssets
49
+ };
@@ -35,119 +35,6 @@ function BusiverseLogo({ variant = "horizontal", tone = "white", label = "BUSIVE
35
35
  );
36
36
  }
37
37
 
38
- // src/components/brand/BusiverseBrandHead.tsx
39
- import * as React from "react";
40
- var faviconIco = new URL("../../assets/assets/favicon.io/favicon.ico", import.meta.url).href;
41
- var faviconPng16 = new URL("../../assets/assets/favicon.io/favicon-16x16.png", import.meta.url).href;
42
- var faviconPng32 = new URL("../../assets/assets/favicon.io/favicon-32x32.png", import.meta.url).href;
43
- var faviconPng96 = new URL("../../assets/assets/favicon.io/favicon-96x96.png", import.meta.url).href;
44
- var appleTouchIcon = new URL("../../assets/assets/favicon.io/apple-touch-icon.png", import.meta.url).href;
45
- var androidIcon192 = new URL("../../assets/assets/favicon.io/android-icon-192x192.png", import.meta.url).href;
46
- var androidChrome192 = new URL("../../assets/assets/favicon.io/android-chrome-192x192.png", import.meta.url).href;
47
- var androidChrome512 = new URL("../../assets/assets/favicon.io/android-chrome-512x512.png", import.meta.url).href;
48
- var msTile144 = new URL("../../assets/assets/favicon.io/ms-icon-144x144.png", import.meta.url).href;
49
- var defaultSocialImage = new URL("../../assets/assets/social/busiverse-twitter_x-header-2.7777777777777777x-darkbg.png", import.meta.url).href;
50
- var DEFAULT_TITLE = "BUSIVERSE \u2014 Turn Ideas Into Operating Businesses";
51
- var DEFAULT_DESCRIPTION = "BUSIVERSE combines AI automation, blockchain-backed trust, and modular business services to help teams launch and operate ventures faster.";
52
- var DEFAULT_THEME_COLOR = "#020617";
53
- function ensureMeta(selector, attributes) {
54
- let node = document.head.querySelector(selector);
55
- if (!node) {
56
- node = document.createElement("meta");
57
- document.head.appendChild(node);
58
- }
59
- Object.entries(attributes).forEach(([key, value]) => node?.setAttribute(key, value));
60
- return node;
61
- }
62
- function ensureLink(selector, attributes) {
63
- let node = document.head.querySelector(selector);
64
- if (!node) {
65
- node = document.createElement("link");
66
- node.setAttribute("data-busiverse-ui-head", "true");
67
- document.head.appendChild(node);
68
- }
69
- Object.entries(attributes).forEach(([key, value]) => node?.setAttribute(key, value));
70
- return node;
71
- }
72
- function createManifestDataUrl(title, description, themeColor) {
73
- const manifest = {
74
- name: title,
75
- short_name: "BUSIVERSE",
76
- description,
77
- start_url: "/",
78
- scope: "/",
79
- display: "standalone",
80
- background_color: themeColor,
81
- theme_color: themeColor,
82
- icons: [
83
- { src: androidChrome192, sizes: "192x192", type: "image/png" },
84
- { src: androidChrome512, sizes: "512x512", type: "image/png" }
85
- ]
86
- };
87
- return `data:application/manifest+json,${encodeURIComponent(JSON.stringify(manifest))}`;
88
- }
89
- function applyBusiverseBrandHead({
90
- title = DEFAULT_TITLE,
91
- description = DEFAULT_DESCRIPTION,
92
- siteName = "Busiverse",
93
- url,
94
- image = defaultSocialImage,
95
- twitterSite = "@busiverse1",
96
- keywords = "Busiverse, AI automation, blockchain-backed trust, modular business services, distributed business infrastructure",
97
- locale = "en_NG",
98
- themeColor = DEFAULT_THEME_COLOR,
99
- appleMobileWebAppTitle = "BUSIVERSE",
100
- applicationName = "BUSIVERSE"
101
- } = {}) {
102
- document.title = title;
103
- ensureMeta('meta[name="description"]', { name: "description", content: description });
104
- ensureMeta('meta[name="keywords"]', { name: "keywords", content: keywords });
105
- ensureMeta('meta[name="theme-color"]', { name: "theme-color", content: themeColor });
106
- ensureMeta('meta[name="application-name"]', { name: "application-name", content: applicationName });
107
- ensureMeta('meta[name="apple-mobile-web-app-title"]', { name: "apple-mobile-web-app-title", content: appleMobileWebAppTitle });
108
- ensureMeta('meta[name="msapplication-TileColor"]', { name: "msapplication-TileColor", content: themeColor });
109
- ensureMeta('meta[name="msapplication-TileImage"]', { name: "msapplication-TileImage", content: msTile144 });
110
- ensureLink('link[data-busiverse-ui-head="icon-ico"]', { rel: "icon", type: "image/x-icon", href: faviconIco, "data-busiverse-ui-head": "icon-ico" });
111
- ensureLink('link[data-busiverse-ui-head="icon-16"]', { rel: "icon", type: "image/png", sizes: "16x16", href: faviconPng16, "data-busiverse-ui-head": "icon-16" });
112
- ensureLink('link[data-busiverse-ui-head="icon-32"]', { rel: "icon", type: "image/png", sizes: "32x32", href: faviconPng32, "data-busiverse-ui-head": "icon-32" });
113
- ensureLink('link[data-busiverse-ui-head="icon-96"]', { rel: "icon", type: "image/png", sizes: "96x96", href: faviconPng96, "data-busiverse-ui-head": "icon-96" });
114
- ensureLink('link[data-busiverse-ui-head="icon-192"]', { rel: "icon", type: "image/png", sizes: "192x192", href: androidIcon192, "data-busiverse-ui-head": "icon-192" });
115
- ensureLink('link[data-busiverse-ui-head="apple-touch-icon"]', { rel: "apple-touch-icon", sizes: "180x180", href: appleTouchIcon, "data-busiverse-ui-head": "apple-touch-icon" });
116
- ensureLink('link[data-busiverse-ui-head="manifest"]', { rel: "manifest", href: createManifestDataUrl(title, description, themeColor), "data-busiverse-ui-head": "manifest" });
117
- ensureMeta('meta[property="og:title"]', { property: "og:title", content: title });
118
- ensureMeta('meta[property="og:description"]', { property: "og:description", content: description });
119
- ensureMeta('meta[property="og:type"]', { property: "og:type", content: "website" });
120
- ensureMeta('meta[property="og:site_name"]', { property: "og:site_name", content: siteName });
121
- ensureMeta('meta[property="og:locale"]', { property: "og:locale", content: locale });
122
- ensureMeta('meta[property="og:image"]', { property: "og:image", content: image });
123
- if (url) ensureMeta('meta[property="og:url"]', { property: "og:url", content: url });
124
- ensureMeta('meta[name="twitter:card"]', { name: "twitter:card", content: "summary_large_image" });
125
- ensureMeta('meta[name="twitter:title"]', { name: "twitter:title", content: title });
126
- ensureMeta('meta[name="twitter:description"]', { name: "twitter:description", content: description });
127
- ensureMeta('meta[name="twitter:site"]', { name: "twitter:site", content: twitterSite });
128
- ensureMeta('meta[name="twitter:image"]', { name: "twitter:image", content: image });
129
- }
130
- function BusiverseBrandHead(props) {
131
- React.useEffect(() => {
132
- applyBusiverseBrandHead(props);
133
- }, [
134
- props.title,
135
- props.description,
136
- props.siteName,
137
- props.url,
138
- props.image,
139
- props.twitterSite,
140
- props.keywords,
141
- props.locale,
142
- props.themeColor,
143
- props.appleMobileWebAppTitle,
144
- props.applicationName
145
- ]);
146
- return null;
147
- }
148
-
149
38
  export {
150
- BusiverseLogo,
151
- applyBusiverseBrandHead,
152
- BusiverseBrandHead
39
+ BusiverseLogo
153
40
  };
@@ -0,0 +1,94 @@
1
+ import {
2
+ Button,
3
+ Card
4
+ } from "./chunk-GRZVAWCA.js";
5
+ import {
6
+ BusiverseLogo
7
+ } from "./chunk-32FPZZH2.js";
8
+ import {
9
+ cn
10
+ } from "./chunk-PYZVP4NI.js";
11
+
12
+ // src/components/marketing/HeroSection.tsx
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ function HeroSection({
15
+ title = "Turn Ideas Into Operating Businesses",
16
+ subtitle = "BUSIVERSE combines AI automation, blockchain-backed trust, and modular business services to help teams launch and operate ventures faster.",
17
+ primaryCta = /* @__PURE__ */ jsx(Button, { children: "Start Building" }),
18
+ secondaryCta = /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Explore the Platform" })
19
+ }) {
20
+ return /* @__PURE__ */ jsx("section", { className: "busiverse-hero", children: /* @__PURE__ */ jsxs("div", { className: "busiverse-hero-content", children: [
21
+ /* @__PURE__ */ jsx(BusiverseLogo, { variant: "full", tone: "white", className: "busiverse-hero-logo" }),
22
+ /* @__PURE__ */ jsx("h1", { children: title }),
23
+ /* @__PURE__ */ jsx("p", { children: subtitle }),
24
+ /* @__PURE__ */ jsxs("div", { className: "busiverse-hero-actions", children: [
25
+ primaryCta,
26
+ secondaryCta
27
+ ] })
28
+ ] }) });
29
+ }
30
+
31
+ // src/components/marketing/MarketingSectionHeader.tsx
32
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
33
+ function MarketingSectionHeader({ eyebrow, title, description, align = "center", className }) {
34
+ return /* @__PURE__ */ jsxs2("div", { className: cn("busiverse-marketing-section-header", align === "left" && "is-left", className), children: [
35
+ eyebrow && /* @__PURE__ */ jsx2("p", { className: "busiverse-marketing-eyebrow", children: eyebrow }),
36
+ /* @__PURE__ */ jsx2("h2", { children: title }),
37
+ description && /* @__PURE__ */ jsx2("p", { children: description })
38
+ ] });
39
+ }
40
+
41
+ // src/components/marketing/MarketingFeatureCard.tsx
42
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
43
+ function MarketingFeatureCard({ icon, label, title, description, points, className }) {
44
+ return /* @__PURE__ */ jsxs3(Card, { className: cn("busiverse-marketing-feature-card", className), children: [
45
+ /* @__PURE__ */ jsxs3("div", { className: "busiverse-marketing-feature-topline", children: [
46
+ icon && /* @__PURE__ */ jsx3("div", { className: "busiverse-marketing-feature-icon", children: icon }),
47
+ label && /* @__PURE__ */ jsx3("span", { children: label })
48
+ ] }),
49
+ /* @__PURE__ */ jsx3("h3", { children: title }),
50
+ /* @__PURE__ */ jsx3("p", { children: description }),
51
+ points && points.length > 0 && /* @__PURE__ */ jsx3("ul", { children: points.map((point, index) => /* @__PURE__ */ jsx3("li", { children: point }, index)) })
52
+ ] });
53
+ }
54
+
55
+ // src/components/marketing/MarketingPricingCard.tsx
56
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
57
+ function MarketingPricingCard({
58
+ name,
59
+ tagline,
60
+ price,
61
+ cadence,
62
+ description,
63
+ features,
64
+ ctaLabel = "Get started",
65
+ ctaHref,
66
+ featured = false,
67
+ note,
68
+ className
69
+ }) {
70
+ const actionClassName = cn(
71
+ "busiverse-focus-ring busiverse-btn busiverse-btn-md busiverse-marketing-pricing-button",
72
+ featured ? "busiverse-btn-primary" : "busiverse-btn-secondary"
73
+ );
74
+ return /* @__PURE__ */ jsxs4(Card, { className: cn("busiverse-marketing-pricing-card", featured && "is-featured", className), children: [
75
+ featured && /* @__PURE__ */ jsx4("div", { className: "busiverse-marketing-pricing-ribbon", children: "Recommended" }),
76
+ /* @__PURE__ */ jsx4("p", { className: "busiverse-marketing-pricing-tagline", children: tagline }),
77
+ /* @__PURE__ */ jsx4("h3", { children: name }),
78
+ /* @__PURE__ */ jsxs4("div", { className: "busiverse-marketing-pricing-price", children: [
79
+ /* @__PURE__ */ jsx4("strong", { children: price }),
80
+ cadence && /* @__PURE__ */ jsx4("span", { children: cadence })
81
+ ] }),
82
+ /* @__PURE__ */ jsx4("p", { className: "busiverse-marketing-pricing-description", children: description }),
83
+ /* @__PURE__ */ jsx4("ul", { children: features.map((feature) => /* @__PURE__ */ jsx4("li", { children: feature }, feature)) }),
84
+ ctaHref ? /* @__PURE__ */ jsx4("a", { className: actionClassName, href: ctaHref, children: /* @__PURE__ */ jsx4("span", { children: ctaLabel }) }) : /* @__PURE__ */ jsx4("button", { className: actionClassName, type: "button", children: /* @__PURE__ */ jsx4("span", { children: ctaLabel }) }),
85
+ note && /* @__PURE__ */ jsx4("p", { className: "busiverse-marketing-pricing-note", children: note })
86
+ ] });
87
+ }
88
+
89
+ export {
90
+ HeroSection,
91
+ MarketingSectionHeader,
92
+ MarketingFeatureCard,
93
+ MarketingPricingCard
94
+ };