@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 +16 -259
- package/dist/assets/assets.js +49 -0
- package/dist/{chunk-PTOKOI4Q.js → chunk-32FPZZH2.js} +1 -114
- package/dist/chunk-3XY5ZSTX.js +94 -0
- package/dist/{chunk-UU2CXC3N.js → chunk-ARMZUHU7.js} +73 -126
- package/dist/chunk-GRZVAWCA.js +63 -0
- package/dist/chunk-SZVGFEJG.js +115 -0
- package/dist/components/billing/index.js +2 -1
- package/dist/components/brand/index.js +4 -2
- package/dist/components/marketing/MarketingFeatureCard.d.ts +11 -0
- package/dist/components/marketing/MarketingFeatureCard.d.ts.map +1 -0
- package/dist/components/marketing/MarketingPricingCard.d.ts +16 -0
- package/dist/components/marketing/MarketingPricingCard.d.ts.map +1 -0
- package/dist/components/marketing/MarketingSectionHeader.d.ts +10 -0
- package/dist/components/marketing/MarketingSectionHeader.d.ts.map +1 -0
- package/dist/components/marketing/index.d.ts +3 -0
- package/dist/components/marketing/index.d.ts.map +1 -1
- package/dist/components/marketing/index.js +15 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -52
- package/dist/styles.css +87 -0
- package/package.json +21 -16
- package/dist/assets/index.d.ts +0 -2
- package/dist/assets/index.d.ts.map +0 -1
- package/dist/assets/index.js +0 -49
|
@@ -5,65 +5,18 @@ import {
|
|
|
5
5
|
getSupportedRegion,
|
|
6
6
|
useBusiverseI18n
|
|
7
7
|
} from "./chunk-WDOMYE77.js";
|
|
8
|
+
import {
|
|
9
|
+
Button,
|
|
10
|
+
Card
|
|
11
|
+
} from "./chunk-GRZVAWCA.js";
|
|
8
12
|
import {
|
|
9
13
|
cn
|
|
10
14
|
} from "./chunk-PYZVP4NI.js";
|
|
11
15
|
|
|
12
|
-
// src/components/primitives/Button.tsx
|
|
13
|
-
import * as React from "react";
|
|
14
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
-
var variants = {
|
|
16
|
-
primary: "busiverse-btn-primary",
|
|
17
|
-
secondary: "busiverse-btn-secondary",
|
|
18
|
-
ghost: "busiverse-btn-ghost",
|
|
19
|
-
danger: "busiverse-btn-danger",
|
|
20
|
-
success: "busiverse-btn-success",
|
|
21
|
-
link: "busiverse-btn-link"
|
|
22
|
-
};
|
|
23
|
-
var sizes = {
|
|
24
|
-
sm: "busiverse-btn-sm",
|
|
25
|
-
md: "busiverse-btn-md",
|
|
26
|
-
lg: "busiverse-btn-lg"
|
|
27
|
-
};
|
|
28
|
-
var Button = React.forwardRef(function Button2({ className, variant = "primary", size = "md", isLoading, children, disabled, ...props }, ref) {
|
|
29
|
-
return /* @__PURE__ */ jsxs(
|
|
30
|
-
"button",
|
|
31
|
-
{
|
|
32
|
-
ref,
|
|
33
|
-
className: cn("busiverse-focus-ring busiverse-btn", variants[variant], sizes[size], className),
|
|
34
|
-
disabled: disabled || isLoading,
|
|
35
|
-
"aria-busy": isLoading || void 0,
|
|
36
|
-
...props,
|
|
37
|
-
children: [
|
|
38
|
-
isLoading && /* @__PURE__ */ jsx("span", { className: "busiverse-spinner", "aria-hidden": "true" }),
|
|
39
|
-
/* @__PURE__ */ jsx("span", { children })
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// src/components/primitives/Card.tsx
|
|
46
|
-
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
47
|
-
function Card({ className, interactive, ...props }) {
|
|
48
|
-
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-card", interactive && "busiverse-card-interactive", className), ...props });
|
|
49
|
-
}
|
|
50
|
-
function CardHeader({ className, ...props }) {
|
|
51
|
-
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-card-header", className), ...props });
|
|
52
|
-
}
|
|
53
|
-
function CardTitle({ className, ...props }) {
|
|
54
|
-
return /* @__PURE__ */ jsx2("h3", { className: cn("busiverse-card-title", className), ...props });
|
|
55
|
-
}
|
|
56
|
-
function CardDescription({ className, ...props }) {
|
|
57
|
-
return /* @__PURE__ */ jsx2("p", { className: cn("busiverse-card-description", className), ...props });
|
|
58
|
-
}
|
|
59
|
-
function CardContent({ className, ...props }) {
|
|
60
|
-
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-card-content", className), ...props });
|
|
61
|
-
}
|
|
62
|
-
|
|
63
16
|
// src/components/primitives/Badge.tsx
|
|
64
|
-
import { jsx
|
|
17
|
+
import { jsx } from "react/jsx-runtime";
|
|
65
18
|
function Badge({ className, tone = "blue", ...props }) {
|
|
66
|
-
return /* @__PURE__ */
|
|
19
|
+
return /* @__PURE__ */ jsx("span", { className: cn("busiverse-badge", `busiverse-badge-${tone}`, className), ...props });
|
|
67
20
|
}
|
|
68
21
|
|
|
69
22
|
// src/registry/services.ts
|
|
@@ -105,7 +58,7 @@ function getBusiverseService(key) {
|
|
|
105
58
|
}
|
|
106
59
|
|
|
107
60
|
// src/components/data/DataTable.tsx
|
|
108
|
-
import { jsx as
|
|
61
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
109
62
|
function getCellValue(row, key) {
|
|
110
63
|
const value = row[String(key)];
|
|
111
64
|
if (value == null) return "\u2014";
|
|
@@ -113,35 +66,35 @@ function getCellValue(row, key) {
|
|
|
113
66
|
return JSON.stringify(value);
|
|
114
67
|
}
|
|
115
68
|
function DataTable({ rows, columns, getRowKey, isLoading, emptyState, className, dense }) {
|
|
116
|
-
if (isLoading) return /* @__PURE__ */
|
|
117
|
-
if (!rows.length) return /* @__PURE__ */
|
|
118
|
-
return /* @__PURE__ */
|
|
119
|
-
/* @__PURE__ */
|
|
120
|
-
/* @__PURE__ */
|
|
69
|
+
if (isLoading) return /* @__PURE__ */ jsx2("div", { className: "busiverse-table-state", children: "Loading records\u2026" });
|
|
70
|
+
if (!rows.length) return /* @__PURE__ */ jsx2("div", { className: "busiverse-table-state", children: emptyState ?? "No records found." });
|
|
71
|
+
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-table-wrap", className), children: /* @__PURE__ */ jsxs("table", { className: cn("busiverse-table", dense && "is-dense"), children: [
|
|
72
|
+
/* @__PURE__ */ jsx2("thead", { children: /* @__PURE__ */ jsx2("tr", { children: columns.map((column) => /* @__PURE__ */ jsx2("th", { style: { width: column.width, textAlign: column.align }, children: column.header }, String(column.key))) }) }),
|
|
73
|
+
/* @__PURE__ */ jsx2("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx2("tr", { children: columns.map((column) => /* @__PURE__ */ jsx2("td", { style: { textAlign: column.align }, children: column.render ? column.render(row, rowIndex) : getCellValue(row, column.key) }, String(column.key))) }, getRowKey?.(row, rowIndex) ?? rowIndex)) })
|
|
121
74
|
] }) });
|
|
122
75
|
}
|
|
123
76
|
|
|
124
77
|
// src/components/billing/CurrencyAmount.tsx
|
|
125
|
-
import { Fragment, jsx as
|
|
78
|
+
import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
|
|
126
79
|
function CurrencyAmount({ amount, currency = "NGN", locale = "en-NG", minimumFractionDigits, maximumFractionDigits }) {
|
|
127
80
|
const region = { locale, currencyCode: currency };
|
|
128
|
-
return /* @__PURE__ */
|
|
81
|
+
return /* @__PURE__ */ jsx3(Fragment, { children: formatCurrency(amount, region, { minimumFractionDigits, maximumFractionDigits }) });
|
|
129
82
|
}
|
|
130
83
|
|
|
131
84
|
// src/components/billing/UsageQuotaBar.tsx
|
|
132
|
-
import { jsx as
|
|
85
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
133
86
|
function UsageQuotaBar({ used, limit, label }) {
|
|
134
87
|
const percent = limit > 0 ? Math.min(100, Math.round(used / limit * 100)) : 0;
|
|
135
|
-
return /* @__PURE__ */
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
-
/* @__PURE__ */
|
|
88
|
+
return /* @__PURE__ */ jsxs2("div", { className: "busiverse-quota", children: [
|
|
89
|
+
/* @__PURE__ */ jsxs2("div", { className: "busiverse-quota-row", children: [
|
|
90
|
+
/* @__PURE__ */ jsx4("span", { children: label }),
|
|
91
|
+
/* @__PURE__ */ jsxs2("span", { children: [
|
|
139
92
|
used.toLocaleString(),
|
|
140
93
|
" / ",
|
|
141
94
|
limit.toLocaleString()
|
|
142
95
|
] })
|
|
143
96
|
] }),
|
|
144
|
-
/* @__PURE__ */
|
|
97
|
+
/* @__PURE__ */ jsx4("div", { className: "busiverse-quota-track", children: /* @__PURE__ */ jsx4("div", { className: "busiverse-quota-fill", style: { width: `${percent}%` } }) })
|
|
145
98
|
] });
|
|
146
99
|
}
|
|
147
100
|
|
|
@@ -7704,8 +7657,8 @@ function describeTimeEquivalents(row, region) {
|
|
|
7704
7657
|
}
|
|
7705
7658
|
|
|
7706
7659
|
// src/components/billing/ServicePricingExplorer.tsx
|
|
7707
|
-
import * as
|
|
7708
|
-
import { jsx as
|
|
7660
|
+
import * as React from "react";
|
|
7661
|
+
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
7709
7662
|
var categoryOrder = ["all", "core", "security", "finance", "business", "commerce", "operations", "intelligence", "blockchain", "developer"];
|
|
7710
7663
|
var categoryLabels = {
|
|
7711
7664
|
all: "All services",
|
|
@@ -7727,7 +7680,7 @@ function summarizeRange(min, max, region) {
|
|
|
7727
7680
|
return `${formatPricingValue(min, region)} \u2013 ${formatPricingValue(max, region)}`;
|
|
7728
7681
|
}
|
|
7729
7682
|
function useFilteredSummaries(rows) {
|
|
7730
|
-
return
|
|
7683
|
+
return React.useMemo(() => {
|
|
7731
7684
|
const serviceKeys = [...new Set(rows.map((row) => row.service))];
|
|
7732
7685
|
return getServicePricingSummaries(busiverseServices.filter((service) => serviceKeys.includes(service.key)));
|
|
7733
7686
|
}, [rows]);
|
|
@@ -7742,28 +7695,28 @@ function ServicePricingExplorer({
|
|
|
7742
7695
|
maxInitialRows = 48
|
|
7743
7696
|
}) {
|
|
7744
7697
|
const { region } = useBusiverseI18n();
|
|
7745
|
-
const [audience, setAudience] =
|
|
7746
|
-
const [category, setCategory] =
|
|
7747
|
-
const [query, setQuery] =
|
|
7748
|
-
const [showAllRows, setShowAllRows] =
|
|
7698
|
+
const [audience, setAudience] = React.useState(defaultAudience);
|
|
7699
|
+
const [category, setCategory] = React.useState("all");
|
|
7700
|
+
const [query, setQuery] = React.useState("");
|
|
7701
|
+
const [showAllRows, setShowAllRows] = React.useState(false);
|
|
7749
7702
|
const summaries = useFilteredSummaries(rows);
|
|
7750
|
-
const filteredSummaries =
|
|
7703
|
+
const filteredSummaries = React.useMemo(() => summaries.filter((summary) => {
|
|
7751
7704
|
const service = getBusiverseService(summary.service);
|
|
7752
7705
|
if (category !== "all" && service?.category !== category) return false;
|
|
7753
7706
|
if (!query.trim()) return true;
|
|
7754
7707
|
const haystack = `${summary.service} ${service?.name ?? ""} ${service?.description ?? ""}`.toLowerCase();
|
|
7755
7708
|
return haystack.includes(query.toLowerCase());
|
|
7756
7709
|
}), [category, query, summaries]);
|
|
7757
|
-
const filteredRows =
|
|
7710
|
+
const filteredRows = React.useMemo(() => {
|
|
7758
7711
|
const allowedServices = new Set(filteredSummaries.map((summary) => summary.service));
|
|
7759
7712
|
return rows.filter((row) => allowedServices.has(row.service));
|
|
7760
7713
|
}, [rows, filteredSummaries]);
|
|
7761
7714
|
const visibleRows = showAllRows ? filteredRows : filteredRows.slice(0, maxInitialRows);
|
|
7762
7715
|
const columns = [
|
|
7763
7716
|
{ key: "service", header: "Service", render: (row) => serviceLabel(row.service), width: "160px" },
|
|
7764
|
-
{ key: "displayName", header: "Operation", render: (row) => /* @__PURE__ */
|
|
7765
|
-
/* @__PURE__ */
|
|
7766
|
-
/* @__PURE__ */
|
|
7717
|
+
{ key: "displayName", header: "Operation", render: (row) => /* @__PURE__ */ jsxs3("span", { children: [
|
|
7718
|
+
/* @__PURE__ */ jsx5("strong", { children: row.displayName }),
|
|
7719
|
+
/* @__PURE__ */ jsx5("small", { className: "busiverse-pricing-code", children: row.operationCode })
|
|
7767
7720
|
] }) },
|
|
7768
7721
|
{ key: "cadence", header: "Unit", render: (row) => `${labelCadence(row.cadence)} \xB7 ${row.unit}` },
|
|
7769
7722
|
{ key: "standaloneUsd", header: audience === "external" ? "External price" : "Internal price", align: "right", render: (row) => formatPricingValue(getRowPriceUsd(row, audience), region) },
|
|
@@ -7771,17 +7724,17 @@ function ServicePricingExplorer({
|
|
|
7771
7724
|
{ key: "standaloneGrossMargin", header: "Margin", align: "right", render: (row) => formatMargin(getRowGrossMargin(row, audience), region.locale) },
|
|
7772
7725
|
{ key: "perMonthUsd", header: "Standard equivalents", render: (row) => describeTimeEquivalents(row, region) || "\u2014" }
|
|
7773
7726
|
];
|
|
7774
|
-
return /* @__PURE__ */
|
|
7775
|
-
/* @__PURE__ */
|
|
7776
|
-
/* @__PURE__ */
|
|
7777
|
-
/* @__PURE__ */
|
|
7778
|
-
/* @__PURE__ */
|
|
7779
|
-
/* @__PURE__ */
|
|
7727
|
+
return /* @__PURE__ */ jsxs3("section", { className: cn("busiverse-pricing-explorer", className), children: [
|
|
7728
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-header", children: [
|
|
7729
|
+
/* @__PURE__ */ jsxs3("div", { children: [
|
|
7730
|
+
/* @__PURE__ */ jsx5(Badge, { tone: "blue", children: "Account-rated catalog" }),
|
|
7731
|
+
/* @__PURE__ */ jsx5("h2", { children: title }),
|
|
7732
|
+
/* @__PURE__ */ jsx5("p", { children: description })
|
|
7780
7733
|
] }),
|
|
7781
|
-
showRegionSelector && /* @__PURE__ */
|
|
7734
|
+
showRegionSelector && /* @__PURE__ */ jsx5(RegionSelector, {})
|
|
7782
7735
|
] }),
|
|
7783
|
-
/* @__PURE__ */
|
|
7784
|
-
/* @__PURE__ */
|
|
7736
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-controls", role: "search", children: [
|
|
7737
|
+
/* @__PURE__ */ jsx5(
|
|
7785
7738
|
"input",
|
|
7786
7739
|
{
|
|
7787
7740
|
"aria-label": "Search services",
|
|
@@ -7791,26 +7744,26 @@ function ServicePricingExplorer({
|
|
|
7791
7744
|
onChange: (event) => setQuery(event.target.value)
|
|
7792
7745
|
}
|
|
7793
7746
|
),
|
|
7794
|
-
/* @__PURE__ */
|
|
7795
|
-
/* @__PURE__ */
|
|
7796
|
-
/* @__PURE__ */
|
|
7747
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-toggle", "aria-label": "Pricing audience", children: [
|
|
7748
|
+
/* @__PURE__ */ jsx5(Button, { size: "sm", variant: audience === "external" ? "primary" : "secondary", onClick: () => setAudience("external"), children: "External" }),
|
|
7749
|
+
/* @__PURE__ */ jsx5(Button, { size: "sm", variant: audience === "internal" ? "primary" : "secondary", onClick: () => setAudience("internal"), children: "Internal Busiverse" })
|
|
7797
7750
|
] })
|
|
7798
7751
|
] }),
|
|
7799
|
-
/* @__PURE__ */
|
|
7800
|
-
/* @__PURE__ */
|
|
7801
|
-
/* @__PURE__ */
|
|
7802
|
-
/* @__PURE__ */
|
|
7803
|
-
/* @__PURE__ */
|
|
7804
|
-
/* @__PURE__ */
|
|
7805
|
-
/* @__PURE__ */
|
|
7752
|
+
/* @__PURE__ */ jsx5("div", { className: "busiverse-pricing-tabs", "aria-label": "Service categories", children: categoryOrder.map((item) => /* @__PURE__ */ jsx5("button", { className: cn(item === category && "is-active"), onClick: () => setCategory(item), type: "button", children: categoryLabels[item] ?? item }, item)) }),
|
|
7753
|
+
/* @__PURE__ */ jsx5("div", { className: "busiverse-pricing-grid", children: filteredSummaries.map((summary) => /* @__PURE__ */ jsx5(ServicePricingCard, { summary, audience }, summary.service)) }),
|
|
7754
|
+
/* @__PURE__ */ jsxs3(Card, { className: "busiverse-pricing-table-card", children: [
|
|
7755
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-table-heading", children: [
|
|
7756
|
+
/* @__PURE__ */ jsxs3("div", { children: [
|
|
7757
|
+
/* @__PURE__ */ jsx5("h3", { children: "Operation-level tariff sheet" }),
|
|
7758
|
+
/* @__PURE__ */ jsx5("p", { children: "Rows include external price, internal chargeback, estimated direct cost, gross margin, and standardized time equivalents where applicable." })
|
|
7806
7759
|
] }),
|
|
7807
|
-
/* @__PURE__ */
|
|
7760
|
+
/* @__PURE__ */ jsxs3(Badge, { tone: "cyan", children: [
|
|
7808
7761
|
filteredRows.length,
|
|
7809
7762
|
" operations"
|
|
7810
7763
|
] })
|
|
7811
7764
|
] }),
|
|
7812
|
-
/* @__PURE__ */
|
|
7813
|
-
filteredRows.length > maxInitialRows && /* @__PURE__ */
|
|
7765
|
+
/* @__PURE__ */ jsx5(DataTable, { rows: visibleRows, columns, dense: true, getRowKey: (row) => row.operationCode, emptyState: "No pricing operations match the current filter." }),
|
|
7766
|
+
filteredRows.length > maxInitialRows && /* @__PURE__ */ jsx5("div", { className: "busiverse-pricing-table-more", children: /* @__PURE__ */ jsx5(Button, { variant: "secondary", onClick: () => setShowAllRows((value) => !value), children: showAllRows ? "Show fewer operations" : `Show all ${filteredRows.length} operations` }) })
|
|
7814
7767
|
] })
|
|
7815
7768
|
] });
|
|
7816
7769
|
}
|
|
@@ -7819,34 +7772,34 @@ function ServicePricingCard({ summary, audience }) {
|
|
|
7819
7772
|
const service = getBusiverseService(summary.service);
|
|
7820
7773
|
const minPrice = audience === "internal" ? summary.minBusiverseUsd : summary.minStandaloneUsd;
|
|
7821
7774
|
const maxPrice = audience === "internal" ? summary.maxBusiverseUsd : summary.maxStandaloneUsd;
|
|
7822
|
-
return /* @__PURE__ */
|
|
7823
|
-
/* @__PURE__ */
|
|
7824
|
-
/* @__PURE__ */
|
|
7825
|
-
service?.usesTimeSeries && /* @__PURE__ */
|
|
7775
|
+
return /* @__PURE__ */ jsxs3(Card, { className: "busiverse-pricing-card", interactive: true, children: [
|
|
7776
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-card-topline", children: [
|
|
7777
|
+
/* @__PURE__ */ jsx5(Badge, { tone: summary.hasPassThrough ? "warning" : "blue", children: summary.hasPassThrough ? "Pass-through aware" : "Fixed rated" }),
|
|
7778
|
+
service?.usesTimeSeries && /* @__PURE__ */ jsx5(Badge, { tone: "cyan", children: "Time-series" })
|
|
7826
7779
|
] }),
|
|
7827
|
-
/* @__PURE__ */
|
|
7828
|
-
/* @__PURE__ */
|
|
7829
|
-
/* @__PURE__ */
|
|
7830
|
-
/* @__PURE__ */
|
|
7831
|
-
/* @__PURE__ */
|
|
7780
|
+
/* @__PURE__ */ jsx5("h3", { children: service?.name ?? serviceLabel(summary.service) }),
|
|
7781
|
+
/* @__PURE__ */ jsx5("p", { children: service?.description ?? "BUSIVERSE service pricing." }),
|
|
7782
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-card-price", children: [
|
|
7783
|
+
/* @__PURE__ */ jsx5("span", { children: "Usage range" }),
|
|
7784
|
+
/* @__PURE__ */ jsx5("strong", { children: summarizeRange(minPrice, maxPrice, region) })
|
|
7832
7785
|
] }),
|
|
7833
|
-
summary.minMonthlyUsd != null && summary.maxMonthlyUsd != null && /* @__PURE__ */
|
|
7834
|
-
/* @__PURE__ */
|
|
7835
|
-
/* @__PURE__ */
|
|
7786
|
+
summary.minMonthlyUsd != null && summary.maxMonthlyUsd != null && /* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-card-metric", children: [
|
|
7787
|
+
/* @__PURE__ */ jsx5("span", { children: "Monthly equivalent" }),
|
|
7788
|
+
/* @__PURE__ */ jsx5("b", { children: summarizeRange(summary.minMonthlyUsd, summary.maxMonthlyUsd, region) })
|
|
7836
7789
|
] }),
|
|
7837
|
-
/* @__PURE__ */
|
|
7838
|
-
/* @__PURE__ */
|
|
7839
|
-
/* @__PURE__ */
|
|
7790
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-card-metric", children: [
|
|
7791
|
+
/* @__PURE__ */ jsx5("span", { children: "Direct cost range" }),
|
|
7792
|
+
/* @__PURE__ */ jsx5("b", { children: summarizeRange(summary.minDirectCostUsd, summary.maxDirectCostUsd, region) })
|
|
7840
7793
|
] }),
|
|
7841
|
-
/* @__PURE__ */
|
|
7842
|
-
/* @__PURE__ */
|
|
7843
|
-
/* @__PURE__ */
|
|
7794
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-card-metric", children: [
|
|
7795
|
+
/* @__PURE__ */ jsx5("span", { children: "Gross margin" }),
|
|
7796
|
+
/* @__PURE__ */ jsxs3("b", { children: [
|
|
7844
7797
|
formatMargin(summary.minGrossMargin, region.locale),
|
|
7845
7798
|
" \u2013 ",
|
|
7846
7799
|
formatMargin(summary.maxGrossMargin, region.locale)
|
|
7847
7800
|
] })
|
|
7848
7801
|
] }),
|
|
7849
|
-
/* @__PURE__ */
|
|
7802
|
+
/* @__PURE__ */ jsxs3("div", { className: "busiverse-pricing-card-footer", children: [
|
|
7850
7803
|
summary.operationCount,
|
|
7851
7804
|
" rated operations \xB7 ",
|
|
7852
7805
|
summary.cadences.length,
|
|
@@ -7856,12 +7809,6 @@ function ServicePricingCard({ summary, audience }) {
|
|
|
7856
7809
|
}
|
|
7857
7810
|
|
|
7858
7811
|
export {
|
|
7859
|
-
Button,
|
|
7860
|
-
Card,
|
|
7861
|
-
CardHeader,
|
|
7862
|
-
CardTitle,
|
|
7863
|
-
CardDescription,
|
|
7864
|
-
CardContent,
|
|
7865
7812
|
Badge,
|
|
7866
7813
|
busiverseServices,
|
|
7867
7814
|
getBusiverseService,
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "./chunk-PYZVP4NI.js";
|
|
4
|
+
|
|
5
|
+
// src/components/primitives/Button.tsx
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var variants = {
|
|
9
|
+
primary: "busiverse-btn-primary",
|
|
10
|
+
secondary: "busiverse-btn-secondary",
|
|
11
|
+
ghost: "busiverse-btn-ghost",
|
|
12
|
+
danger: "busiverse-btn-danger",
|
|
13
|
+
success: "busiverse-btn-success",
|
|
14
|
+
link: "busiverse-btn-link"
|
|
15
|
+
};
|
|
16
|
+
var sizes = {
|
|
17
|
+
sm: "busiverse-btn-sm",
|
|
18
|
+
md: "busiverse-btn-md",
|
|
19
|
+
lg: "busiverse-btn-lg"
|
|
20
|
+
};
|
|
21
|
+
var Button = React.forwardRef(function Button2({ className, variant = "primary", size = "md", isLoading, children, disabled, ...props }, ref) {
|
|
22
|
+
return /* @__PURE__ */ jsxs(
|
|
23
|
+
"button",
|
|
24
|
+
{
|
|
25
|
+
ref,
|
|
26
|
+
className: cn("busiverse-focus-ring busiverse-btn", variants[variant], sizes[size], className),
|
|
27
|
+
disabled: disabled || isLoading,
|
|
28
|
+
"aria-busy": isLoading || void 0,
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
isLoading && /* @__PURE__ */ jsx("span", { className: "busiverse-spinner", "aria-hidden": "true" }),
|
|
32
|
+
/* @__PURE__ */ jsx("span", { children })
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// src/components/primitives/Card.tsx
|
|
39
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
40
|
+
function Card({ className, interactive, ...props }) {
|
|
41
|
+
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-card", interactive && "busiverse-card-interactive", className), ...props });
|
|
42
|
+
}
|
|
43
|
+
function CardHeader({ className, ...props }) {
|
|
44
|
+
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-card-header", className), ...props });
|
|
45
|
+
}
|
|
46
|
+
function CardTitle({ className, ...props }) {
|
|
47
|
+
return /* @__PURE__ */ jsx2("h3", { className: cn("busiverse-card-title", className), ...props });
|
|
48
|
+
}
|
|
49
|
+
function CardDescription({ className, ...props }) {
|
|
50
|
+
return /* @__PURE__ */ jsx2("p", { className: cn("busiverse-card-description", className), ...props });
|
|
51
|
+
}
|
|
52
|
+
function CardContent({ className, ...props }) {
|
|
53
|
+
return /* @__PURE__ */ jsx2("div", { className: cn("busiverse-card-content", className), ...props });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export {
|
|
57
|
+
Button,
|
|
58
|
+
Card,
|
|
59
|
+
CardHeader,
|
|
60
|
+
CardTitle,
|
|
61
|
+
CardDescription,
|
|
62
|
+
CardContent
|
|
63
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// src/components/brand/BusiverseBrandHead.tsx
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
var faviconIco = new URL("../../assets/favicon.io/favicon.ico", import.meta.url).href;
|
|
4
|
+
var favicon16 = new URL("../../assets/favicon.io/favicon-16x16.png", import.meta.url).href;
|
|
5
|
+
var favicon32 = new URL("../../assets/favicon.io/favicon-32x32.png", import.meta.url).href;
|
|
6
|
+
var favicon96 = new URL("../../assets/favicon.io/favicon-96x96.png", import.meta.url).href;
|
|
7
|
+
var appleTouchIcon = new URL("../../assets/favicon.io/apple-touch-icon.png", import.meta.url).href;
|
|
8
|
+
var androidChrome192 = new URL("../../assets/favicon.io/android-chrome-192x192.png", import.meta.url).href;
|
|
9
|
+
var androidChrome512 = new URL("../../assets/favicon.io/android-chrome-512x512.png", import.meta.url).href;
|
|
10
|
+
var androidIcon192 = new URL("../../assets/favicon.io/android-icon-192x192.png", import.meta.url).href;
|
|
11
|
+
var msTile144 = new URL("../../assets/favicon.io/ms-icon-144x144.png", import.meta.url).href;
|
|
12
|
+
var defaultSocialImage = new URL("../../assets/social/busiverse-twitter_x-header-2.7777777777777777x-darkbg.png", import.meta.url).href;
|
|
13
|
+
var DEFAULT_TITLE = "BUSIVERSE \u2014 Turn Ideas Into Operating Businesses";
|
|
14
|
+
var DEFAULT_DESCRIPTION = "BUSIVERSE combines AI automation, blockchain-backed trust, and modular business services to help teams launch and operate ventures faster.";
|
|
15
|
+
var DEFAULT_THEME_COLOR = "#020617";
|
|
16
|
+
function ensureMeta(selector, attributes) {
|
|
17
|
+
let node = document.head.querySelector(selector);
|
|
18
|
+
if (!node) {
|
|
19
|
+
node = document.createElement("meta");
|
|
20
|
+
document.head.appendChild(node);
|
|
21
|
+
}
|
|
22
|
+
Object.entries(attributes).forEach(([key, value]) => node?.setAttribute(key, value));
|
|
23
|
+
return node;
|
|
24
|
+
}
|
|
25
|
+
function ensureLink(selector, attributes) {
|
|
26
|
+
let node = document.head.querySelector(selector);
|
|
27
|
+
if (!node) {
|
|
28
|
+
node = document.createElement("link");
|
|
29
|
+
node.setAttribute("data-busiverse-ui-head", "true");
|
|
30
|
+
document.head.appendChild(node);
|
|
31
|
+
}
|
|
32
|
+
Object.entries(attributes).forEach(([key, value]) => node?.setAttribute(key, value));
|
|
33
|
+
return node;
|
|
34
|
+
}
|
|
35
|
+
function createManifestDataUrl(title, description, themeColor) {
|
|
36
|
+
const manifest = {
|
|
37
|
+
name: title,
|
|
38
|
+
short_name: "BUSIVERSE",
|
|
39
|
+
description,
|
|
40
|
+
start_url: "/",
|
|
41
|
+
scope: "/",
|
|
42
|
+
display: "standalone",
|
|
43
|
+
background_color: themeColor,
|
|
44
|
+
theme_color: themeColor,
|
|
45
|
+
icons: [
|
|
46
|
+
{ src: androidChrome192, sizes: "192x192", type: "image/png" },
|
|
47
|
+
{ src: androidChrome512, sizes: "512x512", type: "image/png" }
|
|
48
|
+
]
|
|
49
|
+
};
|
|
50
|
+
return `data:application/manifest+json,${encodeURIComponent(JSON.stringify(manifest))}`;
|
|
51
|
+
}
|
|
52
|
+
function applyBusiverseBrandHead({
|
|
53
|
+
title = DEFAULT_TITLE,
|
|
54
|
+
description = DEFAULT_DESCRIPTION,
|
|
55
|
+
siteName = "Busiverse",
|
|
56
|
+
url,
|
|
57
|
+
image = defaultSocialImage,
|
|
58
|
+
twitterSite = "@busiverse1",
|
|
59
|
+
keywords = "Busiverse, AI automation, blockchain-backed trust, modular business services, distributed business infrastructure",
|
|
60
|
+
locale = "en_NG",
|
|
61
|
+
themeColor = DEFAULT_THEME_COLOR,
|
|
62
|
+
appleMobileWebAppTitle = "BUSIVERSE",
|
|
63
|
+
applicationName = "BUSIVERSE"
|
|
64
|
+
} = {}) {
|
|
65
|
+
document.title = title;
|
|
66
|
+
ensureMeta('meta[name="description"]', { name: "description", content: description });
|
|
67
|
+
ensureMeta('meta[name="keywords"]', { name: "keywords", content: keywords });
|
|
68
|
+
ensureMeta('meta[name="theme-color"]', { name: "theme-color", content: themeColor });
|
|
69
|
+
ensureMeta('meta[name="application-name"]', { name: "application-name", content: applicationName });
|
|
70
|
+
ensureMeta('meta[name="apple-mobile-web-app-title"]', { name: "apple-mobile-web-app-title", content: appleMobileWebAppTitle });
|
|
71
|
+
ensureMeta('meta[name="msapplication-TileColor"]', { name: "msapplication-TileColor", content: themeColor });
|
|
72
|
+
ensureMeta('meta[name="msapplication-TileImage"]', { name: "msapplication-TileImage", content: msTile144 });
|
|
73
|
+
ensureLink('link[data-busiverse-ui-head="icon-ico"]', { rel: "icon", type: "image/x-icon", href: faviconIco, "data-busiverse-ui-head": "icon-ico" });
|
|
74
|
+
ensureLink('link[data-busiverse-ui-head="icon-16"]', { rel: "icon", type: "image/png", sizes: "16x16", href: favicon16, "data-busiverse-ui-head": "icon-16" });
|
|
75
|
+
ensureLink('link[data-busiverse-ui-head="icon-32"]', { rel: "icon", type: "image/png", sizes: "32x32", href: favicon32, "data-busiverse-ui-head": "icon-32" });
|
|
76
|
+
ensureLink('link[data-busiverse-ui-head="icon-96"]', { rel: "icon", type: "image/png", sizes: "96x96", href: favicon96, "data-busiverse-ui-head": "icon-96" });
|
|
77
|
+
ensureLink('link[data-busiverse-ui-head="icon-192"]', { rel: "icon", type: "image/png", sizes: "192x192", href: androidIcon192, "data-busiverse-ui-head": "icon-192" });
|
|
78
|
+
ensureLink('link[data-busiverse-ui-head="apple-touch-icon"]', { rel: "apple-touch-icon", sizes: "180x180", href: appleTouchIcon, "data-busiverse-ui-head": "apple-touch-icon" });
|
|
79
|
+
ensureLink('link[data-busiverse-ui-head="manifest"]', { rel: "manifest", href: createManifestDataUrl(title, description, themeColor), "data-busiverse-ui-head": "manifest" });
|
|
80
|
+
ensureMeta('meta[property="og:title"]', { property: "og:title", content: title });
|
|
81
|
+
ensureMeta('meta[property="og:description"]', { property: "og:description", content: description });
|
|
82
|
+
ensureMeta('meta[property="og:type"]', { property: "og:type", content: "website" });
|
|
83
|
+
ensureMeta('meta[property="og:site_name"]', { property: "og:site_name", content: siteName });
|
|
84
|
+
ensureMeta('meta[property="og:locale"]', { property: "og:locale", content: locale });
|
|
85
|
+
ensureMeta('meta[property="og:image"]', { property: "og:image", content: image });
|
|
86
|
+
if (url) ensureMeta('meta[property="og:url"]', { property: "og:url", content: url });
|
|
87
|
+
ensureMeta('meta[name="twitter:card"]', { name: "twitter:card", content: "summary_large_image" });
|
|
88
|
+
ensureMeta('meta[name="twitter:title"]', { name: "twitter:title", content: title });
|
|
89
|
+
ensureMeta('meta[name="twitter:description"]', { name: "twitter:description", content: description });
|
|
90
|
+
ensureMeta('meta[name="twitter:site"]', { name: "twitter:site", content: twitterSite });
|
|
91
|
+
ensureMeta('meta[name="twitter:image"]', { name: "twitter:image", content: image });
|
|
92
|
+
}
|
|
93
|
+
function BusiverseBrandHead(props) {
|
|
94
|
+
React.useEffect(() => {
|
|
95
|
+
applyBusiverseBrandHead(props);
|
|
96
|
+
}, [
|
|
97
|
+
props.title,
|
|
98
|
+
props.description,
|
|
99
|
+
props.siteName,
|
|
100
|
+
props.url,
|
|
101
|
+
props.image,
|
|
102
|
+
props.twitterSite,
|
|
103
|
+
props.keywords,
|
|
104
|
+
props.locale,
|
|
105
|
+
props.themeColor,
|
|
106
|
+
props.appleMobileWebAppTitle,
|
|
107
|
+
props.applicationName
|
|
108
|
+
]);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
applyBusiverseBrandHead,
|
|
114
|
+
BusiverseBrandHead
|
|
115
|
+
};
|
|
@@ -2,8 +2,9 @@ import {
|
|
|
2
2
|
CurrencyAmount,
|
|
3
3
|
ServicePricingExplorer,
|
|
4
4
|
UsageQuotaBar
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-ARMZUHU7.js";
|
|
6
6
|
import "../../chunk-WDOMYE77.js";
|
|
7
|
+
import "../../chunk-GRZVAWCA.js";
|
|
7
8
|
import "../../chunk-PYZVP4NI.js";
|
|
8
9
|
export {
|
|
9
10
|
CurrencyAmount,
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BusiverseBrandHead,
|
|
3
|
-
BusiverseLogo,
|
|
4
3
|
applyBusiverseBrandHead
|
|
5
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-SZVGFEJG.js";
|
|
5
|
+
import {
|
|
6
|
+
BusiverseLogo
|
|
7
|
+
} from "../../chunk-32FPZZH2.js";
|
|
6
8
|
import "../../chunk-PYZVP4NI.js";
|
|
7
9
|
export {
|
|
8
10
|
BusiverseBrandHead,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface MarketingFeatureCardProps {
|
|
3
|
+
icon?: React.ReactNode;
|
|
4
|
+
label?: React.ReactNode;
|
|
5
|
+
title: React.ReactNode;
|
|
6
|
+
description: React.ReactNode;
|
|
7
|
+
points?: React.ReactNode[];
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function MarketingFeatureCard({ icon, label, title, description, points, className }: MarketingFeatureCardProps): React.JSX.Element;
|
|
11
|
+
//# sourceMappingURL=MarketingFeatureCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarketingFeatureCard.d.ts","sourceRoot":"","sources":["../../../src/components/marketing/MarketingFeatureCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,yBAAyB,qBAgBrH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface MarketingPricingCardProps {
|
|
3
|
+
name: string;
|
|
4
|
+
tagline: string;
|
|
5
|
+
price: string;
|
|
6
|
+
cadence?: string;
|
|
7
|
+
description: string;
|
|
8
|
+
features: string[];
|
|
9
|
+
ctaLabel?: string;
|
|
10
|
+
ctaHref?: string;
|
|
11
|
+
featured?: boolean;
|
|
12
|
+
note?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function MarketingPricingCard({ name, tagline, price, cadence, description, features, ctaLabel, ctaHref, featured, note, className, }: MarketingPricingCardProps): React.JSX.Element;
|
|
16
|
+
//# sourceMappingURL=MarketingPricingCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarketingPricingCard.d.ts","sourceRoot":"","sources":["../../../src/components/marketing/MarketingPricingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,WAAW,EACX,QAAQ,EACR,QAAwB,EACxB,OAAO,EACP,QAAgB,EAChB,IAAI,EACJ,SAAS,GACV,EAAE,yBAAyB,qBA2B3B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface MarketingSectionHeaderProps {
|
|
3
|
+
eyebrow?: React.ReactNode;
|
|
4
|
+
title: React.ReactNode;
|
|
5
|
+
description?: React.ReactNode;
|
|
6
|
+
align?: "left" | "center";
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function MarketingSectionHeader({ eyebrow, title, description, align, className }: MarketingSectionHeaderProps): React.JSX.Element;
|
|
10
|
+
//# sourceMappingURL=MarketingSectionHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarketingSectionHeader.d.ts","sourceRoot":"","sources":["../../../src/components/marketing/MarketingSectionHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAgB,EAAE,SAAS,EAAE,EAAE,2BAA2B,qBAQ/H"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/marketing/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/marketing/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HeroSection,
|
|
3
|
+
MarketingFeatureCard,
|
|
4
|
+
MarketingPricingCard,
|
|
5
|
+
MarketingSectionHeader
|
|
6
|
+
} from "../../chunk-3XY5ZSTX.js";
|
|
7
|
+
import "../../chunk-GRZVAWCA.js";
|
|
8
|
+
import "../../chunk-32FPZZH2.js";
|
|
9
|
+
import "../../chunk-PYZVP4NI.js";
|
|
10
|
+
export {
|
|
11
|
+
HeroSection,
|
|
12
|
+
MarketingFeatureCard,
|
|
13
|
+
MarketingPricingCard,
|
|
14
|
+
MarketingSectionHeader
|
|
15
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export * from "./tokens";
|
|
2
1
|
export * from "./components";
|
|
3
|
-
export * from "./registry/services";
|
|
4
|
-
export * from "./pricing";
|
|
5
2
|
export * from "./api";
|
|
6
3
|
export * from "./auth";
|
|
7
4
|
export * from "./i18n";
|
|
5
|
+
export * from "./pricing";
|
|
6
|
+
export * from "./registry/services";
|
|
7
|
+
export * from "./tokens";
|
|
8
8
|
export * from "./utils/cn";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|