@burdenoff/microfe-store 2026.805.1 → 2026.819.1

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 (67) hide show
  1. package/dist/StoreAdminRoutes.js +27 -27
  2. package/dist/StoreRoot.js +78 -45
  3. package/dist/StoreRoot.js.map +1 -1
  4. package/dist/StoreRoutes.js +163 -85
  5. package/dist/StoreRoutes.js.map +1 -1
  6. package/dist/components/sourcing/SourcingConfirmationDialog.d.ts +15 -0
  7. package/dist/components/sourcing/SourcingConfirmationDialog.js +61 -0
  8. package/dist/components/sourcing/SourcingConfirmationDialog.js.map +1 -0
  9. package/dist/components/sourcing/SourcingUi.d.ts +51 -0
  10. package/dist/components/sourcing/SourcingUi.js +176 -0
  11. package/dist/components/sourcing/SourcingUi.js.map +1 -0
  12. package/dist/generated/global-operations.d.ts +713 -0
  13. package/dist/generated/global-operations.js +557 -175
  14. package/dist/generated/global-operations.js.map +1 -1
  15. package/dist/generated/global-types.d.ts +2152 -2159
  16. package/dist/generated/global-types.js +8 -2
  17. package/dist/generated/global-types.js.map +1 -1
  18. package/dist/hooks/useBackendCart.js +17 -17
  19. package/dist/hooks/useInstallations.js +32 -32
  20. package/dist/hooks/useOrders.js +7 -7
  21. package/dist/hooks/useSourcing.d.ts +319 -0
  22. package/dist/hooks/useSourcing.js +87 -0
  23. package/dist/hooks/useSourcing.js.map +1 -0
  24. package/dist/hooks/useStoreGraphQL.js +163 -163
  25. package/dist/index.js +12 -12
  26. package/dist/pages/AdminDashboardPage.js +132 -132
  27. package/dist/pages/AdminReviewModerationPage.js +55 -55
  28. package/dist/pages/AdminStoresPage.js +95 -95
  29. package/dist/pages/AdminSubmissionsQueuePage.js +297 -297
  30. package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -1
  31. package/dist/pages/AppDetailPage.js +65 -65
  32. package/dist/pages/AppSettingsPage.js +32 -32
  33. package/dist/pages/CartPage.js +66 -66
  34. package/dist/pages/CreateSourcingRequestPage.d.ts +3 -0
  35. package/dist/pages/CreateSourcingRequestPage.js +439 -0
  36. package/dist/pages/CreateSourcingRequestPage.js.map +1 -0
  37. package/dist/pages/InstalledAppsPage.js +15 -15
  38. package/dist/pages/InstalledAppsPage.js.map +1 -1
  39. package/dist/pages/MarketplaceHomePage.js +384 -384
  40. package/dist/pages/MarketplaceHomePage.js.map +1 -1
  41. package/dist/pages/MyLicensesPage.js +39 -39
  42. package/dist/pages/OrderConfirmationPage.js +57 -57
  43. package/dist/pages/OrdersPage.js +3 -3
  44. package/dist/pages/OrdersPage.js.map +1 -1
  45. package/dist/pages/ProductDetailPage.js +6 -6
  46. package/dist/pages/SellerSourcingOffersPage.d.ts +3 -0
  47. package/dist/pages/SellerSourcingOffersPage.js +284 -0
  48. package/dist/pages/SellerSourcingOffersPage.js.map +1 -0
  49. package/dist/pages/SellerSourcingOpportunitiesPage.d.ts +3 -0
  50. package/dist/pages/SellerSourcingOpportunitiesPage.js +272 -0
  51. package/dist/pages/SellerSourcingOpportunitiesPage.js.map +1 -0
  52. package/dist/pages/SellerSourcingOpportunityDetailPage.d.ts +3 -0
  53. package/dist/pages/SellerSourcingOpportunityDetailPage.js +465 -0
  54. package/dist/pages/SellerSourcingOpportunityDetailPage.js.map +1 -0
  55. package/dist/pages/SourcingRequestDetailPage.d.ts +3 -0
  56. package/dist/pages/SourcingRequestDetailPage.js +447 -0
  57. package/dist/pages/SourcingRequestDetailPage.js.map +1 -0
  58. package/dist/pages/SourcingRequestsPage.d.ts +3 -0
  59. package/dist/pages/SourcingRequestsPage.js +272 -0
  60. package/dist/pages/SourcingRequestsPage.js.map +1 -0
  61. package/dist/providers/SourcingAccessProvider.d.ts +21 -0
  62. package/dist/providers/SourcingAccessProvider.js +95 -0
  63. package/dist/providers/SourcingAccessProvider.js.map +1 -0
  64. package/dist/translations/en.d.ts +3 -0
  65. package/dist/translations/en.js +3 -0
  66. package/dist/translations/en.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,272 @@
