@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.
@@ -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 as jsx3 } from "react/jsx-runtime";
17
+ import { jsx } from "react/jsx-runtime";
65
18
  function Badge({ className, tone = "blue", ...props }) {
66
- return /* @__PURE__ */ jsx3("span", { className: cn("busiverse-badge", `busiverse-badge-${tone}`, className), ...props });
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 jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
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__ */ jsx4("div", { className: "busiverse-table-state", children: "Loading records\u2026" });
117
- if (!rows.length) return /* @__PURE__ */ jsx4("div", { className: "busiverse-table-state", children: emptyState ?? "No records found." });
118
- return /* @__PURE__ */ jsx4("div", { className: cn("busiverse-table-wrap", className), children: /* @__PURE__ */ jsxs2("table", { className: cn("busiverse-table", dense && "is-dense"), children: [
119
- /* @__PURE__ */ jsx4("thead", { children: /* @__PURE__ */ jsx4("tr", { children: columns.map((column) => /* @__PURE__ */ jsx4("th", { style: { width: column.width, textAlign: column.align }, children: column.header }, String(column.key))) }) }),
120
- /* @__PURE__ */ jsx4("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx4("tr", { children: columns.map((column) => /* @__PURE__ */ jsx4("td", { style: { textAlign: column.align }, children: column.render ? column.render(row, rowIndex) : getCellValue(row, column.key) }, String(column.key))) }, getRowKey?.(row, rowIndex) ?? rowIndex)) })
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 jsx5 } from "react/jsx-runtime";
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__ */ jsx5(Fragment, { children: formatCurrency(amount, region, { minimumFractionDigits, maximumFractionDigits }) });
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 jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
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__ */ jsxs3("div", { className: "busiverse-quota", children: [
136
- /* @__PURE__ */ jsxs3("div", { className: "busiverse-quota-row", children: [
137
- /* @__PURE__ */ jsx6("span", { children: label }),
138
- /* @__PURE__ */ jsxs3("span", { children: [
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__ */ jsx6("div", { className: "busiverse-quota-track", children: /* @__PURE__ */ jsx6("div", { className: "busiverse-quota-fill", style: { width: `${percent}%` } }) })
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 React2 from "react";
7708
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
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 React2.useMemo(() => {
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] = React2.useState(defaultAudience);
7746
- const [category, setCategory] = React2.useState("all");
7747
- const [query, setQuery] = React2.useState("");
7748
- const [showAllRows, setShowAllRows] = React2.useState(false);
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 = React2.useMemo(() => summaries.filter((summary) => {
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 = React2.useMemo(() => {
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__ */ jsxs4("span", { children: [
7765
- /* @__PURE__ */ jsx7("strong", { children: row.displayName }),
7766
- /* @__PURE__ */ jsx7("small", { className: "busiverse-pricing-code", children: row.operationCode })
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__ */ jsxs4("section", { className: cn("busiverse-pricing-explorer", className), children: [
7775
- /* @__PURE__ */ jsxs4("div", { className: "busiverse-pricing-header", children: [
7776
- /* @__PURE__ */ jsxs4("div", { children: [
7777
- /* @__PURE__ */ jsx7(Badge, { tone: "blue", children: "Account-rated catalog" }),
7778
- /* @__PURE__ */ jsx7("h2", { children: title }),
7779
- /* @__PURE__ */ jsx7("p", { children: description })
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__ */ jsx7(RegionSelector, {})
7734
+ showRegionSelector && /* @__PURE__ */ jsx5(RegionSelector, {})
7782
7735
  ] }),
7783
- /* @__PURE__ */ jsxs4("div", { className: "busiverse-pricing-controls", role: "search", children: [
7784
- /* @__PURE__ */ jsx7(
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__ */ jsxs4("div", { className: "busiverse-pricing-toggle", "aria-label": "Pricing audience", children: [
7795
- /* @__PURE__ */ jsx7(Button, { size: "sm", variant: audience === "external" ? "primary" : "secondary", onClick: () => setAudience("external"), children: "External" }),
7796
- /* @__PURE__ */ jsx7(Button, { size: "sm", variant: audience === "internal" ? "primary" : "secondary", onClick: () => setAudience("internal"), children: "Internal Busiverse" })
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__ */ jsx7("div", { className: "busiverse-pricing-tabs", "aria-label": "Service categories", children: categoryOrder.map((item) => /* @__PURE__ */ jsx7("button", { className: cn(item === category && "is-active"), onClick: () => setCategory(item), type: "button", children: categoryLabels[item] ?? item }, item)) }),
7800
- /* @__PURE__ */ jsx7("div", { className: "busiverse-pricing-grid", children: filteredSummaries.map((summary) => /* @__PURE__ */ jsx7(ServicePricingCard, { summary, audience }, summary.service)) }),
7801
- /* @__PURE__ */ jsxs4(Card, { className: "busiverse-pricing-table-card", children: [
7802
- /* @__PURE__ */ jsxs4("div", { className: "busiverse-pricing-table-heading", children: [
7803
- /* @__PURE__ */ jsxs4("div", { children: [
7804
- /* @__PURE__ */ jsx7("h3", { children: "Operation-level tariff sheet" }),
7805
- /* @__PURE__ */ jsx7("p", { children: "Rows include external price, internal chargeback, estimated direct cost, gross margin, and standardized time equivalents where applicable." })
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__ */ jsxs4(Badge, { tone: "cyan", children: [
7760
+ /* @__PURE__ */ jsxs3(Badge, { tone: "cyan", children: [
7808
7761
  filteredRows.length,
7809
7762
  " operations"
7810
7763
  ] })
7811
7764
  ] }),
7812
- /* @__PURE__ */ jsx7(DataTable, { rows: visibleRows, columns, dense: true, getRowKey: (row) => row.operationCode, emptyState: "No pricing operations match the current filter." }),
7813
- filteredRows.length > maxInitialRows && /* @__PURE__ */ jsx7("div", { className: "busiverse-pricing-table-more", children: /* @__PURE__ */ jsx7(Button, { variant: "secondary", onClick: () => setShowAllRows((value) => !value), children: showAllRows ? "Show fewer operations" : `Show all ${filteredRows.length} operations` }) })
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__ */ jsxs4(Card, { className: "busiverse-pricing-card", interactive: true, children: [
7823
- /* @__PURE__ */ jsxs4("div", { className: "busiverse-pricing-card-topline", children: [
7824
- /* @__PURE__ */ jsx7(Badge, { tone: summary.hasPassThrough ? "warning" : "blue", children: summary.hasPassThrough ? "Pass-through aware" : "Fixed rated" }),
7825
- service?.usesTimeSeries && /* @__PURE__ */ jsx7(Badge, { tone: "cyan", children: "Time-series" })
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__ */ jsx7("h3", { children: service?.name ?? serviceLabel(summary.service) }),
7828
- /* @__PURE__ */ jsx7("p", { children: service?.description ?? "BUSIVERSE service pricing." }),
7829
- /* @__PURE__ */ jsxs4("div", { className: "busiverse-pricing-card-price", children: [
7830
- /* @__PURE__ */ jsx7("span", { children: "Usage range" }),
7831
- /* @__PURE__ */ jsx7("strong", { children: summarizeRange(minPrice, maxPrice, region) })
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__ */ jsxs4("div", { className: "busiverse-pricing-card-metric", children: [
7834
- /* @__PURE__ */ jsx7("span", { children: "Monthly equivalent" }),
7835
- /* @__PURE__ */ jsx7("b", { children: summarizeRange(summary.minMonthlyUsd, summary.maxMonthlyUsd, region) })
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__ */ jsxs4("div", { className: "busiverse-pricing-card-metric", children: [
7838
- /* @__PURE__ */ jsx7("span", { children: "Direct cost range" }),
7839
- /* @__PURE__ */ jsx7("b", { children: summarizeRange(summary.minDirectCostUsd, summary.maxDirectCostUsd, region) })
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__ */ jsxs4("div", { className: "busiverse-pricing-card-metric", children: [
7842
- /* @__PURE__ */ jsx7("span", { children: "Gross margin" }),
7843
- /* @__PURE__ */ jsxs4("b", { children: [
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__ */ jsxs4("div", { className: "busiverse-pricing-card-footer", children: [
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-UU2CXC3N.js";
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-PTOKOI4Q.js";
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,2 +1,5 @@
1
1
  export * from "./HeroSection";
2
+ export * from "./MarketingSectionHeader";
3
+ export * from "./MarketingFeatureCard";
4
+ export * from "./MarketingPricingCard";
2
5
  //# sourceMappingURL=index.d.ts.map
@@ -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