@burdenoff/microfe-kadaikodi 2026.704.4 → 2026.704.5

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 (126) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +18 -10
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/CartManagementPage.js +558 -718
  65. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +142 -55
  68. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  69. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +129 -164
  70. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +379 -361
  72. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +266 -166
  74. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  76. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  77. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +288 -161
  78. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  80. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  82. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +17 -34
  84. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  85. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  86. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  87. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  88. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  90. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +270 -230
  92. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/customer/FavoritesPage.js +149 -412
  94. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  95. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  96. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  97. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +176 -175
  98. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  99. package/dist/kadaikodi/pages/customer/ReviewsPage.js +295 -438
  100. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  101. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  102. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  103. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  104. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  105. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  106. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  107. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  108. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  109. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  110. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  111. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  112. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  113. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  114. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  115. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  116. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +424 -448
  117. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  119. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  120. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  121. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  122. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +300 -296
  123. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  124. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +284 -309
  125. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  126. package/package.json +1 -1
@@ -2,17 +2,20 @@ import { useKadaikodi as e } from "../../context/KadaikodiContext.js";
2
2
  import { PageLayout as t } from "../../components/PageLayout.js";
3
3
  import { EmptyState as n } from "../../components/EmptyState.js";
4
4
  import { useCreateInvestmentOpportunity as r, useProviders as i } from "../../hooks/useKadaikodiApi.js";
5
- import { useMemo as a, useState as o } from "react";
6
- import { CheckCircle2 as s, IndianRupee as c, TrendingUp as l } from "lucide-react";
7
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
+ import { formatCurrency as a } from "../../utils/formatters.js";
6
+ import { ProgressRing as o } from "../../components/viz/ProgressRing.js";
7
+ import "../../components/viz/index.js";
8
+ import { useMemo as s, useState as c } from "react";
9
+ import { CalendarClock as l, CheckCircle2 as u, IndianRupee as d, TrendingUp as f } from "lucide-react";
10
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
8
11
  //#region src/kadaikodi/pages/cart-owner/InvestmentListingPage.tsx