1
+ import { useStore as e } from "../providers/StoreProvider.js";
2
+ import { useSourcingApi as t } from "../hooks/useSourcing.js";
3
+ import { SourcingRequestStatus as n } from "../generated/global-types.js";
4
+ import { ContextRequiredPanel as r, SourcingEmptyState as i, SourcingErrorState as a, SourcingLoadingState as o, SourcingPageHeader as s, SourcingStatusBadge as c, formatDate as l, formatLocation as u, formatMoney as d, formatSourcingUnit as f, joinStorePath as p, primaryButtonClassName as m, secondaryButtonClassName as h, toErrorMessage as g } from "../components/sourcing/SourcingUi.js";
5
+ import { useCallback as _, useEffect as v, useMemo as y, useState as b } from "react";
6
+ import { useNavigate as x } from "react-router";
7
+ import { ArrowRight as S, CalendarDays as C, FilePlus2 as w, FileText as T, MapPin as E, PackageSearch as D, RefreshCw as O } from "lucide-react";
8
+ import { Fragment as k, jsx as A, jsxs as j } from "react/jsx-runtime";
9
+ import { GlassCard as M, PagePurpose as N } from "@burdenoff/fe-libs/ui";
10
+ //#region src/pages/SourcingRequestsPage.tsx
11
+ var P = 30, F = () => {
12
+ let F = x(), { basePath: I } = e(), { hasOrganizationContext: L, listBuyerRequests: R } = t(), [z, B] = b([]), [V, H] = b(""), [U, W] = b(0), [G, K] = b(!1), [q, J] = b(!1), [Y, X] = b(null), Z = _(async (e = 0, t = !1) => {
13
+ if (!L) {
14
+ B([]), K(!1), J(!1);
15
+ return;
16
+ }
17
+ J(!0), X(null);
18
+ try {
19
+ let n = await R({
20
+ status: V || void 0,
21
+ limit: P,
22
+ offset: e
23
+ });
24
+ B((e) => t ? [...e, ...n] : n), W(e), K(n.length === P);
25
+ } catch (e) {
26
+ X(g(e, "Failed to load sourcing requests."));
27
+ } finally {
28
+ J(!1);
29
+ }
30
+ }, [
31
+ L,
32
+ R,
33
+ V
34
+ ]);
35
+ v(() => {
36
+ Z();
37
+ }, [Z]);
38
+ let Q = y(() => z.reduce((e, t) => (e.total += 1, e.offers += t.offers.filter((e) => e.status === "ACTIVE").length, e), {
39
+ total: 0,
40
+ offers: 0
41
+ }), [z]), $ = p(I, "sourcing/requests/new");
42
+ return /* @__PURE__ */ j("div", {
43
+ className: "min-h-full bg-surface-default",
44
+ children: [/* @__PURE__ */ A(s, {
45
+ title: "Sourcing requests",
46
+ description: "Request products from verified Store publishers and compare private offers for your organization.",
47
+ icon: /* @__PURE__ */ A(D, {
48
+ className: "size-5",
49
+ "aria-hidden": "true"
50
+ }),
51
+ actions: /* @__PURE__ */ j("button", {
52
+ type: "button",
53
+ onClick: () => F($),
54
+ disabled: !L,
55
+ className: m,
56
+ children: [/* @__PURE__ */ A(w, {
57
+ className: "size-4",
58
+ "aria-hidden": "true"
59
+ }), "New request"]
60
+ })
61
+ }), /* @__PURE__ */ j("main", {
62
+ className: "mx-auto max-w-6xl px-4 py-6 sm:px-6",
63
+ children: [/* @__PURE__ */ A(N, {
64
+ className: "mb-6",
65
+ children: "Create one request for the exact quantity, delivery window, and destination you need. Offers remain private to your organization. Accepting one offer creates a Store order and closes the request; all other offers are rejected automatically."
66
+ }), L ? /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ j("div", {
67
+ className: "mb-5 flex flex-col gap-3 rounded-xl border border-border-seam bg-surface-raised p-4 sm:flex-row sm:items-end sm:justify-between",
68
+ children: [/* @__PURE__ */ j("label", {
69
+ className: "block sm:max-w-xs sm:flex-1",
70
+ children: [/* @__PURE__ */ A("span", {
71
+ className: "text-sm font-medium text-text-primary",
72
+ children: "Request status"
73
+ }), /* @__PURE__ */ j("select", {
74
+ value: V,
75
+ onChange: (e) => H(e.target.value),
76
+ className: "mt-1.5 w-full rounded-lg border border-border-default bg-surface-default px-3 py-2 text-sm text-text-primary outline-none focus:border-action-primary-bg focus:ring-2 focus:ring-action-primary-bg/20",
77
+ children: [
78
+ /* @__PURE__ */ A("option", {
79
+ value: "",
80
+ children: "All statuses"
81
+ }),
82
+ /* @__PURE__ */ A("option", {
83
+ value: n.Open,
84
+ children: "Open"
85
+ }),
86
+ /* @__PURE__ */ A("option", {
87
+ value: n.Matched,
88
+ children: "Matched"
89
+ }),
90
+ /* @__PURE__ */ A("option", {
91
+ value: n.Canceled,
92
+ children: "Canceled"
93
+ })
94
+ ]
95
+ })]
96
+ }), /* @__PURE__ */ j("div", {
97
+ className: "flex flex-wrap items-center gap-3 text-sm text-text-secondary",
98
+ children: [
99
+ /* @__PURE__ */ j("span", { children: [Q.total, " shown"] }),
100
+ /* @__PURE__ */ A("span", {
101
+ "aria-hidden": "true",
102
+ children: "·"
103
+ }),
104
+ /* @__PURE__ */ j("span", { children: [Q.offers, " active offers"] }),
105
+ /* @__PURE__ */ j("button", {
106
+ type: "button",
107
+ onClick: () => void Z(),
108
+ disabled: q,
109
+ className: h,
110
+ children: [/* @__PURE__ */ A(O, {
111
+ className: `size-4 ${q ? "animate-spin" : ""}`,
112
+ "aria-hidden": "true"
113
+ }), "Refresh"]
114
+ })
115
+ ]
116
+ })]
117
+ }), q && z.length === 0 ? /* @__PURE__ */ A(o, { label: "Loading sourcing requests…" }) : Y && z.length === 0 ? /* @__PURE__ */ A(a, {
118
+ title: "Sourcing requests could not be loaded",
119
+ message: Y,
120
+ onRetry: () => void Z()
121
+ }) : z.length === 0 ? /* @__PURE__ */ A(i, {
122
+ title: V ? "No requests match this status" : "No sourcing requests yet",
123
+ description: V ? "Choose another status or create a new request." : "Describe what your organization needs and verified publishers can respond with offers.",
124
+ action: /* @__PURE__ */ j("button", {
125
+ type: "button",
126
+ onClick: () => F($),
127
+ className: m,
128
+ children: [/* @__PURE__ */ A(w, {
129
+ className: "size-4",
130
+ "aria-hidden": "true"
131
+ }), "Create request"]
132
+ })
133
+ }) : /* @__PURE__ */ j(k, { children: [
134
+ Y ? /* @__PURE__ */ A("div", {
135
+ role: "alert",
136
+ className: "mb-4 rounded-lg border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger",
137
+ children: Y
138
+ }) : null,
139
+ /* @__PURE__ */ A("ul", {
140
+ className: "grid gap-4 md:grid-cols-2",
141
+ children: z.map((e) => {
142
+ let t = e.offers.filter((e) => e.status === "ACTIVE").length;
143
+ return /* @__PURE__ */ A("li", { children: /* @__PURE__ */ j(M, {
144
+ className: "flex h-full flex-col p-5",
145
+ children: [
146
+ /* @__PURE__ */ j("div", {
147
+ className: "flex items-start justify-between gap-3",
148
+ children: [/* @__PURE__ */ j("div", {
149
+ className: "min-w-0",
150
+ children: [/* @__PURE__ */ j("div", {
151
+ className: "flex items-center gap-2 text-xs font-medium text-text-accent",
152
+ children: [/* @__PURE__ */ A(T, {
153
+ className: "size-4",
154
+ "aria-hidden": "true"
155
+ }), /* @__PURE__ */ A("span", {
156
+ className: "truncate",
157
+ children: e.category
158
+ })]
159
+ }), /* @__PURE__ */ A("h2", {
160
+ className: "mt-2 line-clamp-2 text-lg font-semibold text-text-primary",
161
+ children: e.productName
162
+ })]
163
+ }), /* @__PURE__ */ A(c, { status: e.status })]
164
+ }),
165
+ /* @__PURE__ */ j("dl", {
166
+ className: "mt-5 grid gap-3 text-sm sm:grid-cols-2",
167
+ children: [
168
+ /* @__PURE__ */ j("div", {
169
+ className: "flex items-start gap-2",
170
+ children: [/* @__PURE__ */ A(D, {
171
+ className: "mt-0.5 size-4 shrink-0 text-text-tertiary",
172
+ "aria-hidden": "true"
173
+ }), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("dt", {
174
+ className: "text-xs text-text-tertiary",
175
+ children: "Quantity"
176
+ }), /* @__PURE__ */ j("dd", {
177
+ className: "font-medium text-text-primary",
178
+ children: [
179
+ e.quantity.toLocaleString(),
180
+ " ",
181
+ f(e.unit)
182
+ ]
183
+ })] })]
184
+ }),
185
+ /* @__PURE__ */ j("div", {
186
+ className: "flex items-start gap-2",
187
+ children: [/* @__PURE__ */ A(E, {
188
+ className: "mt-0.5 size-4 shrink-0 text-text-tertiary",
189
+ "aria-hidden": "true"
190
+ }), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("dt", {
191
+ className: "text-xs text-text-tertiary",
192
+ children: "Deliver to"
193
+ }), /* @__PURE__ */ A("dd", {
194
+ className: "font-medium text-text-primary",
195
+ children: u({
196
+ country: e.deliveryCountry,
197
+ region: e.deliveryRegion,
198
+ city: e.deliveryCity
199
+ })
200
+ })] })]
201
+ }),
202
+ /* @__PURE__ */ j("div", {
203
+ className: "flex items-start gap-2 sm:col-span-2",
204
+ children: [/* @__PURE__ */ A(C, {
205
+ className: "mt-0.5 size-4 shrink-0 text-text-tertiary",
206
+ "aria-hidden": "true"
207
+ }), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("dt", {
208
+ className: "text-xs text-text-tertiary",
209
+ children: "Delivery window"
210
+ }), /* @__PURE__ */ j("dd", {
211
+ className: "font-medium text-text-primary",
212
+ children: [
213
+ l(e.deliveryWindowStart),
214
+ " –",
215
+ " ",
216
+ l(e.deliveryWindowEnd)
217
+ ]
218
+ })] })]
219
+ })
220
+ ]
221
+ }),
222
+ /* @__PURE__ */ j("div", {
223
+ className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-border-seam pt-4",
224
+ children: [/* @__PURE__ */ j("div", { children: [/* @__PURE__ */ j("p", {
225
+ className: "text-sm font-medium text-text-primary",
226
+ children: [
227
+ t,
228
+ " active ",
229
+ t === 1 ? "offer" : "offers"
230
+ ]
231
+ }), /* @__PURE__ */ j("p", {
232
+ className: "text-xs text-text-tertiary",
233
+ children: [
234
+ "Target",
235
+ " ",
236
+ d(e.targetUnitPrice, e.targetCurrency)
237
+ ]
238
+ })] }), /* @__PURE__ */ j("button", {
239
+ type: "button",
240
+ onClick: () => F(p(I, `sourcing/requests/${e.id}`)),
241
+ className: h,
242
+ children: ["View details", /* @__PURE__ */ A(S, {
243
+ className: "size-4",
244
+ "aria-hidden": "true"
245
+ })]
246
+ })]
247
+ })
248
+ ]
249
+ }) }, e.id);
250
+ })
251
+ }),
252
+ G ? /* @__PURE__ */ A("div", {
253
+ className: "mt-6 flex justify-center",
254
+ children: /* @__PURE__ */ A("button", {
255
+ type: "button",
256
+ onClick: () => void Z(U + P, !0),
257
+ disabled: q,
258
+ className: h,
259
+ children: q ? "Loading…" : "Load more"
260
+ })
261
+ }) : null
262
+ ] })] }) : /* @__PURE__ */ A(r, {
263
+ title: "Choose an organization",
264
+ description: "Sourcing requests use your active global organization and its billing account. Choose an organization in the app switcher; a farm workspace is not required."
265
+ })]
266
+ })]
267
+ });
268
+ };
269
+ //#endregion
270
+ export { F as SourcingRequestsPage };
271
+
272
+ //# sourceMappingURL=SourcingRequestsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourcingRequestsPage.js","names":[],"sources":["../../src/pages/SourcingRequestsPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { FC } from 'react';\nimport { useNavigate } from 'react-router';\nimport {\n ArrowRight,\n CalendarDays,\n FilePlus2,\n FileText,\n MapPin,\n PackageSearch,\n RefreshCw,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { SourcingRequestStatus } from '../generated/global-types';\nimport { useStore } from '../providers/StoreProvider';\nimport { type BuyerSourcingRequestListItem, useSourcingApi } from '../hooks/useSourcing';\nimport {\n ContextRequiredPanel,\n formatDate,\n formatLocation,\n formatMoney,\n formatSourcingUnit,\n joinStorePath,\n primaryButtonClassName,\n secondaryButtonClassName,\n SourcingEmptyState,\n SourcingErrorState,\n SourcingLoadingState,\n SourcingPageHeader,\n SourcingStatusBadge,\n toErrorMessage,\n} from '../components/sourcing/SourcingUi';\n\nconst PAGE_SIZE = 30;\n\ntype RequestFilter = SourcingRequestStatus | '';\n\nexport const SourcingRequestsPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { hasOrganizationContext, listBuyerRequests } = useSourcingApi();\n const [requests, setRequests] = useState<BuyerSourcingRequestListItem[]>([]);\n const [status, setStatus] = useState<RequestFilter>('');\n const [offset, setOffset] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(\n async (nextOffset = 0, append = false) => {\n if (!hasOrganizationContext) {\n setRequests([]);\n setHasMore(false);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await listBuyerRequests({\n status: status || undefined,\n limit: PAGE_SIZE,\n offset: nextOffset,\n });\n setRequests((current) => (append ? [...current, ...result] : result));\n setOffset(nextOffset);\n setHasMore(result.length === PAGE_SIZE);\n } catch (loadError) {\n setError(toErrorMessage(loadError, 'Failed to load sourcing requests.'));\n } finally {\n setLoading(false);\n }\n },\n [hasOrganizationContext, listBuyerRequests, status]\n );\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const counts = useMemo(\n () =>\n requests.reduce(\n (result, request) => {\n result.total += 1;\n result.offers += request.offers.filter((offer) => offer.status === 'ACTIVE').length;\n return result;\n },\n { total: 0, offers: 0 }\n ),\n [requests]\n );\n\n const createPath = joinStorePath(basePath, 'sourcing/requests/new');\n\n return (\n <div className=\"min-h-full bg-surface-default\">\n <SourcingPageHeader\n title=\"Sourcing requests\"\n description=\"Request products from verified Store publishers and compare private offers for your organization.\"\n icon={<PackageSearch className=\"size-5\" aria-hidden=\"true\" />}\n actions={\n <button\n type=\"button\"\n onClick={() => navigate(createPath)}\n disabled={!hasOrganizationContext}\n className={primaryButtonClassName}\n >\n <FilePlus2 className=\"size-4\" aria-hidden=\"true\" />\n New request\n </button>\n }\n />\n\n <main className=\"mx-auto max-w-6xl px-4 py-6 sm:px-6\">\n <PagePurpose className=\"mb-6\">\n Create one request for the exact quantity, delivery window, and destination you need.\n Offers remain private to your organization. Accepting one offer creates a Store order and\n closes the request; all other offers are rejected automatically.\n </PagePurpose>\n\n {!hasOrganizationContext ? (\n <ContextRequiredPanel\n title=\"Choose an organization\"\n description=\"Sourcing requests use your active global organization and its billing account. Choose an organization in the app switcher; a farm workspace is not required.\"\n />\n ) : (\n <>\n <div className=\"mb-5 flex flex-col gap-3 rounded-xl border border-border-seam bg-surface-raised p-4 sm:flex-row sm:items-end sm:justify-between\">\n <label className=\"block sm:max-w-xs sm:flex-1\">\n <span className=\"text-sm font-medium text-text-primary\">Request status</span>\n <select\n value={status}\n onChange={(event) => setStatus(event.target.value as RequestFilter)}\n className=\"mt-1.5 w-full rounded-lg border border-border-default bg-surface-default px-3 py-2 text-sm text-text-primary outline-none focus:border-action-primary-bg focus:ring-2 focus:ring-action-primary-bg/20\"\n >\n <option value=\"\">All statuses</option>\n <option value={SourcingRequestStatus.Open}>Open</option>\n <option value={SourcingRequestStatus.Matched}>Matched</option>\n <option value={SourcingRequestStatus.Canceled}>Canceled</option>\n </select>\n </label>\n <div className=\"flex flex-wrap items-center gap-3 text-sm text-text-secondary\">\n <span>{counts.total} shown</span>\n <span aria-hidden=\"true\">·</span>\n <span>{counts.offers} active offers</span>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading}\n className={secondaryButtonClassName}\n >\n <RefreshCw\n className={`size-4 ${loading ? 'animate-spin' : ''}`}\n aria-hidden=\"true\"\n />\n Refresh\n </button>\n </div>\n </div>\n\n {loading && requests.length === 0 ? (\n <SourcingLoadingState label=\"Loading sourcing requests…\" />\n ) : error && requests.length === 0 ? (\n <SourcingErrorState\n title=\"Sourcing requests could not be loaded\"\n message={error}\n onRetry={() => void load()}\n />\n ) : requests.length === 0 ? (\n <SourcingEmptyState\n title={status ? 'No requests match this status' : 'No sourcing requests yet'}\n description={\n status\n ? 'Choose another status or create a new request.'\n : 'Describe what your organization needs and verified publishers can respond with offers.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigate(createPath)}\n className={primaryButtonClassName}\n >\n <FilePlus2 className=\"size-4\" aria-hidden=\"true\" />\n Create request\n </button>\n }\n />\n ) : (\n <>\n {error ? (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-lg border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger\"\n >\n {error}\n </div>\n ) : null}\n <ul className=\"grid gap-4 md:grid-cols-2\">\n {requests.map((request) => {\n const activeOffers = request.offers.filter(\n (offer) => offer.status === 'ACTIVE'\n ).length;\n return (\n <li key={request.id}>\n <GlassCard className=\"flex h-full flex-col p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 text-xs font-medium text-text-accent\">\n <FileText className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"truncate\">{request.category}</span>\n </div>\n <h2 className=\"mt-2 line-clamp-2 text-lg font-semibold text-text-primary\">\n {request.productName}\n </h2>\n </div>\n <SourcingStatusBadge status={request.status} />\n </div>\n\n <dl className=\"mt-5 grid gap-3 text-sm sm:grid-cols-2\">\n <div className=\"flex items-start gap-2\">\n <PackageSearch\n className=\"mt-0.5 size-4 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Quantity</dt>\n <dd className=\"font-medium text-text-primary\">\n {request.quantity.toLocaleString()}{' '}\n {formatSourcingUnit(request.unit)}\n </dd>\n </div>\n </div>\n <div className=\"flex items-start gap-2\">\n <MapPin\n className=\"mt-0.5 size-4 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Deliver to</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatLocation({\n country: request.deliveryCountry,\n region: request.deliveryRegion,\n city: request.deliveryCity,\n })}\n </dd>\n </div>\n </div>\n <div className=\"flex items-start gap-2 sm:col-span-2\">\n <CalendarDays\n className=\"mt-0.5 size-4 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery window</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDate(request.deliveryWindowStart)} –{' '}\n {formatDate(request.deliveryWindowEnd)}\n </dd>\n </div>\n </div>\n </dl>\n\n <div className=\"mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-border-seam pt-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {activeOffers} active {activeOffers === 1 ? 'offer' : 'offers'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n Target{' '}\n {formatMoney(request.targetUnitPrice, request.targetCurrency)}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() =>\n navigate(joinStorePath(basePath, `sourcing/requests/${request.id}`))\n }\n className={secondaryButtonClassName}\n >\n View details\n <ArrowRight className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n </GlassCard>\n </li>\n );\n })}\n </ul>\n\n {hasMore ? (\n <div className=\"mt-6 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => void load(offset + PAGE_SIZE, true)}\n disabled={loading}\n className={secondaryButtonClassName}\n >\n {loading ? 'Loading…' : 'Load more'}\n </button>\n </div>\n ) : null}\n </>\n )}\n </>\n )}\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ import { PublisherSourcingProduct, PublisherSourcingProfile } from '../hooks/useSourcing';
3
+
4
+ interface PublisherSourcingAccessValue {
5
+ profile: PublisherSourcingProfile | null;
6
+ products: PublisherSourcingProduct[];
7
+ loading: boolean;
8
+ error: string | null;
9
+ productsLoading: boolean;
10
+ productsError: string | null;
11
+ isEligible: boolean;
12
+ refresh: () => Promise<void>;
13
+ refreshProducts: () => Promise<void>;
14
+ }
15
+ export declare function PublisherSourcingAccessProvider({ children, enabled, includeProducts, }: {
16
+ children: ReactNode;
17
+ enabled: boolean;
18
+ includeProducts?: boolean;
19
+ }): import("react").JSX.Element;
20
+ export declare function usePublisherSourcingAccess(): PublisherSourcingAccessValue;
21
+ export {};
@@ -0,0 +1,95 @@
1
+ import { useSourcingApi as e } from "../hooks/useSourcing.js";
2
+ import { createContext as t, useCallback as n, useContext as r, useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
3
+ import { jsx as c } from "react/jsx-runtime";
4
+ //#region src/providers/SourcingAccessProvider.tsx
5
+ var l = t(null);
6
+ function u(e, t) {
7
+ return e instanceof Error && e.message.trim() ? e.message : t;
8
+ }
9
+ function d({ children: t, enabled: r, includeProducts: d = !1 }) {
10
+ let { getPublisherAccess: f, getPublisherProducts: p } = e(), [m, h] = s(null), [g, _] = s([]), [v, y] = s(r), [b, x] = s(null), [S, C] = s(!1), [w, T] = s(null), E = o(0), D = o(0), O = n(async () => {
11
+ if (!r) return;
12
+ let e = ++E.current;
13
+ y(!0), x(null), h(null);
14
+ try {
15
+ let t = await f();
16
+ e === E.current && h(t);
17
+ } catch (t) {
18
+ e === E.current && x(u(t, "Publisher access could not be verified."));
19
+ } finally {
20
+ e === E.current && y(!1);
21
+ }
22
+ }, [r, f]), k = m?.isVerified === !0 && m.verificationStatus === "VERIFIED", A = n(async () => {
23
+ if (!r || !d || !k) return;
24
+ let e = ++D.current;
25
+ C(!0), T(null);
26
+ try {
27
+ let t = await p();
28
+ e === D.current && _(t);
29
+ } catch (t) {
30
+ e === D.current && T(u(t, "Published products could not be loaded."));
31
+ } finally {
32
+ e === D.current && C(!1);
33
+ }
34
+ }, [
35
+ r,
36
+ p,
37
+ d,
38
+ k
39
+ ]);
40
+ i(() => {
41
+ if (!r) {
42
+ E.current += 1, h(null), y(!1), x(null);
43
+ return;
44
+ }
45
+ return O(), () => {
46
+ E.current += 1;
47
+ };
48
+ }, [r, O]), i(() => {
49
+ if (!d || !k) {
50
+ D.current += 1, _([]), C(!1), T(null);
51
+ return;
52
+ }
53
+ return A(), () => {
54
+ D.current += 1;
55
+ };
56
+ }, [
57
+ d,
58
+ k,
59
+ A
60
+ ]);
61
+ let j = a(() => ({
62
+ profile: m,
63
+ products: g,
64
+ loading: v,
65
+ error: b,
66
+ productsLoading: S,
67
+ productsError: w,
68
+ isEligible: k,
69
+ refresh: O,
70
+ refreshProducts: A
71
+ }), [
72
+ b,
73
+ k,
74
+ v,
75
+ g,
76
+ w,
77
+ S,
78
+ m,
79
+ O,
80
+ A
81
+ ]);
82
+ return /* @__PURE__ */ c(l.Provider, {
83
+ value: j,
84
+ children: t
85
+ });
86
+ }
87
+ function f() {
88
+ let e = r(l);
89
+ if (!e) throw Error("usePublisherSourcingAccess must be used inside its provider.");
90
+ return e;
91
+ }
92
+ //#endregion
93
+ export { d as PublisherSourcingAccessProvider, f as usePublisherSourcingAccess };
94
+
95
+ //# sourceMappingURL=SourcingAccessProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourcingAccessProvider.js","names":[],"sources":["../../src/providers/SourcingAccessProvider.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport type { PublisherSourcingProduct, PublisherSourcingProfile } from '../hooks/useSourcing';\nimport { useSourcingApi } from '../hooks/useSourcing';\n\ninterface PublisherSourcingAccessValue {\n profile: PublisherSourcingProfile | null;\n products: PublisherSourcingProduct[];\n loading: boolean;\n error: string | null;\n productsLoading: boolean;\n productsError: string | null;\n isEligible: boolean;\n refresh: () => Promise<void>;\n refreshProducts: () => Promise<void>;\n}\n\nconst PublisherSourcingAccessContext = createContext<PublisherSourcingAccessValue | null>(null);\n\nfunction errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim() ? error.message : fallback;\n}\n\nexport function PublisherSourcingAccessProvider({\n children,\n enabled,\n includeProducts = false,\n}: {\n children: ReactNode;\n enabled: boolean;\n includeProducts?: boolean;\n}) {\n const { getPublisherAccess, getPublisherProducts } = useSourcingApi();\n const [profile, setProfile] = useState<PublisherSourcingProfile | null>(null);\n const [products, setProducts] = useState<PublisherSourcingProduct[]>([]);\n const [loading, setLoading] = useState(enabled);\n const [error, setError] = useState<string | null>(null);\n const [productsLoading, setProductsLoading] = useState(false);\n const [productsError, setProductsError] = useState<string | null>(null);\n const accessRequest = useRef(0);\n const productsRequest = useRef(0);\n\n const refresh = useCallback(async () => {\n if (!enabled) return;\n const request = ++accessRequest.current;\n setLoading(true);\n setError(null);\n setProfile(null);\n try {\n const nextProfile = await getPublisherAccess();\n if (request === accessRequest.current) setProfile(nextProfile);\n } catch (loadError) {\n if (request === accessRequest.current) {\n setError(errorMessage(loadError, 'Publisher access could not be verified.'));\n }\n } finally {\n if (request === accessRequest.current) setLoading(false);\n }\n }, [enabled, getPublisherAccess]);\n\n const isEligible = profile?.isVerified === true && profile.verificationStatus === 'VERIFIED';\n\n const refreshProducts = useCallback(async () => {\n if (!enabled || !includeProducts || !isEligible) return;\n const request = ++productsRequest.current;\n setProductsLoading(true);\n setProductsError(null);\n try {\n const nextProducts = await getPublisherProducts();\n if (request === productsRequest.current) setProducts(nextProducts);\n } catch (loadError) {\n if (request === productsRequest.current) {\n setProductsError(errorMessage(loadError, 'Published products could not be loaded.'));\n }\n } finally {\n if (request === productsRequest.current) setProductsLoading(false);\n }\n }, [enabled, getPublisherProducts, includeProducts, isEligible]);\n\n useEffect(() => {\n if (!enabled) {\n accessRequest.current += 1;\n setProfile(null);\n setLoading(false);\n setError(null);\n return;\n }\n void refresh();\n return () => {\n accessRequest.current += 1;\n };\n }, [enabled, refresh]);\n\n useEffect(() => {\n if (!includeProducts || !isEligible) {\n productsRequest.current += 1;\n setProducts([]);\n setProductsLoading(false);\n setProductsError(null);\n return;\n }\n void refreshProducts();\n return () => {\n productsRequest.current += 1;\n };\n }, [includeProducts, isEligible, refreshProducts]);\n\n const value = useMemo<PublisherSourcingAccessValue>(\n () => ({\n profile,\n products,\n loading,\n error,\n productsLoading,\n productsError,\n isEligible,\n refresh,\n refreshProducts,\n }),\n [\n error,\n isEligible,\n loading,\n products,\n productsError,\n productsLoading,\n profile,\n refresh,\n refreshProducts,\n ]\n );\n\n return (\n <PublisherSourcingAccessContext.Provider value={value}>\n {children}\n </PublisherSourcingAccessContext.Provider>\n );\n}\n\nexport function usePublisherSourcingAccess(): PublisherSourcingAccessValue {\n const value = useContext(PublisherSourcingAccessContext);\n if (!value) {\n throw new Error('usePublisherSourcingAccess must be used inside its provider.');\n }\n return value;\n}\n"],"mappings":";;;;AAyBA,IAAM,IAAiC,EAAmD,KAAK;AAE/F,SAAS,EAAa,GAAgB,GAA0B;AAC9D,QAAO,aAAiB,SAAS,EAAM,QAAQ,MAAM,GAAG,EAAM,UAAU;;AAG1E,SAAgB,EAAgC,EAC9C,aACA,YACA,qBAAkB,MAKjB;CACD,IAAM,EAAE,uBAAoB,4BAAyB,GAAgB,EAC/D,CAAC,GAAS,KAAc,EAA0C,KAAK,EACvE,CAAC,GAAU,KAAe,EAAqC,EAAE,CAAC,EAClE,CAAC,GAAS,KAAc,EAAS,EAAQ,EACzC,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAe,KAAoB,EAAwB,KAAK,EACjE,IAAgB,EAAO,EAAE,EACzB,IAAkB,EAAO,EAAE,EAE3B,IAAU,EAAY,YAAY;AACtC,MAAI,CAAC,EAAS;EACd,IAAM,IAAU,EAAE,EAAc;AAGhC,EAFA,EAAW,GAAK,EAChB,EAAS,KAAK,EACd,EAAW,KAAK;AAChB,MAAI;GACF,IAAM,IAAc,MAAM,GAAoB;AAC9C,GAAI,MAAY,EAAc,WAAS,EAAW,EAAY;WACvD,GAAW;AAClB,GAAI,MAAY,EAAc,WAC5B,EAAS,EAAa,GAAW,0CAA0C,CAAC;YAEtE;AACR,GAAI,MAAY,EAAc,WAAS,EAAW,GAAM;;IAEzD,CAAC,GAAS,EAAmB,CAAC,EAE3B,IAAa,GAAS,eAAe,MAAQ,EAAQ,uBAAuB,YAE5E,IAAkB,EAAY,YAAY;AAC9C,MAAI,CAAC,KAAW,CAAC,KAAmB,CAAC,EAAY;EACjD,IAAM,IAAU,EAAE,EAAgB;AAElC,EADA,EAAmB,GAAK,EACxB,EAAiB,KAAK;AACtB,MAAI;GACF,IAAM,IAAe,MAAM,GAAsB;AACjD,GAAI,MAAY,EAAgB,WAAS,EAAY,EAAa;WAC3D,GAAW;AAClB,GAAI,MAAY,EAAgB,WAC9B,EAAiB,EAAa,GAAW,0CAA0C,CAAC;YAE9E;AACR,GAAI,MAAY,EAAgB,WAAS,EAAmB,GAAM;;IAEnE;EAAC;EAAS;EAAsB;EAAiB;EAAW,CAAC;AAgBhE,CAdA,QAAgB;AACd,MAAI,CAAC,GAAS;AAIZ,GAHA,EAAc,WAAW,GACzB,EAAW,KAAK,EAChB,EAAW,GAAM,EACjB,EAAS,KAAK;AACd;;AAGF,SADK,GAAS,QACD;AACX,KAAc,WAAW;;IAE1B,CAAC,GAAS,EAAQ,CAAC,EAEtB,QAAgB;AACd,MAAI,CAAC,KAAmB,CAAC,GAAY;AAInC,GAHA,EAAgB,WAAW,GAC3B,EAAY,EAAE,CAAC,EACf,EAAmB,GAAM,EACzB,EAAiB,KAAK;AACtB;;AAGF,SADK,GAAiB,QACT;AACX,KAAgB,WAAW;;IAE5B;EAAC;EAAiB;EAAY;EAAgB,CAAC;CAElD,IAAM,IAAQ,SACL;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,kBAAC,EAA+B,UAAhC;EAAgD;EAC7C;EACuC,CAAA;;AAI9C,SAAgB,IAA2D;CACzE,IAAM,IAAQ,EAAW,EAA+B;AACxD,KAAI,CAAC,EACH,OAAU,MAAM,+DAA+D;AAEjF,QAAO"}
@@ -229,6 +229,9 @@ export declare const enTranslations: {
229
229
  marketplace: string;
230
230
  cart: string;
231
231
  orders: string;
232
+ sourcingRequests: string;
233
+ sourcingOpportunities: string;
234
+ sourcingOffers: string;
232
235
  installed: string;
233
236
  licenses: string;
234
237
  publisher: string;
@@ -221,6 +221,9 @@ var e = {
221
221
  marketplace: "Marketplace",
222
222
  cart: "Cart",
223
223
  orders: "My Orders",
224
+ sourcingRequests: "Sourcing requests",
225
+ sourcingOpportunities: "Sourcing opportunities",
226
+ sourcingOffers: "My sourcing offers",
224
227
  installed: "Installed Apps",
225
228
  licenses: "Licenses",
226
229
  publisher: "Publisher Portal",
@@ -1 +1 @@
1
- {"version":3,"file":"en.js","names":[],"sources":["../../src/translations/en.ts"],"sourcesContent":["/**\n * Bundled English translations for microfe-store\n *\n * These serve as fallback translations when the i18n API is unavailable.\n * The i18n service should be the source of truth, but these ensure\n * the app remains usable even when translations can't be fetched.\n */\n\nexport const enTranslations = {\n // Store module\n store: {\n errors: {\n notFound: 'Store item not found',\n notFoundWithId: \"Store item with ID '{{id}}' not found\",\n productNotFound: 'Product not found',\n productNotFoundWithId: \"Product with ID '{{id}}' not found\",\n slugAlreadyExists: \"A product with slug '{{slug}}' already exists\",\n publisherNotFound: 'Publisher not found',\n publisherNotFoundWithId: \"Publisher with ID '{{id}}' not found\",\n categoryNotFound: 'Category not found',\n categoryNotFoundWithId: \"Category with ID '{{id}}' not found\",\n categoryAlreadyExists: \"Category '{{name}}' already exists\",\n versionNotFound: 'Version not found',\n versionNotFoundWithId: \"Version with ID '{{id}}' not found\",\n versionAlreadyExists: \"Version '{{version}}' already exists for this product\",\n reviewNotFound: 'Review not found',\n reviewNotFoundWithId: \"Review with ID '{{id}}' not found\",\n reviewAlreadyExists: 'You have already reviewed this product',\n entitlementNotFound: 'Entitlement not found',\n entitlementNotFoundWithId: \"Entitlement with ID '{{id}}' not found\",\n entitlementAlreadyExists: 'Entitlement already exists for this product',\n submissionNotFound: 'Submission not found',\n submissionNotFoundWithId: \"Submission with ID '{{id}}' not found\",\n submissionAlreadyPending: 'A submission is already pending for this product',\n orderNotFound: 'Order not found',\n orderNotFoundWithId: \"Order with ID '{{id}}' not found\",\n tagNotFound: 'Tag not found',\n tagNotFoundWithId: \"Tag with ID '{{id}}' not found\",\n tagAlreadyExists: \"Tag '{{name}}' already exists\",\n unauthorized: 'You are not authorized to perform this action',\n invalidInput: 'Invalid input provided',\n invalidStatus: 'Invalid status transition',\n cannotDeletePublished: 'Cannot delete a published product',\n cannotDeleteWithOrders: 'Cannot delete product with {{count}} orders',\n cannotDeleteWithEntitlements: 'Cannot delete product with active entitlements',\n productNotPublished: 'Product is not published',\n productAlreadyPublished: 'Product is already published',\n insufficientFunds: 'Insufficient funds to purchase this product',\n alreadyPurchased: 'You have already purchased this product',\n downloadFailed: 'Failed to download product',\n },\n success: {\n productCreated: \"Product '{{name}}' created successfully\",\n productUpdated: \"Product '{{name}}' updated successfully\",\n productDeleted: 'Product deleted successfully',\n productPublished: \"Product '{{name}}' published successfully\",\n productUnlisted: \"Product '{{name}}' unlisted successfully\",\n productDeprecated: \"Product '{{name}}' marked as deprecated\",\n versionCreated: \"Version '{{version}}' created successfully\",\n versionDeleted: 'Version deleted successfully',\n reviewCreated: 'Review submitted successfully',\n reviewUpdated: 'Review updated successfully',\n reviewDeleted: 'Review deleted successfully',\n reviewApproved: 'Review approved successfully',\n reviewRejected: 'Review rejected successfully',\n entitlementCreated: 'Entitlement created successfully',\n entitlementSuspended: 'Entitlement suspended',\n entitlementReactivated: 'Entitlement reactivated',\n entitlementDeleted: 'Entitlement deleted successfully',\n categoryCreated: \"Category '{{name}}' created successfully\",\n categoryUpdated: \"Category '{{name}}' updated successfully\",\n categoryDeleted: 'Category deleted successfully',\n submissionCreated: 'Submission created successfully',\n submissionApproved: 'Submission approved successfully',\n submissionRejected: 'Submission rejected',\n purchaseCompleted: 'Purchase completed successfully',\n downloadStarted: 'Download started',\n },\n validation: {\n nameRequired: 'Product name is required',\n nameTooShort: 'Product name must be at least {{min}} characters',\n nameTooLong: 'Product name cannot exceed {{max}} characters',\n slugRequired: 'Product slug is required',\n slugInvalid: 'Product slug contains invalid characters',\n descriptionTooLong: 'Description cannot exceed {{max}} characters',\n priceRequired: 'Price is required',\n priceInvalid: 'Price must be a positive number',\n currencyRequired: 'Currency is required',\n currencyInvalid: 'Invalid currency code',\n typeRequired: 'Product type is required',\n typeInvalid: 'Invalid product type',\n ratingRequired: 'Rating is required',\n ratingInvalid: 'Rating must be between 1 and 5',\n versionRequired: 'Version is required',\n versionInvalid: 'Invalid version format',\n },\n labels: {\n product: 'Product',\n products: 'Products',\n storeItem: 'Store Item',\n storeItems: 'Store Items',\n publisher: 'Publisher',\n publishers: 'Publishers',\n category: 'Category',\n categories: 'Categories',\n version: 'Version',\n versions: 'Versions',\n review: 'Review',\n reviews: 'Reviews',\n entitlement: 'Entitlement',\n entitlements: 'Entitlements',\n submission: 'Submission',\n submissions: 'Submissions',\n order: 'Order',\n orders: 'Orders',\n tag: 'Tag',\n tags: 'Tags',\n download: 'Download',\n downloads: 'Downloads',\n },\n status: {\n draft: 'Draft',\n pendingReview: 'Pending Review',\n published: 'Published',\n unlisted: 'Unlisted',\n deprecated: 'Deprecated',\n rejected: 'Rejected',\n archived: 'Archived',\n active: 'Active',\n suspended: 'Suspended',\n expired: 'Expired',\n pending: 'Pending',\n approved: 'Approved',\n processed: 'Processed',\n failed: 'Failed',\n refunded: 'Refunded',\n },\n productTypes: {\n app: 'Application',\n template: 'Template',\n integration: 'Integration',\n extension: 'Extension',\n theme: 'Theme',\n workflow: 'Workflow',\n node: 'Node',\n plugin: 'Plugin',\n component: 'Component',\n },\n pricingModels: {\n free: 'Free',\n paidOnetime: 'One-time Purchase',\n subscription: 'Subscription',\n },\n items: {\n zero: 'No items',\n one: '{{count}} item',\n other: '{{count}} items',\n },\n operations: {\n creating: 'Creating product...',\n updating: 'Updating product...',\n deleting: 'Deleting product...',\n publishing: 'Publishing product...',\n purchasing: 'Processing purchase...',\n downloading: 'Starting download...',\n loading: 'Loading store items...',\n },\n footer: {\n ready: 'Store Ready',\n },\n },\n\n // Publisher module\n publisher: {\n errors: {\n notFound: 'Publisher not found',\n notFoundWithId: \"Publisher with ID '{{id}}' not found\",\n alreadyExists: 'Publisher already exists for this user',\n notVerified: 'Publisher is not verified',\n unauthorized: 'You are not authorized to access this publisher',\n },\n success: {\n created: 'Publisher profile created successfully',\n updated: 'Publisher profile updated successfully',\n verified: 'Publisher verified successfully',\n },\n validation: {\n nameRequired: 'Publisher name is required',\n emailRequired: 'Publisher email is required',\n emailInvalid: 'Invalid email format',\n },\n },\n\n // Review module\n review: {\n errors: {\n notFound: 'Review not found',\n alreadyReviewed: 'You have already reviewed this product',\n cannotReviewOwn: 'You cannot review your own product',\n mustPurchase: 'You must purchase the product to review it',\n },\n validation: {\n ratingRequired: 'Rating is required',\n ratingRange: 'Rating must be between 1 and 5',\n },\n },\n\n // Order module\n order: {\n errors: {\n notFound: 'Order not found',\n alreadyProcessed: 'Order has already been processed',\n paymentFailed: 'Payment processing failed',\n refundFailed: 'Refund processing failed',\n },\n success: {\n created: 'Order created successfully',\n processed: 'Order processed successfully',\n refunded: 'Order refunded successfully',\n },\n },\n\n // Cart module\n cart: {\n title: 'Shopping Cart',\n empty: 'Your cart is empty',\n checkout: 'Checkout',\n continueShopping: 'Continue Shopping',\n removeItem: 'Remove item',\n clearCart: 'Clear cart',\n subtotal: 'Subtotal',\n total: 'Total',\n itemAdded: 'Item added to cart',\n itemRemoved: 'Item removed from cart',\n cartCleared: 'Cart cleared',\n mergeSuccess: 'Guest cart merged successfully',\n },\n\n // Navigation\n nav: {\n marketplace: 'Marketplace',\n cart: 'Cart',\n orders: 'My Orders',\n installed: 'Installed Apps',\n licenses: 'Licenses',\n publisher: 'Publisher Portal',\n publisherDashboard: 'Dashboard',\n submitProduct: 'Submit Product',\n submissions: 'Submissions',\n revenue: 'Revenue',\n admin: 'Store Admin',\n reviewModeration: 'Review Moderation',\n },\n\n // Common / shared\n common: {\n accessDenied: 'Access Denied',\n accessDeniedDescription: 'You do not have permission to access this section.',\n moduleLoadError: 'Something went wrong loading this module. Please refresh the page.',\n loading: 'Loading...',\n error: 'Something went wrong',\n retry: 'Retry',\n save: 'Save',\n cancel: 'Cancel',\n delete: 'Delete',\n edit: 'Edit',\n create: 'Create',\n search: 'Search',\n filter: 'Filter',\n sort: 'Sort',\n noResults: 'No results found',\n viewAll: 'View All',\n back: 'Back',\n next: 'Next',\n previous: 'Previous',\n tryAgain: 'Try Again',\n unknownPublisher: 'Unknown Publisher',\n unknown: 'Unknown',\n goBack: 'Go back',\n refresh: 'Refresh',\n close: 'Close',\n submit: 'Submit',\n confirm: 'Confirm',\n browse: 'Browse',\n },\n\n // Page-level UI strings\n pages: {\n marketplace: {\n title: 'Marketplace',\n subtitle: 'Discover and install apps for your workspace',\n searchPlaceholder: 'Search apps, integrations, templates...',\n filterByCategory: 'Filter by category',\n allCategories: 'All Categories',\n featuredApps: 'Featured Apps',\n popularApps: 'Popular Apps',\n recentlyUpdated: 'Recently Updated',\n freeApps: 'Free Apps',\n noResults: 'No products found',\n noResultsDescription: 'Try adjusting your search or filter to find what you are looking for.',\n clearSearch: 'Clear search',\n installNow: 'Install Now',\n viewDetails: 'View Details',\n free: 'Free',\n installed: 'Installed',\n },\n productDetail: {\n overview: 'Overview',\n reviews: 'Reviews',\n versions: 'Versions',\n installApp: 'Install App',\n installing: 'Installing...',\n installed: 'Installed',\n addToCart: 'Add to Cart',\n alreadyInCart: 'Already in Cart',\n buyNow: 'Buy Now',\n viewInstallation: 'View Installation',\n publisher: 'Publisher',\n category: 'Category',\n version: 'Version',\n updated: 'Updated',\n rating: 'Rating',\n reviews_count: '{{count}} reviews',\n noReviews: 'No reviews yet',\n beFirstToReview: 'Be the first to review this product.',\n writeReview: 'Write a Review',\n submitReview: 'Submit Review',\n yourRating: 'Your Rating',\n yourReview: 'Your Review (optional)',\n reviewPlaceholder: 'Share your experience with this product...',\n notFound: 'Product Not Found',\n notFoundDescription: 'The product you are looking for could not be found.',\n backToMarketplace: 'Back to Marketplace',\n },\n cart: {\n title: 'Shopping Cart',\n items: '{{count}} items',\n item: '{{count}} item',\n emptyTitle: 'Your cart is empty',\n emptyDescription:\n 'Looks like you have not added any apps or products to your cart yet. Start exploring the marketplace to find something you will love!',\n browseMarketplace: 'Browse Marketplace',\n cartItems: 'Cart Items ({{count}})',\n clearCart: 'Clear Cart',\n singleLicense: 'Single license',\n qty: 'Qty:',\n digital: 'Digital',\n physical: 'Physical',\n subscription: 'Subscription',\n orderSummary: 'Order Summary',\n subtotal: 'Subtotal',\n estimatedTaxes: 'Estimated taxes',\n calculatedAtCheckout: 'Calculated at checkout',\n totalPlusTaxes: 'Total (+ taxes)',\n proceedToCheckout: 'Proceed to Checkout',\n processing: 'Processing...',\n secureCheckout: 'Secure checkout powered by Stripe',\n weAccept: 'We accept:',\n continueShopping: 'Continue Shopping',\n failedToCreate: 'Failed to create order. Please try again.',\n checkoutError: 'An error occurred during checkout',\n },\n orders: {\n title: 'My Orders',\n subtitle: 'Track and manage your purchases',\n emptyTitle: 'No orders yet',\n emptyDescription: 'Your orders will appear here once you make a purchase.',\n shopNow: 'Shop Now',\n orderNumber: 'Order #{{number}}',\n orderDate: 'Ordered on {{date}}',\n items_count: '{{count}} item(s)',\n viewDetails: 'View Details',\n installApp: 'Install App',\n installed: 'Installed',\n failedToLoad: 'Failed to load orders',\n filterAll: 'All',\n reorder: 'Reorder',\n },\n orderConfirmation: {\n title: 'Order Confirmed!',\n subtitle: \"Thank you for your purchase. We'll send a confirmation to your email.\",\n orderNumber: 'Order Number',\n orderDate: 'Order Date',\n paymentStatus: 'Payment Status',\n orderStatus: 'Order Status',\n orderItems: 'Order Items',\n orderSummary: 'Order Summary',\n subtotal: 'Subtotal',\n tax: 'Tax',\n total: 'Total',\n whatHappensNext: \"What's Next?\",\n nextStep1: \"You'll receive a confirmation email with your order details.\",\n nextStep2: 'Your digital products will be available for installation immediately.',\n nextStep3: 'Physical products will be shipped within 3-5 business days.',\n viewOrders: 'View All Orders',\n continueShopping: 'Continue Shopping',\n installNow: 'Install Now',\n },\n installed: {\n title: 'Installed Apps',\n subtitle: 'Manage your installed applications',\n emptyTitle: 'No installed apps',\n emptyDescription: 'Install apps from the marketplace to manage them here.',\n browseMarketplace: 'Browse Marketplace',\n failedToLoad: 'Failed to load installations',\n filterAll: 'All',\n viewDetails: 'View Details',\n uninstall: 'Uninstall',\n settings: 'Settings',\n statusAll: 'All',\n installNew: 'Install New App',\n },\n appDetail: {\n title: 'App Details',\n version: 'Version',\n status: 'Status',\n installedAt: 'Installed At',\n uninstall: 'Uninstall',\n uninstalling: 'Uninstalling...',\n settings: 'Settings',\n openSettings: 'Open Settings',\n failedToLoad: 'Failed to load app details',\n notFound: 'App Not Found',\n notFoundDescription: 'The installation you are looking for could not be found.',\n },\n appSettings: {\n title: 'App Settings',\n saveSettings: 'Save Settings',\n saving: 'Saving...',\n settingsSaved: 'Settings saved successfully',\n failedToSave: 'Failed to save settings',\n noSettings: 'No configurable settings',\n noSettingsDescription: 'This app does not have any configurable settings.',\n },\n licenses: {\n title: 'My Licenses',\n subtitle: 'Review and manage your product entitlements',\n emptyTitle: 'No licenses yet',\n emptyDescription: 'Purchase apps from the marketplace to see your licenses here.',\n browseMarketplace: 'Browse Marketplace',\n failedToLoad: 'Failed to load licenses',\n productId: 'Product {{id}}',\n entitlementId: 'Entitlement ID: {{id}}',\n licenseKey: 'License key: {{key}}',\n expiresOn: 'Expires on {{date}}',\n },\n publisherDashboard: {\n title: 'Publisher Dashboard',\n subtitle: 'Manage your products and track performance',\n totalProducts: 'Total Products',\n totalRevenue: 'Total Revenue',\n totalInstalls: 'Total Installs',\n pendingReviews: 'Pending Reviews',\n recentSubmissions: 'Recent Submissions',\n quickActions: 'Quick Actions',\n submitNewProduct: 'Submit New Product',\n viewSubmissions: 'View Submissions',\n viewRevenue: 'View Revenue',\n noProducts: 'No products yet',\n notRegistered: 'Not a publisher yet',\n registerNow: 'Register as Publisher',\n failedToLoad: 'Failed to load dashboard',\n },\n publisherSubmit: {\n title: 'Submit Product',\n productIdLabel: 'Product ID',\n productIdPlaceholder: 'Enter product ID to submit for review',\n notesLabel: 'Notes (optional)',\n notesPlaceholder: 'Add any notes for the reviewer...',\n submitButton: 'Submit for Review',\n submitting: 'Submitting...',\n successTitle: 'Submission Successful',\n successDescription: 'Your product has been submitted for review.',\n viewSubmissions: 'View Submissions',\n submitAnother: 'Submit Another',\n },\n publisherSubmissions: {\n title: 'My Submissions',\n subtitle: 'Track the status of your product submissions',\n emptyTitle: 'No submissions yet',\n emptyDescription: 'Submit a product for review to see it here.',\n submitProduct: 'Submit a Product',\n failedToLoad: 'Failed to load submissions',\n submittedOn: 'Submitted on {{date}}',\n reviewedOn: 'Reviewed on {{date}}',\n reviewNotes: 'Review notes: {{notes}}',\n },\n publisherRevenue: {\n title: 'Revenue',\n subtitle: 'Track your earnings and payouts',\n totalEarnings: 'Total Earnings',\n pendingPayout: 'Pending Payout',\n lastPayout: 'Last Payout',\n revenueHistory: 'Revenue History',\n noRevenue: 'No revenue data yet',\n noRevenueDescription:\n 'Revenue data will appear here once your products start generating sales.',\n period: 'Period',\n amount: 'Amount',\n status: 'Status',\n },\n productReviews: {\n title: 'Product Reviews',\n subtitle: 'Manage reviews for your products',\n failedToLoad: 'Failed to load reviews',\n noReviews: 'No reviews yet',\n noReviewsDescription:\n 'Reviews will appear here once customers start reviewing your products.',\n rating: 'Rating',\n reviewer: 'Reviewer',\n date: 'Date',\n approve: 'Approve',\n reject: 'Reject',\n },\n search: {\n title: 'Search Results',\n resultsFor: 'Results for \"{{query}}\"',\n noResults: 'No results found',\n noResultsDescription: 'Try different keywords or browse the marketplace.',\n browseMarketplace: 'Browse Marketplace',\n resultCount: '{{count}} results',\n },\n stores: {\n title: 'Stores',\n subtitle: 'Browse available stores',\n emptyTitle: 'No stores found',\n emptyDescription: 'No stores are currently available.',\n failedToLoad: 'Failed to load stores',\n },\n category: {\n title: '{{name}}',\n noProducts: 'No products in this category',\n noProductsDescription: 'Check back later for new products in this category.',\n browseAll: 'Browse All Products',\n },\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"en.js","names":[],"sources":["../../src/translations/en.ts"],"sourcesContent":["/**\n * Bundled English translations for microfe-store\n *\n * These serve as fallback translations when the i18n API is unavailable.\n * The i18n service should be the source of truth, but these ensure\n * the app remains usable even when translations can't be fetched.\n */\n\nexport const enTranslations = {\n // Store module\n store: {\n errors: {\n notFound: 'Store item not found',\n notFoundWithId: \"Store item with ID '{{id}}' not found\",\n productNotFound: 'Product not found',\n productNotFoundWithId: \"Product with ID '{{id}}' not found\",\n slugAlreadyExists: \"A product with slug '{{slug}}' already exists\",\n publisherNotFound: 'Publisher not found',\n publisherNotFoundWithId: \"Publisher with ID '{{id}}' not found\",\n categoryNotFound: 'Category not found',\n categoryNotFoundWithId: \"Category with ID '{{id}}' not found\",\n categoryAlreadyExists: \"Category '{{name}}' already exists\",\n versionNotFound: 'Version not found',\n versionNotFoundWithId: \"Version with ID '{{id}}' not found\",\n versionAlreadyExists: \"Version '{{version}}' already exists for this product\",\n reviewNotFound: 'Review not found',\n reviewNotFoundWithId: \"Review with ID '{{id}}' not found\",\n reviewAlreadyExists: 'You have already reviewed this product',\n entitlementNotFound: 'Entitlement not found',\n entitlementNotFoundWithId: \"Entitlement with ID '{{id}}' not found\",\n entitlementAlreadyExists: 'Entitlement already exists for this product',\n submissionNotFound: 'Submission not found',\n submissionNotFoundWithId: \"Submission with ID '{{id}}' not found\",\n submissionAlreadyPending: 'A submission is already pending for this product',\n orderNotFound: 'Order not found',\n orderNotFoundWithId: \"Order with ID '{{id}}' not found\",\n tagNotFound: 'Tag not found',\n tagNotFoundWithId: \"Tag with ID '{{id}}' not found\",\n tagAlreadyExists: \"Tag '{{name}}' already exists\",\n unauthorized: 'You are not authorized to perform this action',\n invalidInput: 'Invalid input provided',\n invalidStatus: 'Invalid status transition',\n cannotDeletePublished: 'Cannot delete a published product',\n cannotDeleteWithOrders: 'Cannot delete product with {{count}} orders',\n cannotDeleteWithEntitlements: 'Cannot delete product with active entitlements',\n productNotPublished: 'Product is not published',\n productAlreadyPublished: 'Product is already published',\n insufficientFunds: 'Insufficient funds to purchase this product',\n alreadyPurchased: 'You have already purchased this product',\n downloadFailed: 'Failed to download product',\n },\n success: {\n productCreated: \"Product '{{name}}' created successfully\",\n productUpdated: \"Product '{{name}}' updated successfully\",\n productDeleted: 'Product deleted successfully',\n productPublished: \"Product '{{name}}' published successfully\",\n productUnlisted: \"Product '{{name}}' unlisted successfully\",\n productDeprecated: \"Product '{{name}}' marked as deprecated\",\n versionCreated: \"Version '{{version}}' created successfully\",\n versionDeleted: 'Version deleted successfully',\n reviewCreated: 'Review submitted successfully',\n reviewUpdated: 'Review updated successfully',\n reviewDeleted: 'Review deleted successfully',\n reviewApproved: 'Review approved successfully',\n reviewRejected: 'Review rejected successfully',\n entitlementCreated: 'Entitlement created successfully',\n entitlementSuspended: 'Entitlement suspended',\n entitlementReactivated: 'Entitlement reactivated',\n entitlementDeleted: 'Entitlement deleted successfully',\n categoryCreated: \"Category '{{name}}' created successfully\",\n categoryUpdated: \"Category '{{name}}' updated successfully\",\n categoryDeleted: 'Category deleted successfully',\n submissionCreated: 'Submission created successfully',\n submissionApproved: 'Submission approved successfully',\n submissionRejected: 'Submission rejected',\n purchaseCompleted: 'Purchase completed successfully',\n downloadStarted: 'Download started',\n },\n validation: {\n nameRequired: 'Product name is required',\n nameTooShort: 'Product name must be at least {{min}} characters',\n nameTooLong: 'Product name cannot exceed {{max}} characters',\n slugRequired: 'Product slug is required',\n slugInvalid: 'Product slug contains invalid characters',\n descriptionTooLong: 'Description cannot exceed {{max}} characters',\n priceRequired: 'Price is required',\n priceInvalid: 'Price must be a positive number',\n currencyRequired: 'Currency is required',\n currencyInvalid: 'Invalid currency code',\n typeRequired: 'Product type is required',\n typeInvalid: 'Invalid product type',\n ratingRequired: 'Rating is required',\n ratingInvalid: 'Rating must be between 1 and 5',\n versionRequired: 'Version is required',\n versionInvalid: 'Invalid version format',\n },\n labels: {\n product: 'Product',\n products: 'Products',\n storeItem: 'Store Item',\n storeItems: 'Store Items',\n publisher: 'Publisher',\n publishers: 'Publishers',\n category: 'Category',\n categories: 'Categories',\n version: 'Version',\n versions: 'Versions',\n review: 'Review',\n reviews: 'Reviews',\n entitlement: 'Entitlement',\n entitlements: 'Entitlements',\n submission: 'Submission',\n submissions: 'Submissions',\n order: 'Order',\n orders: 'Orders',\n tag: 'Tag',\n tags: 'Tags',\n download: 'Download',\n downloads: 'Downloads',\n },\n status: {\n draft: 'Draft',\n pendingReview: 'Pending Review',\n published: 'Published',\n unlisted: 'Unlisted',\n deprecated: 'Deprecated',\n rejected: 'Rejected',\n archived: 'Archived',\n active: 'Active',\n suspended: 'Suspended',\n expired: 'Expired',\n pending: 'Pending',\n approved: 'Approved',\n processed: 'Processed',\n failed: 'Failed',\n refunded: 'Refunded',\n },\n productTypes: {\n app: 'Application',\n template: 'Template',\n integration: 'Integration',\n extension: 'Extension',\n theme: 'Theme',\n workflow: 'Workflow',\n node: 'Node',\n plugin: 'Plugin',\n component: 'Component',\n },\n pricingModels: {\n free: 'Free',\n paidOnetime: 'One-time Purchase',\n subscription: 'Subscription',\n },\n items: {\n zero: 'No items',\n one: '{{count}} item',\n other: '{{count}} items',\n },\n operations: {\n creating: 'Creating product...',\n updating: 'Updating product...',\n deleting: 'Deleting product...',\n publishing: 'Publishing product...',\n purchasing: 'Processing purchase...',\n downloading: 'Starting download...',\n loading: 'Loading store items...',\n },\n footer: {\n ready: 'Store Ready',\n },\n },\n\n // Publisher module\n publisher: {\n errors: {\n notFound: 'Publisher not found',\n notFoundWithId: \"Publisher with ID '{{id}}' not found\",\n alreadyExists: 'Publisher already exists for this user',\n notVerified: 'Publisher is not verified',\n unauthorized: 'You are not authorized to access this publisher',\n },\n success: {\n created: 'Publisher profile created successfully',\n updated: 'Publisher profile updated successfully',\n verified: 'Publisher verified successfully',\n },\n validation: {\n nameRequired: 'Publisher name is required',\n emailRequired: 'Publisher email is required',\n emailInvalid: 'Invalid email format',\n },\n },\n\n // Review module\n review: {\n errors: {\n notFound: 'Review not found',\n alreadyReviewed: 'You have already reviewed this product',\n cannotReviewOwn: 'You cannot review your own product',\n mustPurchase: 'You must purchase the product to review it',\n },\n validation: {\n ratingRequired: 'Rating is required',\n ratingRange: 'Rating must be between 1 and 5',\n },\n },\n\n // Order module\n order: {\n errors: {\n notFound: 'Order not found',\n alreadyProcessed: 'Order has already been processed',\n paymentFailed: 'Payment processing failed',\n refundFailed: 'Refund processing failed',\n },\n success: {\n created: 'Order created successfully',\n processed: 'Order processed successfully',\n refunded: 'Order refunded successfully',\n },\n },\n\n // Cart module\n cart: {\n title: 'Shopping Cart',\n empty: 'Your cart is empty',\n checkout: 'Checkout',\n continueShopping: 'Continue Shopping',\n removeItem: 'Remove item',\n clearCart: 'Clear cart',\n subtotal: 'Subtotal',\n total: 'Total',\n itemAdded: 'Item added to cart',\n itemRemoved: 'Item removed from cart',\n cartCleared: 'Cart cleared',\n mergeSuccess: 'Guest cart merged successfully',\n },\n\n // Navigation\n nav: {\n marketplace: 'Marketplace',\n cart: 'Cart',\n orders: 'My Orders',\n sourcingRequests: 'Sourcing requests',\n sourcingOpportunities: 'Sourcing opportunities',\n sourcingOffers: 'My sourcing offers',\n installed: 'Installed Apps',\n licenses: 'Licenses',\n publisher: 'Publisher Portal',\n publisherDashboard: 'Dashboard',\n submitProduct: 'Submit Product',\n submissions: 'Submissions',\n revenue: 'Revenue',\n admin: 'Store Admin',\n reviewModeration: 'Review Moderation',\n },\n\n // Common / shared\n common: {\n accessDenied: 'Access Denied',\n accessDeniedDescription: 'You do not have permission to access this section.',\n moduleLoadError: 'Something went wrong loading this module. Please refresh the page.',\n loading: 'Loading...',\n error: 'Something went wrong',\n retry: 'Retry',\n save: 'Save',\n cancel: 'Cancel',\n delete: 'Delete',\n edit: 'Edit',\n create: 'Create',\n search: 'Search',\n filter: 'Filter',\n sort: 'Sort',\n noResults: 'No results found',\n viewAll: 'View All',\n back: 'Back',\n next: 'Next',\n previous: 'Previous',\n tryAgain: 'Try Again',\n unknownPublisher: 'Unknown Publisher',\n unknown: 'Unknown',\n goBack: 'Go back',\n refresh: 'Refresh',\n close: 'Close',\n submit: 'Submit',\n confirm: 'Confirm',\n browse: 'Browse',\n },\n\n // Page-level UI strings\n pages: {\n marketplace: {\n title: 'Marketplace',\n subtitle: 'Discover and install apps for your workspace',\n searchPlaceholder: 'Search apps, integrations, templates...',\n filterByCategory: 'Filter by category',\n allCategories: 'All Categories',\n featuredApps: 'Featured Apps',\n popularApps: 'Popular Apps',\n recentlyUpdated: 'Recently Updated',\n freeApps: 'Free Apps',\n noResults: 'No products found',\n noResultsDescription: 'Try adjusting your search or filter to find what you are looking for.',\n clearSearch: 'Clear search',\n installNow: 'Install Now',\n viewDetails: 'View Details',\n free: 'Free',\n installed: 'Installed',\n },\n productDetail: {\n overview: 'Overview',\n reviews: 'Reviews',\n versions: 'Versions',\n installApp: 'Install App',\n installing: 'Installing...',\n installed: 'Installed',\n addToCart: 'Add to Cart',\n alreadyInCart: 'Already in Cart',\n buyNow: 'Buy Now',\n viewInstallation: 'View Installation',\n publisher: 'Publisher',\n category: 'Category',\n version: 'Version',\n updated: 'Updated',\n rating: 'Rating',\n reviews_count: '{{count}} reviews',\n noReviews: 'No reviews yet',\n beFirstToReview: 'Be the first to review this product.',\n writeReview: 'Write a Review',\n submitReview: 'Submit Review',\n yourRating: 'Your Rating',\n yourReview: 'Your Review (optional)',\n reviewPlaceholder: 'Share your experience with this product...',\n notFound: 'Product Not Found',\n notFoundDescription: 'The product you are looking for could not be found.',\n backToMarketplace: 'Back to Marketplace',\n },\n cart: {\n title: 'Shopping Cart',\n items: '{{count}} items',\n item: '{{count}} item',\n emptyTitle: 'Your cart is empty',\n emptyDescription:\n 'Looks like you have not added any apps or products to your cart yet. Start exploring the marketplace to find something you will love!',\n browseMarketplace: 'Browse Marketplace',\n cartItems: 'Cart Items ({{count}})',\n clearCart: 'Clear Cart',\n singleLicense: 'Single license',\n qty: 'Qty:',\n digital: 'Digital',\n physical: 'Physical',\n subscription: 'Subscription',\n orderSummary: 'Order Summary',\n subtotal: 'Subtotal',\n estimatedTaxes: 'Estimated taxes',\n calculatedAtCheckout: 'Calculated at checkout',\n totalPlusTaxes: 'Total (+ taxes)',\n proceedToCheckout: 'Proceed to Checkout',\n processing: 'Processing...',\n secureCheckout: 'Secure checkout powered by Stripe',\n weAccept: 'We accept:',\n continueShopping: 'Continue Shopping',\n failedToCreate: 'Failed to create order. Please try again.',\n checkoutError: 'An error occurred during checkout',\n },\n orders: {\n title: 'My Orders',\n subtitle: 'Track and manage your purchases',\n emptyTitle: 'No orders yet',\n emptyDescription: 'Your orders will appear here once you make a purchase.',\n shopNow: 'Shop Now',\n orderNumber: 'Order #{{number}}',\n orderDate: 'Ordered on {{date}}',\n items_count: '{{count}} item(s)',\n viewDetails: 'View Details',\n installApp: 'Install App',\n installed: 'Installed',\n failedToLoad: 'Failed to load orders',\n filterAll: 'All',\n reorder: 'Reorder',\n },\n orderConfirmation: {\n title: 'Order Confirmed!',\n subtitle: \"Thank you for your purchase. We'll send a confirmation to your email.\",\n orderNumber: 'Order Number',\n orderDate: 'Order Date',\n paymentStatus: 'Payment Status',\n orderStatus: 'Order Status',\n orderItems: 'Order Items',\n orderSummary: 'Order Summary',\n subtotal: 'Subtotal',\n tax: 'Tax',\n total: 'Total',\n whatHappensNext: \"What's Next?\",\n nextStep1: \"You'll receive a confirmation email with your order details.\",\n nextStep2: 'Your digital products will be available for installation immediately.',\n nextStep3: 'Physical products will be shipped within 3-5 business days.',\n viewOrders: 'View All Orders',\n continueShopping: 'Continue Shopping',\n installNow: 'Install Now',\n },\n installed: {\n title: 'Installed Apps',\n subtitle: 'Manage your installed applications',\n emptyTitle: 'No installed apps',\n emptyDescription: 'Install apps from the marketplace to manage them here.',\n browseMarketplace: 'Browse Marketplace',\n failedToLoad: 'Failed to load installations',\n filterAll: 'All',\n viewDetails: 'View Details',\n uninstall: 'Uninstall',\n settings: 'Settings',\n statusAll: 'All',\n installNew: 'Install New App',\n },\n appDetail: {\n title: 'App Details',\n version: 'Version',\n status: 'Status',\n installedAt: 'Installed At',\n uninstall: 'Uninstall',\n uninstalling: 'Uninstalling...',\n settings: 'Settings',\n openSettings: 'Open Settings',\n failedToLoad: 'Failed to load app details',\n notFound: 'App Not Found',\n notFoundDescription: 'The installation you are looking for could not be found.',\n },\n appSettings: {\n title: 'App Settings',\n saveSettings: 'Save Settings',\n saving: 'Saving...',\n settingsSaved: 'Settings saved successfully',\n failedToSave: 'Failed to save settings',\n noSettings: 'No configurable settings',\n noSettingsDescription: 'This app does not have any configurable settings.',\n },\n licenses: {\n title: 'My Licenses',\n subtitle: 'Review and manage your product entitlements',\n emptyTitle: 'No licenses yet',\n emptyDescription: 'Purchase apps from the marketplace to see your licenses here.',\n browseMarketplace: 'Browse Marketplace',\n failedToLoad: 'Failed to load licenses',\n productId: 'Product {{id}}',\n entitlementId: 'Entitlement ID: {{id}}',\n licenseKey: 'License key: {{key}}',\n expiresOn: 'Expires on {{date}}',\n },\n publisherDashboard: {\n title: 'Publisher Dashboard',\n subtitle: 'Manage your products and track performance',\n totalProducts: 'Total Products',\n totalRevenue: 'Total Revenue',\n totalInstalls: 'Total Installs',\n pendingReviews: 'Pending Reviews',\n recentSubmissions: 'Recent Submissions',\n quickActions: 'Quick Actions',\n submitNewProduct: 'Submit New Product',\n viewSubmissions: 'View Submissions',\n viewRevenue: 'View Revenue',\n noProducts: 'No products yet',\n notRegistered: 'Not a publisher yet',\n registerNow: 'Register as Publisher',\n failedToLoad: 'Failed to load dashboard',\n },\n publisherSubmit: {\n title: 'Submit Product',\n productIdLabel: 'Product ID',\n productIdPlaceholder: 'Enter product ID to submit for review',\n notesLabel: 'Notes (optional)',\n notesPlaceholder: 'Add any notes for the reviewer...',\n submitButton: 'Submit for Review',\n submitting: 'Submitting...',\n successTitle: 'Submission Successful',\n successDescription: 'Your product has been submitted for review.',\n viewSubmissions: 'View Submissions',\n submitAnother: 'Submit Another',\n },\n publisherSubmissions: {\n title: 'My Submissions',\n subtitle: 'Track the status of your product submissions',\n emptyTitle: 'No submissions yet',\n emptyDescription: 'Submit a product for review to see it here.',\n submitProduct: 'Submit a Product',\n failedToLoad: 'Failed to load submissions',\n submittedOn: 'Submitted on {{date}}',\n reviewedOn: 'Reviewed on {{date}}',\n reviewNotes: 'Review notes: {{notes}}',\n },\n publisherRevenue: {\n title: 'Revenue',\n subtitle: 'Track your earnings and payouts',\n totalEarnings: 'Total Earnings',\n pendingPayout: 'Pending Payout',\n lastPayout: 'Last Payout',\n revenueHistory: 'Revenue History',\n noRevenue: 'No revenue data yet',\n noRevenueDescription:\n 'Revenue data will appear here once your products start generating sales.',\n period: 'Period',\n amount: 'Amount',\n status: 'Status',\n },\n productReviews: {\n title: 'Product Reviews',\n subtitle: 'Manage reviews for your products',\n failedToLoad: 'Failed to load reviews',\n noReviews: 'No reviews yet',\n noReviewsDescription:\n 'Reviews will appear here once customers start reviewing your products.',\n rating: 'Rating',\n reviewer: 'Reviewer',\n date: 'Date',\n approve: 'Approve',\n reject: 'Reject',\n },\n search: {\n title: 'Search Results',\n resultsFor: 'Results for \"{{query}}\"',\n noResults: 'No results found',\n noResultsDescription: 'Try different keywords or browse the marketplace.',\n browseMarketplace: 'Browse Marketplace',\n resultCount: '{{count}} results',\n },\n stores: {\n title: 'Stores',\n subtitle: 'Browse available stores',\n emptyTitle: 'No stores found',\n emptyDescription: 'No stores are currently available.',\n failedToLoad: 'Failed to load stores',\n },\n category: {\n title: '{{name}}',\n noProducts: 'No products in this category',\n noProductsDescription: 'Check back later for new products in this category.',\n browseAll: 'Browse All Products',\n },\n },\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-store",
3
- "version": "2026.805.1",
3
+ "version": "2026.819.1",
4
4
  "description": "Store microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [