@busiverse/ui 0.1.0

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