9
- var f = [
12
+ var h = [
10
13
  "LOW",
11
14
  "MEDIUM",
12
15
  "HIGH"
13
16
  ];
14
- function p() {
15
- let { navigateTo: p, currentUser: m } = e(), { data: h = [], isLoading: g } = i(), _ = a(() => h.find((e) => e.ownerId === m?.id) ?? h[0], [h, m?.id]), v = r(), [y, b] = o({
17
+ function g() {
18
+ let { navigateTo: g, currentUser: _ } = e(), { data: v = [], isLoading: y } = i(), b = s(() => v.find((e) => e.ownerId === _?.id) ?? v[0], [v, _?.id]), x = r(), [S, C] = c({
16
19
  title: "",
17
20
  description: "",
18
21
  targetAmount: "",
@@ -20,206 +23,303 @@ function p() {
20
23
  expectedReturnsPct: "",
21
24
  lockInMonths: "",
22
25
  riskLevel: "MEDIUM"
23
- }), [x, S] = o(""), [C, w] = o(null), T = (e, t) => b((n) => ({
26
+ }), [w, T] = c(""), [E, D] = c(null), O = (e, t) => C((n) => ({
24
27
  ...n,
25
28
  [e]: t
26
- })), E = "w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong";
27
- return g ? /* @__PURE__ */ u(t, {
29
+ })), k = "w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong";
30
+ return y ? /* @__PURE__ */ p(t, {
28
31
  title: "List for Investment",
29
32
  description: "Raise growth capital from the marketplace",
30
- children: /* @__PURE__ */ d("div", {
33
+ children: /* @__PURE__ */ m("div", {
31
34
  className: "animate-pulse space-y-4",
32
35
  children: [
33
- /* @__PURE__ */ u("div", { className: "h-10 rounded-lg bg-bg-sunken" }),
34
- /* @__PURE__ */ u("div", { className: "h-10 rounded-lg bg-bg-sunken" }),
35
- /* @__PURE__ */ u("div", { className: "h-10 rounded-lg bg-bg-sunken" })
36
+ /* @__PURE__ */ p("div", { className: "h-10 rounded-lg bg-bg-sunken" }),
37
+ /* @__PURE__ */ p("div", { className: "h-10 rounded-lg bg-bg-sunken" }),
38
+ /* @__PURE__ */ p("div", { className: "h-10 rounded-lg bg-bg-sunken" })
36
39
  ]
37
40
  })
38
- }) : _ ? /* @__PURE__ */ u(t, {
41
+ }) : b ? /* @__PURE__ */ p(t, {
39
42
  title: "List for Investment",
40
- description: `Raise growth capital for ${_.name}`,
41
- children: /* @__PURE__ */ d("div", {
42
- className: "mx-auto max-w-2xl space-y-6",
43
- children: [C && /* @__PURE__ */ d("div", {
43
+ description: `Raise growth capital for ${b.name}`,
44
+ children: /* @__PURE__ */ m("div", {
45
+ className: "mx-auto max-w-5xl space-y-6",
46
+ children: [E && /* @__PURE__ */ m("div", {
44
47
  className: "flex items-center gap-2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4",
45
48
  children: [
46
- /* @__PURE__ */ u(s, { className: "h-5 w-5 text-status-success-text" }),
47
- /* @__PURE__ */ d("div", {
49
+ /* @__PURE__ */ p(u, { className: "h-5 w-5 text-status-success-text" }),
50
+ /* @__PURE__ */ m("div", {
48
51
  className: "flex-1",
49
- children: [/* @__PURE__ */ u("p", {
52
+ children: [/* @__PURE__ */ p("p", {
50
53
  className: "text-sm font-medium text-text-primary",
51
54
  children: "Opportunity published"
52
- }), /* @__PURE__ */ d("p", {
55
+ }), /* @__PURE__ */ m("p", {
53
56
  className: "text-xs text-text-secondary",
54
57
  children: [
55
58
  "“",
56
- C.title,
59
+ E.title,
57
60
  "” is now live in the Investor section for backers to fund."
58
61
  ]
59
62
  })]
60
63
  }),
61
- /* @__PURE__ */ u("button", {
64
+ /* @__PURE__ */ p("button", {
62
65
  type: "button",
63
- onClick: () => p("/investor/opportunities"),
66
+ onClick: () => g("/investor/opportunities"),
64
67
  className: "rounded-lg border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-secondary hover:bg-bg-sunken",
65
68
  children: "View in Investor"
66
69
  })
67
70
  ]
68
- }), /* @__PURE__ */ d("div", {
69
- className: "rounded-2xl border border-border-subtle bg-bg-surface p-6",
70
- children: [/* @__PURE__ */ d("div", {
71
- className: "mb-4 flex items-center gap-2",
72
- children: [/* @__PURE__ */ u(c, { className: "h-5 w-5 text-accent-primary" }), /* @__PURE__ */ u("h3", {
73
- className: "text-base font-semibold text-text-primary",
74
- children: "Opportunity details"
71
+ }), /* @__PURE__ */ m("div", {
72
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-[1fr_20rem]",
73
+ children: [/* @__PURE__ */ m("div", {
74
+ className: "rounded-2xl border border-border-subtle bg-bg-surface p-6",
75
+ children: [/* @__PURE__ */ m("div", {
76
+ className: "mb-4 flex items-center gap-2",
77
+ children: [/* @__PURE__ */ p(d, { className: "h-5 w-5 text-accent-primary" }), /* @__PURE__ */ p("h3", {
78
+ className: "text-base font-semibold text-text-primary",
79
+ children: "Opportunity details"
80
+ })]
81
+ }), /* @__PURE__ */ m("div", {
82
+ className: "space-y-4",
83
+ children: [
84
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
85
+ className: "mb-1 block text-sm font-medium text-text-secondary",
86
+ children: "Title"
87
+ }), /* @__PURE__ */ p("input", {
88
+ className: k,
89
+ value: S.title,
90
+ onChange: (e) => O("title", e.target.value),
91
+ placeholder: "Expand to 3 locations"
92
+ })] }),
93
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
94
+ className: "mb-1 block text-sm font-medium text-text-secondary",
95
+ children: "Description"
96
+ }), /* @__PURE__ */ p("textarea", {
97
+ className: k,
98
+ rows: 3,
99
+ value: S.description,
100
+ onChange: (e) => O("description", e.target.value),
101
+ placeholder: "How the capital will be used and why backers should fund it."
102
+ })] }),
103
+ /* @__PURE__ */ m("div", {
104
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
105
+ children: [
106
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
107
+ className: "mb-1 block text-sm font-medium text-text-secondary",
108
+ children: "Target amount (₹)"
109
+ }), /* @__PURE__ */ p("input", {
110
+ type: "number",
111
+ min: "0",
112
+ className: k,
113
+ value: S.targetAmount,
114
+ onChange: (e) => O("targetAmount", e.target.value),
115
+ placeholder: "500000"
116
+ })] }),
117
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
118
+ className: "mb-1 block text-sm font-medium text-text-secondary",
119
+ children: "Minimum investment (₹)"
120
+ }), /* @__PURE__ */ p("input", {
121
+ type: "number",
122
+ min: "0",
123
+ className: k,
124
+ value: S.minimumInvestment,
125
+ onChange: (e) => O("minimumInvestment", e.target.value),
126
+ placeholder: "5000"
127
+ })] }),
128
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
129
+ className: "mb-1 block text-sm font-medium text-text-secondary",
130
+ children: "Expected returns (% p.a.)"
131
+ }), /* @__PURE__ */ p("input", {
132
+ type: "number",
133
+ min: "0",
134
+ className: k,
135
+ value: S.expectedReturnsPct,
136
+ onChange: (e) => O("expectedReturnsPct", e.target.value),
137
+ placeholder: "18"
138
+ })] }),
139
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
140
+ className: "mb-1 block text-sm font-medium text-text-secondary",
141
+ children: "Lock-in (months)"
142
+ }), /* @__PURE__ */ p("input", {
143
+ type: "number",
144
+ min: "0",
145
+ className: k,
146
+ value: S.lockInMonths,
147
+ onChange: (e) => O("lockInMonths", e.target.value),
148
+ placeholder: "12"
149
+ })] })
150
+ ]
151
+ }),
152
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("label", {
153
+ className: "mb-1 block text-sm font-medium text-text-secondary",
154
+ children: "Risk level"
155
+ }), /* @__PURE__ */ p("div", {
156
+ className: "flex gap-2",
157
+ children: h.map((e) => /* @__PURE__ */ p("button", {
158
+ type: "button",
159
+ onClick: () => O("riskLevel", e),
160
+ className: "rounded-lg border px-4 py-2 text-sm font-medium transition " + (S.riskLevel === e ? "border-accent-primary bg-accent-primary/10 text-accent-primary" : "border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken"),
161
+ children: e.charAt(0) + e.slice(1).toLowerCase()
162
+ }, e))
163
+ })] }),
164
+ w && /* @__PURE__ */ p("p", {
165
+ className: "text-sm text-status-error-text",
166
+ children: w
167
+ }),
168
+ /* @__PURE__ */ m("div", {
169
+ className: "flex items-center justify-end gap-3 pt-2",
170
+ children: [/* @__PURE__ */ p("button", {
171
+ type: "button",
172
+ onClick: () => g("/cart-owner/dashboard"),
173
+ className: "rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken",
174
+ children: "Cancel"
175
+ }), /* @__PURE__ */ m("button", {
176
+ type: "button",
177
+ onClick: () => {
178
+ if (T(""), !b) return;
179
+ let e = Number(S.targetAmount), t = Number(S.minimumInvestment), n = Number(S.expectedReturnsPct), r = Number(S.lockInMonths);
180
+ if (!S.title.trim()) return T("Give your opportunity a title.");
181
+ if (!(e > 0)) return T("Enter a valid target amount.");
182
+ if (!(t > 0) || t > e) return T("Minimum investment must be positive and ≤ target.");
183
+ if (!(n >= 0)) return T("Enter a valid expected return %.");
184
+ if (!(r > 0)) return T("Enter a lock-in period in months.");
185
+ x.mutate({
186
+ providerId: b.id,
187
+ title: S.title.trim(),
188
+ description: S.description.trim() || void 0,
189
+ targetAmount: e,
190
+ minimumInvestment: t,
191
+ expectedReturnsPct: n,
192
+ lockInMonths: r,
193
+ riskLevel: S.riskLevel
194
+ }, {
195
+ onSuccess: (e) => {
196
+ D({ title: e.title }), C((e) => ({
197
+ ...e,
198
+ title: "",
199
+ description: "",
200
+ targetAmount: "",
201
+ minimumInvestment: "",
202
+ expectedReturnsPct: "",
203
+ lockInMonths: ""
204
+ }));
205
+ },
206
+ onError: (e) => T(e instanceof Error ? e.message : "Could not publish the opportunity.")
207
+ });
208
+ },
209
+ disabled: x.isPending,
210
+ className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60",
211
+ children: [/* @__PURE__ */ p(f, { className: "h-4 w-4" }), x.isPending ? "Publishing…" : "Publish opportunity"]
212
+ })]
213
+ })
214
+ ]
75
215
  })]
76
- }), /* @__PURE__ */ d("div", {
77
- className: "space-y-4",
216
+ }), /* @__PURE__ */ m("aside", {
217
+ className: "h-fit rounded-2xl border border-border-subtle bg-bg-surface p-6 lg:sticky lg:top-6",
78
218
  children: [
79
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
80
- className: "mb-1 block text-sm font-medium text-text-secondary",
81
- children: "Title"
82
- }), /* @__PURE__ */ u("input", {
83
- className: E,
84
- value: y.title,
85
- onChange: (e) => T("title", e.target.value),
86
- placeholder: "Expand to 3 locations"
87
- })] }),
88
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
89
- className: "mb-1 block text-sm font-medium text-text-secondary",
90
- children: "Description"
91
- }), /* @__PURE__ */ u("textarea", {
92
- className: E,
93
- rows: 3,
94
- value: y.description,
95
- onChange: (e) => T("description", e.target.value),
96
- placeholder: "How the capital will be used and why backers should fund it."
97
- })] }),
98
- /* @__PURE__ */ d("div", {
99
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
100
- children: [
101
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
102
- className: "mb-1 block text-sm font-medium text-text-secondary",
103
- children: "Target amount (₹)"
104
- }), /* @__PURE__ */ u("input", {
105
- type: "number",
106
- min: "0",
107
- className: E,
108
- value: y.targetAmount,
109
- onChange: (e) => T("targetAmount", e.target.value),
110
- placeholder: "500000"
111
- })] }),
112
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
113
- className: "mb-1 block text-sm font-medium text-text-secondary",
114
- children: "Minimum investment (₹)"
115
- }), /* @__PURE__ */ u("input", {
116
- type: "number",
117
- min: "0",
118
- className: E,
119
- value: y.minimumInvestment,
120
- onChange: (e) => T("minimumInvestment", e.target.value),
121
- placeholder: "5000"
122
- })] }),
123
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
124
- className: "mb-1 block text-sm font-medium text-text-secondary",
125
- children: "Expected returns (% p.a.)"
126
- }), /* @__PURE__ */ u("input", {
127
- type: "number",
128
- min: "0",
129
- className: E,
130
- value: y.expectedReturnsPct,
131
- onChange: (e) => T("expectedReturnsPct", e.target.value),
132
- placeholder: "18"
133
- })] }),
134
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
135
- className: "mb-1 block text-sm font-medium text-text-secondary",
136
- children: "Lock-in (months)"
137
- }), /* @__PURE__ */ u("input", {
138
- type: "number",
139
- min: "0",
140
- className: E,
141
- value: y.lockInMonths,
142
- onChange: (e) => T("lockInMonths", e.target.value),
143
- placeholder: "12"
144
- })] })
145
- ]
219
+ /* @__PURE__ */ p("h3", {
220
+ className: "text-sm font-semibold text-text-primary",
221
+ children: S.title.trim() || "Your opportunity"
146
222
  }),
147
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
148
- className: "mb-1 block text-sm font-medium text-text-secondary",
149
- children: "Risk level"
150
- }), /* @__PURE__ */ u("div", {
151
- className: "flex gap-2",
152
- children: f.map((e) => /* @__PURE__ */ u("button", {
153
- type: "button",
154
- onClick: () => T("riskLevel", e),
155
- className: "rounded-lg border px-4 py-2 text-sm font-medium transition " + (y.riskLevel === e ? "border-accent-primary bg-accent-primary/10 text-accent-primary" : "border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken"),
156
- children: e.charAt(0) + e.slice(1).toLowerCase()
157
- }, e))
158
- })] }),
159
- x && /* @__PURE__ */ u("p", {
160
- className: "text-sm text-status-error-text",
161
- children: x
223
+ /* @__PURE__ */ p("p", {
224
+ className: "mt-1 line-clamp-2 text-xs text-text-secondary",
225
+ children: S.description.trim() || `Raise growth capital for ${b.name}.`
226
+ }),
227
+ /* @__PURE__ */ m("div", {
228
+ className: "mt-5 flex flex-col items-center",
229
+ children: [/* @__PURE__ */ p(o, {
230
+ value: 0,
231
+ max: Math.max(Number(S.targetAmount) || 0, 1),
232
+ label: "0%",
233
+ caption: "funded",
234
+ size: 120
235
+ }), /* @__PURE__ */ m("p", {
236
+ className: "mt-3 text-center text-sm text-text-secondary",
237
+ children: [
238
+ /* @__PURE__ */ p("span", {
239
+ className: "font-semibold text-text-primary",
240
+ children: "₹0"
241
+ }),
242
+ " of",
243
+ " ",
244
+ /* @__PURE__ */ p("span", {
245
+ className: "font-semibold text-text-primary",
246
+ children: Number(S.targetAmount) > 0 ? a(Number(S.targetAmount), { minimumFractionDigits: 0 }) : "—"
247
+ }),
248
+ " ",
249
+ "raised"
250
+ ]
251
+ })]
252
+ }),
253
+ /* @__PURE__ */ m("div", {
254
+ className: "mt-5 grid grid-cols-2 gap-3",
255
+ children: [/* @__PURE__ */ m("div", {
256
+ className: "rounded-lg border border-border-subtle bg-bg-canvas p-3",
257
+ children: [
258
+ /* @__PURE__ */ m("div", {
259
+ className: "flex items-center gap-1.5 text-xs text-text-secondary",
260
+ children: [/* @__PURE__ */ p(f, { className: "h-3.5 w-3.5" }), "Returns"]
261
+ }),
262
+ /* @__PURE__ */ p("p", {
263
+ className: "mt-1 text-lg font-semibold text-text-primary",
264
+ children: S.expectedReturnsPct ? `${Number(S.expectedReturnsPct)}%` : "—"
265
+ }),
266
+ /* @__PURE__ */ p("p", {
267
+ className: "text-[11px] text-text-muted",
268
+ children: "expected p.a."
269
+ })
270
+ ]
271
+ }), /* @__PURE__ */ m("div", {
272
+ className: "rounded-lg border border-border-subtle bg-bg-canvas p-3",
273
+ children: [
274
+ /* @__PURE__ */ m("div", {
275
+ className: "flex items-center gap-1.5 text-xs text-text-secondary",
276
+ children: [/* @__PURE__ */ p(l, { className: "h-3.5 w-3.5" }), "Lock-in"]
277
+ }),
278
+ /* @__PURE__ */ p("p", {
279
+ className: "mt-1 text-lg font-semibold text-text-primary",
280
+ children: S.lockInMonths ? Number(S.lockInMonths) : "—"
281
+ }),
282
+ /* @__PURE__ */ p("p", {
283
+ className: "text-[11px] text-text-muted",
284
+ children: "months"
285
+ })
286
+ ]
287
+ })]
288
+ }),
289
+ /* @__PURE__ */ m("div", {
290
+ className: "mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3",
291
+ children: [/* @__PURE__ */ p("span", {
292
+ className: "text-xs text-text-secondary",
293
+ children: "Min. investment"
294
+ }), /* @__PURE__ */ p("span", {
295
+ className: "text-sm font-semibold text-text-primary",
296
+ children: Number(S.minimumInvestment) > 0 ? a(Number(S.minimumInvestment), { minimumFractionDigits: 0 }) : "—"
297
+ })]
162
298
  }),
163
- /* @__PURE__ */ d("div", {
164
- className: "flex items-center justify-end gap-3 pt-2",
165
- children: [/* @__PURE__ */ u("button", {
166
- type: "button",
167
- onClick: () => p("/cart-owner/dashboard"),
168
- className: "rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken",
169
- children: "Cancel"
170
- }), /* @__PURE__ */ d("button", {
171
- type: "button",
172
- onClick: () => {
173
- if (S(""), !_) return;
174
- let e = Number(y.targetAmount), t = Number(y.minimumInvestment), n = Number(y.expectedReturnsPct), r = Number(y.lockInMonths);
175
- if (!y.title.trim()) return S("Give your opportunity a title.");
176
- if (!(e > 0)) return S("Enter a valid target amount.");
177
- if (!(t > 0) || t > e) return S("Minimum investment must be positive and ≤ target.");
178
- if (!(n >= 0)) return S("Enter a valid expected return %.");
179
- if (!(r > 0)) return S("Enter a lock-in period in months.");
180
- v.mutate({
181
- providerId: _.id,
182
- title: y.title.trim(),
183
- description: y.description.trim() || void 0,
184
- targetAmount: e,
185
- minimumInvestment: t,
186
- expectedReturnsPct: n,
187
- lockInMonths: r,
188
- riskLevel: y.riskLevel
189
- }, {
190
- onSuccess: (e) => {
191
- w({ title: e.title }), b((e) => ({
192
- ...e,
193
- title: "",
194
- description: "",
195
- targetAmount: "",
196
- minimumInvestment: "",
197
- expectedReturnsPct: "",
198
- lockInMonths: ""
199
- }));
200
- },
201
- onError: (e) => S(e instanceof Error ? e.message : "Could not publish the opportunity.")
202
- });
203
- },
204
- disabled: v.isPending,
205
- className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60",
206
- children: [/* @__PURE__ */ u(l, { className: "h-4 w-4" }), v.isPending ? "Publishing…" : "Publish opportunity"]
299
+ /* @__PURE__ */ m("div", {
300
+ className: "mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3",
301
+ children: [/* @__PURE__ */ p("span", {
302
+ className: "text-xs text-text-secondary",
303
+ children: "Risk level"
304
+ }), /* @__PURE__ */ p("span", {
305
+ className: "text-sm font-semibold text-text-primary",
306
+ children: S.riskLevel.charAt(0) + S.riskLevel.slice(1).toLowerCase()
207
307
  })]
208
308
  })
209
309
  ]
210
310
  })]
211
311
  })]
212
312
  })
213
- }) : /* @__PURE__ */ u(t, {
313
+ }) : /* @__PURE__ */ p(t, {
214
314
  title: "List for Investment",
215
315
  description: "Raise growth capital from the marketplace",
216
- children: /* @__PURE__ */ u(n, {
217
- icon: /* @__PURE__ */ u(l, { className: "h-8 w-8" }),
316
+ children: /* @__PURE__ */ p(n, {
317
+ icon: /* @__PURE__ */ p(f, { className: "h-8 w-8" }),
218
318
  title: "Set up your cart first",
219
319
  description: "Create and configure your service provider before listing it for investment.",
220
- action: /* @__PURE__ */ u("button", {
320
+ action: /* @__PURE__ */ p("button", {
221
321
  type: "button",
222
- onClick: () => p("/cart-owner/dashboard"),
322
+ onClick: () => g("/cart-owner/dashboard"),
223
323
  className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover",
224
324
  children: "Go to Dashboard"
225
325
  })
@@ -227,6 +327,6 @@ function p() {
227
327
  });
228
328
  }
229
329
  //#endregion
230
- export { p as InvestmentListingPage };
330
+ export { g as InvestmentListingPage };
231
331
 
232
332
  //# sourceMappingURL=InvestmentListingPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentListingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/InvestmentListingPage.tsx"],"sourcesContent":["/**\n * InvestmentListingPage — cart-owner lists their business for investment.\n *\n * Publishes a real KadaikodiInvestmentOpportunity (target, minimum, expected\n * returns, lock-in, risk) that then appears in the Investor section. Wired to\n * the live kadaikodiCreateInvestmentOpportunity mutation.\n */\nimport { useMemo, useState } from 'react';\nimport { TrendingUp, CheckCircle2, IndianRupee } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useCreateInvestmentOpportunity } from '../../hooks/useKadaikodiApi';\n\nconst RISKS = ['LOW', 'MEDIUM', 'HIGH'] as const;\n\nexport function InvestmentListingPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: providers = [], isLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const createOpportunity = useCreateInvestmentOpportunity();\n\n const [form, setForm] = useState({\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n riskLevel: 'MEDIUM' as (typeof RISKS)[number],\n });\n const [error, setError] = useState('');\n const [created, setCreated] = useState<{ title: string } | null>(null);\n\n const set = (k: keyof typeof form, v: string) => setForm((f) => ({ ...f, [k]: v }));\n\n const inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong';\n\n const submit = () => {\n setError('');\n if (!myProvider) return;\n const target = Number(form.targetAmount);\n const minimum = Number(form.minimumInvestment);\n const returns = Number(form.expectedReturnsPct);\n const lock = Number(form.lockInMonths);\n if (!form.title.trim()) return setError('Give your opportunity a title.');\n if (!(target > 0)) return setError('Enter a valid target amount.');\n if (!(minimum > 0) || minimum > target) return setError('Minimum investment must be positive and ≤ target.');\n if (!(returns >= 0)) return setError('Enter a valid expected return %.');\n if (!(lock > 0)) return setError('Enter a lock-in period in months.');\n createOpportunity.mutate(\n {\n providerId: myProvider.id,\n title: form.title.trim(),\n description: form.description.trim() || undefined,\n targetAmount: target,\n minimumInvestment: minimum,\n expectedReturnsPct: returns,\n lockInMonths: lock,\n riskLevel: form.riskLevel,\n },\n {\n onSuccess: (opp) => {\n setCreated({ title: opp.title });\n setForm((f) => ({ ...f, title: '', description: '', targetAmount: '', minimumInvestment: '', expectedReturnsPct: '', lockInMonths: '' }));\n },\n onError: (e) => setError(e instanceof Error ? e.message : 'Could not publish the opportunity.'),\n }\n );\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"List for Investment\" description=\"Raise growth capital from the marketplace\">\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!myProvider) {\n return (\n <PageLayout title=\"List for Investment\" description=\"Raise growth capital from the marketplace\">\n <EmptyState\n icon={<TrendingUp className=\"h-8 w-8\" />}\n title=\"Set up your cart first\"\n description=\"Create and configure your service provider before listing it for investment.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"List for Investment\" description={`Raise growth capital for ${myProvider.name}`}>\n <div className=\"mx-auto max-w-2xl space-y-6\">\n {created && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">Opportunity published</p>\n <p className=\"text-xs text-text-secondary\">\n “{created.title}” is now live in the Investor section for backers to fund.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n View in Investor\n </button>\n </div>\n )}\n\n <div className=\"rounded-2xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <IndianRupee className=\"h-5 w-5 text-accent-primary\" />\n <h3 className=\"text-base font-semibold text-text-primary\">Opportunity details</h3>\n </div>\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Title</label>\n <input className={inputCls} value={form.title} onChange={(e) => set('title', e.target.value)} placeholder=\"Expand to 3 locations\" />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Description</label>\n <textarea className={inputCls} rows={3} value={form.description} onChange={(e) => set('description', e.target.value)} placeholder=\"How the capital will be used and why backers should fund it.\" />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Target amount (₹)</label>\n <input type=\"number\" min=\"0\" className={inputCls} value={form.targetAmount} onChange={(e) => set('targetAmount', e.target.value)} placeholder=\"500000\" />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Minimum investment (₹)</label>\n <input type=\"number\" min=\"0\" className={inputCls} value={form.minimumInvestment} onChange={(e) => set('minimumInvestment', e.target.value)} placeholder=\"5000\" />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Expected returns (% p.a.)</label>\n <input type=\"number\" min=\"0\" className={inputCls} value={form.expectedReturnsPct} onChange={(e) => set('expectedReturnsPct', e.target.value)} placeholder=\"18\" />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Lock-in (months)</label>\n <input type=\"number\" min=\"0\" className={inputCls} value={form.lockInMonths} onChange={(e) => set('lockInMonths', e.target.value)} placeholder=\"12\" />\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Risk level</label>\n <div className=\"flex gap-2\">\n {RISKS.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => set('riskLevel', r)}\n className={\n 'rounded-lg border px-4 py-2 text-sm font-medium transition ' +\n (form.riskLevel === r\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {r.charAt(0) + r.slice(1).toLowerCase()}\n </button>\n ))}\n </div>\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"flex items-center justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submit}\n disabled={createOpportunity.isPending}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60\"\n >\n <TrendingUp className=\"h-4 w-4\" />\n {createOpportunity.isPending ? 'Publishing…' : 'Publish opportunity'}\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InvestmentListingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/InvestmentListingPage.tsx"],"sourcesContent":["/**\n * InvestmentListingPage — cart-owner lists their business for investment.\n *\n * Publishes a real KadaikodiInvestmentOpportunity (target, minimum, expected\n * returns, lock-in, risk) that then appears in the Investor section. Wired to\n * the live kadaikodiCreateInvestmentOpportunity mutation.\n */\nimport { useMemo, useState } from 'react';\nimport { TrendingUp, CheckCircle2, IndianRupee, CalendarClock } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { ProgressRing } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useCreateInvestmentOpportunity } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\n\nconst RISKS = ['LOW', 'MEDIUM', 'HIGH'] as const;\n\nexport function InvestmentListingPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: providers = [], isLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const createOpportunity = useCreateInvestmentOpportunity();\n\n const [form, setForm] = useState({\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n riskLevel: 'MEDIUM' as (typeof RISKS)[number],\n });\n const [error, setError] = useState('');\n const [created, setCreated] = useState<{ title: string } | null>(null);\n\n const set = (k: keyof typeof form, v: string) => setForm((f) => ({ ...f, [k]: v }));\n\n const inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong';\n\n const submit = () => {\n setError('');\n if (!myProvider) return;\n const target = Number(form.targetAmount);\n const minimum = Number(form.minimumInvestment);\n const returns = Number(form.expectedReturnsPct);\n const lock = Number(form.lockInMonths);\n if (!form.title.trim()) return setError('Give your opportunity a title.');\n if (!(target > 0)) return setError('Enter a valid target amount.');\n if (!(minimum > 0) || minimum > target)\n return setError('Minimum investment must be positive and ≤ target.');\n if (!(returns >= 0)) return setError('Enter a valid expected return %.');\n if (!(lock > 0)) return setError('Enter a lock-in period in months.');\n createOpportunity.mutate(\n {\n providerId: myProvider.id,\n title: form.title.trim(),\n description: form.description.trim() || undefined,\n targetAmount: target,\n minimumInvestment: minimum,\n expectedReturnsPct: returns,\n lockInMonths: lock,\n riskLevel: form.riskLevel,\n },\n {\n onSuccess: (opp) => {\n setCreated({ title: opp.title });\n setForm((f) => ({\n ...f,\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n }));\n },\n onError: (e) =>\n setError(e instanceof Error ? e.message : 'Could not publish the opportunity.'),\n }\n );\n };\n\n if (isLoading) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!myProvider) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <EmptyState\n icon={<TrendingUp className=\"h-8 w-8\" />}\n title=\"Set up your cart first\"\n description=\"Create and configure your service provider before listing it for investment.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"List for Investment\"\n description={`Raise growth capital for ${myProvider.name}`}\n >\n <div className=\"mx-auto max-w-5xl space-y-6\">\n {created && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">Opportunity published</p>\n <p className=\"text-xs text-text-secondary\">\n “{created.title}” is now live in the Investor section for backers to fund.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n View in Investor\n </button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[1fr_20rem]\">\n <div className=\"rounded-2xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <IndianRupee className=\"h-5 w-5 text-accent-primary\" />\n <h3 className=\"text-base font-semibold text-text-primary\">Opportunity details</h3>\n </div>\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Title</label>\n <input\n className={inputCls}\n value={form.title}\n onChange={(e) => set('title', e.target.value)}\n placeholder=\"Expand to 3 locations\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Description\n </label>\n <textarea\n className={inputCls}\n rows={3}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"How the capital will be used and why backers should fund it.\"\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Target amount (₹)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.targetAmount}\n onChange={(e) => set('targetAmount', e.target.value)}\n placeholder=\"500000\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Minimum investment (₹)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.minimumInvestment}\n onChange={(e) => set('minimumInvestment', e.target.value)}\n placeholder=\"5000\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Expected returns (% p.a.)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.expectedReturnsPct}\n onChange={(e) => set('expectedReturnsPct', e.target.value)}\n placeholder=\"18\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Lock-in (months)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.lockInMonths}\n onChange={(e) => set('lockInMonths', e.target.value)}\n placeholder=\"12\"\n />\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Risk level\n </label>\n <div className=\"flex gap-2\">\n {RISKS.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => set('riskLevel', r)}\n className={\n 'rounded-lg border px-4 py-2 text-sm font-medium transition ' +\n (form.riskLevel === r\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {r.charAt(0) + r.slice(1).toLowerCase()}\n </button>\n ))}\n </div>\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"flex items-center justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submit}\n disabled={createOpportunity.isPending}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60\"\n >\n <TrendingUp className=\"h-4 w-4\" />\n {createOpportunity.isPending ? 'Publishing…' : 'Publish opportunity'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Live funding preview — mirrors exactly what backers will see */}\n <aside className=\"h-fit rounded-2xl border border-border-subtle bg-bg-surface p-6 lg:sticky lg:top-6\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {form.title.trim() || 'Your opportunity'}\n </h3>\n <p className=\"mt-1 line-clamp-2 text-xs text-text-secondary\">\n {form.description.trim() || `Raise growth capital for ${myProvider.name}.`}\n </p>\n\n <div className=\"mt-5 flex flex-col items-center\">\n <ProgressRing\n value={0}\n max={Math.max(Number(form.targetAmount) || 0, 1)}\n label=\"0%\"\n caption=\"funded\"\n size={120}\n />\n <p className=\"mt-3 text-center text-sm text-text-secondary\">\n <span className=\"font-semibold text-text-primary\">₹0</span> of{' '}\n <span className=\"font-semibold text-text-primary\">\n {Number(form.targetAmount) > 0\n ? formatCurrency(Number(form.targetAmount), { minimumFractionDigits: 0 })\n : '—'}\n </span>{' '}\n raised\n </p>\n </div>\n\n <div className=\"mt-5 grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <TrendingUp className=\"h-3.5 w-3.5\" />\n Returns\n </div>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">\n {form.expectedReturnsPct ? `${Number(form.expectedReturnsPct)}%` : '—'}\n </p>\n <p className=\"text-[11px] text-text-muted\">expected p.a.</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <CalendarClock className=\"h-3.5 w-3.5\" />\n Lock-in\n </div>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">\n {form.lockInMonths ? Number(form.lockInMonths) : '—'}\n </p>\n <p className=\"text-[11px] text-text-muted\">months</p>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <span className=\"text-xs text-text-secondary\">Min. investment</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {Number(form.minimumInvestment) > 0\n ? formatCurrency(Number(form.minimumInvestment), { minimumFractionDigits: 0 })\n : '—'}\n </span>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <span className=\"text-xs text-text-secondary\">Risk level</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {form.riskLevel.charAt(0) + form.riskLevel.slice(1).toLowerCase()}\n </span>\n </div>\n </aside>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}