@burdenoff/microfe-store 2026.510.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +217 -0
- package/dist/StoreAdminRoot.d.ts +22 -0
- package/dist/StoreAdminRoot.js +23 -0
- package/dist/StoreAdminRoot.js.map +1 -0
- package/dist/StoreAdminRoutes.d.ts +9 -0
- package/dist/StoreAdminRoutes.js +69 -0
- package/dist/StoreAdminRoutes.js.map +1 -0
- package/dist/StoreRoot.d.ts +31 -0
- package/dist/StoreRoot.js +139 -0
- package/dist/StoreRoot.js.map +1 -0
- package/dist/StoreRoutes.d.ts +12 -0
- package/dist/StoreRoutes.js +285 -0
- package/dist/StoreRoutes.js.map +1 -0
- package/dist/components/InstallAppModal.d.ts +26 -0
- package/dist/components/InstallAppModal.js +287 -0
- package/dist/components/InstallAppModal.js.map +1 -0
- package/dist/components/RouteGuards.d.ts +17 -0
- package/dist/components/RouteGuards.js +26 -0
- package/dist/components/RouteGuards.js.map +1 -0
- package/dist/components/cart/CartDrawer.d.ts +35 -0
- package/dist/components/cart/CartDrawer.js +162 -0
- package/dist/components/cart/CartDrawer.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.js +3 -0
- package/dist/components/marketplace/ProductCard.d.ts +18 -0
- package/dist/components/marketplace/ProductCard.js +2 -0
- package/dist/dev/main.d.ts +1 -0
- package/dist/generated/global-operations.d.ts +2012 -0
- package/dist/generated/global-operations.js +1444 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20856 -0
- package/dist/generated/global-types.js +14 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +1 -0
- package/dist/generated/wspace-types.d.ts +53362 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/useBackendCart.d.ts +73 -0
- package/dist/hooks/useBackendCart.js +171 -0
- package/dist/hooks/useBackendCart.js.map +1 -0
- package/dist/hooks/useCart.d.ts +62 -0
- package/dist/hooks/useCart.js +90 -0
- package/dist/hooks/useCart.js.map +1 -0
- package/dist/hooks/useInstallations.d.ts +43 -0
- package/dist/hooks/useInstallations.js +140 -0
- package/dist/hooks/useInstallations.js.map +1 -0
- package/dist/hooks/useOrders.d.ts +40 -0
- package/dist/hooks/useOrders.js +73 -0
- package/dist/hooks/useOrders.js.map +1 -0
- package/dist/hooks/useProductSearch.d.ts +22 -0
- package/dist/hooks/useProductSearch.js +59 -0
- package/dist/hooks/useProductSearch.js.map +1 -0
- package/dist/hooks/useStoreGraphQL.d.ts +475 -0
- package/dist/hooks/useStoreGraphQL.js +751 -0
- package/dist/hooks/useStoreGraphQL.js.map +1 -0
- package/dist/hooks/useStoreGraphQLWithContext.d.ts +48 -0
- package/dist/hooks/useStoreGraphQLWithContext.js +39 -0
- package/dist/hooks/useStoreGraphQLWithContext.js.map +1 -0
- package/dist/hooks/useStorePermissions.d.ts +63 -0
- package/dist/hooks/useStorePermissions.js +88 -0
- package/dist/hooks/useStorePermissions.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +13 -0
- package/dist/pages/AdminDashboardPage.d.ts +3 -0
- package/dist/pages/AdminDashboardPage.js +491 -0
- package/dist/pages/AdminDashboardPage.js.map +1 -0
- package/dist/pages/AdminReviewModerationPage.d.ts +3 -0
- package/dist/pages/AdminReviewModerationPage.js +247 -0
- package/dist/pages/AdminReviewModerationPage.js.map +1 -0
- package/dist/pages/AdminStoresPage.d.ts +3 -0
- package/dist/pages/AdminStoresPage.js +442 -0
- package/dist/pages/AdminStoresPage.js.map +1 -0
- package/dist/pages/AdminSubmissionsQueuePage.d.ts +3 -0
- package/dist/pages/AdminSubmissionsQueuePage.js +387 -0
- package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -0
- package/dist/pages/AppDetailPage.d.ts +3 -0
- package/dist/pages/AppDetailPage.js +166 -0
- package/dist/pages/AppDetailPage.js.map +1 -0
- package/dist/pages/AppSettingsPage.d.ts +3 -0
- package/dist/pages/AppSettingsPage.js +100 -0
- package/dist/pages/AppSettingsPage.js.map +1 -0
- package/dist/pages/CartPage.d.ts +8 -0
- package/dist/pages/CartPage.js +259 -0
- package/dist/pages/CartPage.js.map +1 -0
- package/dist/pages/InstalledAppsPage.d.ts +8 -0
- package/dist/pages/InstalledAppsPage.js +290 -0
- package/dist/pages/InstalledAppsPage.js.map +1 -0
- package/dist/pages/MarketplaceHomePage.d.ts +3 -0
- package/dist/pages/MarketplaceHomePage.js +1118 -0
- package/dist/pages/MarketplaceHomePage.js.map +1 -0
- package/dist/pages/MyLicensesPage.d.ts +3 -0
- package/dist/pages/MyLicensesPage.js +146 -0
- package/dist/pages/MyLicensesPage.js.map +1 -0
- package/dist/pages/OrderConfirmationPage.d.ts +3 -0
- package/dist/pages/OrderConfirmationPage.js +178 -0
- package/dist/pages/OrderConfirmationPage.js.map +1 -0
- package/dist/pages/OrdersPage.d.ts +8 -0
- package/dist/pages/OrdersPage.js +358 -0
- package/dist/pages/OrdersPage.js.map +1 -0
- package/dist/pages/ProductCategoryPage.d.ts +3 -0
- package/dist/pages/ProductCategoryPage.js +83 -0
- package/dist/pages/ProductCategoryPage.js.map +1 -0
- package/dist/pages/ProductDetailPage.d.ts +8 -0
- package/dist/pages/ProductDetailPage.js +1205 -0
- package/dist/pages/ProductDetailPage.js.map +1 -0
- package/dist/pages/ProductReviewsPage.d.ts +3 -0
- package/dist/pages/ProductReviewsPage.js +86 -0
- package/dist/pages/ProductReviewsPage.js.map +1 -0
- package/dist/pages/PublisherDashboardPage.d.ts +3 -0
- package/dist/pages/PublisherDashboardPage.js +154 -0
- package/dist/pages/PublisherDashboardPage.js.map +1 -0
- package/dist/pages/PublisherRevenuePage.d.ts +3 -0
- package/dist/pages/PublisherRevenuePage.js +138 -0
- package/dist/pages/PublisherRevenuePage.js.map +1 -0
- package/dist/pages/PublisherSubmissionsPage.d.ts +3 -0
- package/dist/pages/PublisherSubmissionsPage.js +174 -0
- package/dist/pages/PublisherSubmissionsPage.js.map +1 -0
- package/dist/pages/PublisherSubmitPage.d.ts +3 -0
- package/dist/pages/PublisherSubmitPage.js +224 -0
- package/dist/pages/PublisherSubmitPage.js.map +1 -0
- package/dist/pages/SearchResultsPage.d.ts +3 -0
- package/dist/pages/SearchResultsPage.js +125 -0
- package/dist/pages/SearchResultsPage.js.map +1 -0
- package/dist/pages/StoresPage.d.ts +3 -0
- package/dist/pages/StoresPage.js +154 -0
- package/dist/pages/StoresPage.js.map +1 -0
- package/dist/providers/StoreProvider.d.ts +38 -0
- package/dist/providers/StoreProvider.js +51 -0
- package/dist/providers/StoreProvider.js.map +1 -0
- package/dist/store/storeStore.d.ts +69 -0
- package/dist/store/storeStore.js +68 -0
- package/dist/store/storeStore.js.map +1 -0
- package/dist/translations/en.d.ts +518 -0
- package/dist/translations/en.js +514 -0
- package/dist/translations/en.js.map +1 -0
- package/dist/types/index.d.ts +575 -0
- package/dist/utils/index.d.ts +67 -0
- package/dist/utils/index.js +114 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/nativeBridge.d.ts +2 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +105 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
+
import { useEffect as t, useState as n } from "react";
|
|
3
|
+
import { ArrowLeft as r, Pencil as i, Plus as a, RefreshCw as o, Store as s, Trash2 as c } from "lucide-react";
|
|
4
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
|
+
import { useNavigate as d } from "react-router-dom";
|
|
6
|
+
import { graphqlFetch as f } from "@burdenoff/fe-libs/shared/graphql";
|
|
7
|
+
//#region src/pages/AdminStoresPage.tsx
|
|
8
|
+
var p = "\n query AdminStores {\n stores {\n id\n slug\n name\n type\n tenantId\n isPublic\n requiresApproval\n allowUnverifiedPublishers\n currency\n logoUrl\n description\n createdAt\n }\n }\n", m = "\n mutation CreateStore($input: CreateStoreInput!) {\n createStore(input: $input) {\n id\n slug\n name\n type\n }\n }\n", h = "\n mutation UpdateStore($id: ID!, $input: UpdateStoreInput!) {\n updateStore(id: $id, input: $input) {\n id\n name\n isPublic\n requiresApproval\n }\n }\n", g = "\n mutation DeleteStore($id: ID!) {\n deleteStore(id: $id)\n }\n", _ = {
|
|
9
|
+
slug: "",
|
|
10
|
+
name: "",
|
|
11
|
+
type: "PRIVATE",
|
|
12
|
+
tenantId: "",
|
|
13
|
+
isPublic: !1,
|
|
14
|
+
requiresApproval: !1,
|
|
15
|
+
allowUnverifiedPublishers: !0,
|
|
16
|
+
currency: "USD",
|
|
17
|
+
description: ""
|
|
18
|
+
}, v = () => {
|
|
19
|
+
let v = d(), { authToken: y, basePath: b } = e(), [x, S] = n([]), [C, w] = n(!1), [T, E] = n(null), [D, O] = n(!1), [k, A] = n(_), [j, M] = n(null), N = async () => {
|
|
20
|
+
w(!0), E(null);
|
|
21
|
+
try {
|
|
22
|
+
let e = await f({
|
|
23
|
+
gateway: "global",
|
|
24
|
+
query: p,
|
|
25
|
+
authToken: y || void 0
|
|
26
|
+
});
|
|
27
|
+
if (e.errors?.length) throw Error(e.errors[0]?.message ?? "Failed to load stores");
|
|
28
|
+
S(e.data?.stores ?? []);
|
|
29
|
+
} catch (e) {
|
|
30
|
+
E(e instanceof Error ? e.message : "Failed to load stores");
|
|
31
|
+
} finally {
|
|
32
|
+
w(!1);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
t(() => {
|
|
36
|
+
N();
|
|
37
|
+
}, []);
|
|
38
|
+
let P = () => {
|
|
39
|
+
M(null), A(_), O(!0);
|
|
40
|
+
}, F = (e) => {
|
|
41
|
+
M(e.id), A({
|
|
42
|
+
slug: e.slug,
|
|
43
|
+
name: e.name,
|
|
44
|
+
type: e.type,
|
|
45
|
+
tenantId: e.tenantId ?? "",
|
|
46
|
+
isPublic: e.isPublic,
|
|
47
|
+
requiresApproval: e.requiresApproval,
|
|
48
|
+
allowUnverifiedPublishers: e.allowUnverifiedPublishers,
|
|
49
|
+
currency: e.currency,
|
|
50
|
+
description: e.description ?? ""
|
|
51
|
+
}), O(!0);
|
|
52
|
+
}, I = async () => {
|
|
53
|
+
if (!k.slug.trim() || !k.name.trim()) {
|
|
54
|
+
E("Slug and name are required");
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
E(null);
|
|
58
|
+
try {
|
|
59
|
+
j ? await f({
|
|
60
|
+
gateway: "global",
|
|
61
|
+
query: h,
|
|
62
|
+
variables: {
|
|
63
|
+
id: j,
|
|
64
|
+
input: {
|
|
65
|
+
name: k.name,
|
|
66
|
+
isPublic: k.isPublic,
|
|
67
|
+
requiresApproval: k.requiresApproval,
|
|
68
|
+
allowUnverifiedPublishers: k.allowUnverifiedPublishers,
|
|
69
|
+
currency: k.currency,
|
|
70
|
+
description: k.description || null
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
authToken: y || void 0
|
|
74
|
+
}) : await f({
|
|
75
|
+
gateway: "global",
|
|
76
|
+
query: m,
|
|
77
|
+
variables: { input: {
|
|
78
|
+
slug: k.slug,
|
|
79
|
+
name: k.name,
|
|
80
|
+
type: k.type,
|
|
81
|
+
tenantId: k.tenantId || null,
|
|
82
|
+
isPublic: k.isPublic,
|
|
83
|
+
requiresApproval: k.requiresApproval,
|
|
84
|
+
allowUnverifiedPublishers: k.allowUnverifiedPublishers,
|
|
85
|
+
currency: k.currency,
|
|
86
|
+
description: k.description || null
|
|
87
|
+
} },
|
|
88
|
+
authToken: y || void 0
|
|
89
|
+
}), O(!1), M(null), A(_), await N();
|
|
90
|
+
} catch (e) {
|
|
91
|
+
E(e instanceof Error ? e.message : "Save failed");
|
|
92
|
+
}
|
|
93
|
+
}, L = async (e) => {
|
|
94
|
+
if (confirm("Delete this store? This is a soft delete.")) try {
|
|
95
|
+
await f({
|
|
96
|
+
gateway: "global",
|
|
97
|
+
query: g,
|
|
98
|
+
variables: { id: e },
|
|
99
|
+
authToken: y || void 0
|
|
100
|
+
}), await N();
|
|
101
|
+
} catch (e) {
|
|
102
|
+
E(e instanceof Error ? e.message : "Delete failed");
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
return /* @__PURE__ */ u("div", {
|
|
106
|
+
className: "min-h-screen bg-surface-default",
|
|
107
|
+
children: [/* @__PURE__ */ l("header", {
|
|
108
|
+
className: "border-b border-border-default bg-surface-raised",
|
|
109
|
+
children: /* @__PURE__ */ l("div", {
|
|
110
|
+
className: "mx-auto max-w-7xl px-6 py-4",
|
|
111
|
+
children: /* @__PURE__ */ u("div", {
|
|
112
|
+
className: "flex items-center justify-between",
|
|
113
|
+
children: [/* @__PURE__ */ u("div", {
|
|
114
|
+
className: "flex items-center gap-3",
|
|
115
|
+
children: [/* @__PURE__ */ u("button", {
|
|
116
|
+
type: "button",
|
|
117
|
+
onClick: () => v(`${b}/dashboard`),
|
|
118
|
+
className: "inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-sm text-text-secondary hover:bg-surface-hover hover:text-text-primary",
|
|
119
|
+
children: [/* @__PURE__ */ l(r, { className: "h-4 w-4" }), "Back"]
|
|
120
|
+
}), /* @__PURE__ */ u("div", {
|
|
121
|
+
className: "flex items-center gap-2",
|
|
122
|
+
children: [
|
|
123
|
+
/* @__PURE__ */ l(s, { className: "h-5 w-5 text-text-primary" }),
|
|
124
|
+
/* @__PURE__ */ l("h1", {
|
|
125
|
+
className: "text-xl font-semibold text-text-primary",
|
|
126
|
+
children: "Store registry"
|
|
127
|
+
}),
|
|
128
|
+
/* @__PURE__ */ l("span", {
|
|
129
|
+
className: "rounded-full bg-surface-accent-muted px-2 py-0.5 text-xs font-medium text-text-accent",
|
|
130
|
+
children: x.length
|
|
131
|
+
})
|
|
132
|
+
]
|
|
133
|
+
})]
|
|
134
|
+
}), /* @__PURE__ */ u("div", {
|
|
135
|
+
className: "flex gap-2",
|
|
136
|
+
children: [/* @__PURE__ */ u("button", {
|
|
137
|
+
type: "button",
|
|
138
|
+
onClick: () => void N(),
|
|
139
|
+
className: "inline-flex items-center gap-2 rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary hover:bg-surface-hover",
|
|
140
|
+
disabled: C,
|
|
141
|
+
children: [/* @__PURE__ */ l(o, { className: `h-4 w-4 ${C ? "animate-spin" : ""}` }), "Refresh"]
|
|
142
|
+
}), /* @__PURE__ */ u("button", {
|
|
143
|
+
type: "button",
|
|
144
|
+
onClick: P,
|
|
145
|
+
className: "inline-flex items-center gap-2 rounded-md bg-surface-accent px-3 py-1.5 text-sm font-medium text-text-on-accent hover:bg-surface-accent-hover",
|
|
146
|
+
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4" }), "Create store"]
|
|
147
|
+
})]
|
|
148
|
+
})]
|
|
149
|
+
})
|
|
150
|
+
})
|
|
151
|
+
}), /* @__PURE__ */ u("main", {
|
|
152
|
+
className: "mx-auto max-w-7xl px-6 py-6",
|
|
153
|
+
children: [
|
|
154
|
+
T && /* @__PURE__ */ l("div", {
|
|
155
|
+
role: "alert",
|
|
156
|
+
className: "mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger",
|
|
157
|
+
children: T
|
|
158
|
+
}),
|
|
159
|
+
D && /* @__PURE__ */ u("div", {
|
|
160
|
+
className: "mb-6 rounded-lg border border-border-default bg-surface-raised p-4",
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ l("h2", {
|
|
163
|
+
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
164
|
+
children: j ? "Edit store" : "Create store"
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ u("div", {
|
|
167
|
+
className: "grid grid-cols-1 gap-3 md:grid-cols-2",
|
|
168
|
+
children: [
|
|
169
|
+
/* @__PURE__ */ u("label", {
|
|
170
|
+
className: "block",
|
|
171
|
+
children: [/* @__PURE__ */ l("span", {
|
|
172
|
+
className: "text-xs text-text-secondary",
|
|
173
|
+
children: "Slug"
|
|
174
|
+
}), /* @__PURE__ */ l("input", {
|
|
175
|
+
type: "text",
|
|
176
|
+
value: k.slug,
|
|
177
|
+
onChange: (e) => A({
|
|
178
|
+
...k,
|
|
179
|
+
slug: e.target.value
|
|
180
|
+
}),
|
|
181
|
+
disabled: !!j,
|
|
182
|
+
required: !0,
|
|
183
|
+
"aria-required": "true",
|
|
184
|
+
className: "mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary disabled:opacity-60"
|
|
185
|
+
})]
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ u("label", {
|
|
188
|
+
className: "block",
|
|
189
|
+
children: [/* @__PURE__ */ l("span", {
|
|
190
|
+
className: "text-xs text-text-secondary",
|
|
191
|
+
children: "Name"
|
|
192
|
+
}), /* @__PURE__ */ l("input", {
|
|
193
|
+
type: "text",
|
|
194
|
+
value: k.name,
|
|
195
|
+
onChange: (e) => A({
|
|
196
|
+
...k,
|
|
197
|
+
name: e.target.value
|
|
198
|
+
}),
|
|
199
|
+
required: !0,
|
|
200
|
+
"aria-required": "true",
|
|
201
|
+
className: "mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary"
|
|
202
|
+
})]
|
|
203
|
+
}),
|
|
204
|
+
/* @__PURE__ */ u("label", {
|
|
205
|
+
className: "block",
|
|
206
|
+
children: [/* @__PURE__ */ l("span", {
|
|
207
|
+
className: "text-xs text-text-secondary",
|
|
208
|
+
children: "Type"
|
|
209
|
+
}), /* @__PURE__ */ u("select", {
|
|
210
|
+
value: k.type,
|
|
211
|
+
onChange: (e) => A({
|
|
212
|
+
...k,
|
|
213
|
+
type: e.target.value
|
|
214
|
+
}),
|
|
215
|
+
disabled: !!j,
|
|
216
|
+
className: "mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary disabled:opacity-60",
|
|
217
|
+
children: [
|
|
218
|
+
/* @__PURE__ */ l("option", {
|
|
219
|
+
value: "PUBLIC",
|
|
220
|
+
children: "Public"
|
|
221
|
+
}),
|
|
222
|
+
/* @__PURE__ */ l("option", {
|
|
223
|
+
value: "PRIVATE",
|
|
224
|
+
children: "Private (opt-in)"
|
|
225
|
+
}),
|
|
226
|
+
/* @__PURE__ */ l("option", {
|
|
227
|
+
value: "ENTERPRISE",
|
|
228
|
+
children: "Enterprise (tenant-scoped)"
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
})]
|
|
232
|
+
}),
|
|
233
|
+
/* @__PURE__ */ u("label", {
|
|
234
|
+
className: "block",
|
|
235
|
+
children: [/* @__PURE__ */ l("span", {
|
|
236
|
+
className: "text-xs text-text-secondary",
|
|
237
|
+
children: "Currency"
|
|
238
|
+
}), /* @__PURE__ */ l("input", {
|
|
239
|
+
type: "text",
|
|
240
|
+
value: k.currency,
|
|
241
|
+
onChange: (e) => A({
|
|
242
|
+
...k,
|
|
243
|
+
currency: e.target.value
|
|
244
|
+
}),
|
|
245
|
+
className: "mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary"
|
|
246
|
+
})]
|
|
247
|
+
}),
|
|
248
|
+
k.type !== "PUBLIC" && /* @__PURE__ */ u("label", {
|
|
249
|
+
className: "block md:col-span-2",
|
|
250
|
+
children: [/* @__PURE__ */ l("span", {
|
|
251
|
+
className: "text-xs text-text-secondary",
|
|
252
|
+
children: "Tenant ID (optional)"
|
|
253
|
+
}), /* @__PURE__ */ l("input", {
|
|
254
|
+
type: "text",
|
|
255
|
+
value: k.tenantId,
|
|
256
|
+
onChange: (e) => A({
|
|
257
|
+
...k,
|
|
258
|
+
tenantId: e.target.value
|
|
259
|
+
}),
|
|
260
|
+
disabled: !!j,
|
|
261
|
+
className: "mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary disabled:opacity-60"
|
|
262
|
+
})]
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ u("label", {
|
|
265
|
+
className: "block md:col-span-2",
|
|
266
|
+
children: [/* @__PURE__ */ l("span", {
|
|
267
|
+
className: "text-xs text-text-secondary",
|
|
268
|
+
children: "Description"
|
|
269
|
+
}), /* @__PURE__ */ l("textarea", {
|
|
270
|
+
value: k.description,
|
|
271
|
+
onChange: (e) => A({
|
|
272
|
+
...k,
|
|
273
|
+
description: e.target.value
|
|
274
|
+
}),
|
|
275
|
+
rows: 2,
|
|
276
|
+
className: "mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary"
|
|
277
|
+
})]
|
|
278
|
+
}),
|
|
279
|
+
/* @__PURE__ */ u("label", {
|
|
280
|
+
className: "flex items-center gap-2",
|
|
281
|
+
children: [/* @__PURE__ */ l("input", {
|
|
282
|
+
type: "checkbox",
|
|
283
|
+
checked: k.isPublic,
|
|
284
|
+
onChange: (e) => A({
|
|
285
|
+
...k,
|
|
286
|
+
isPublic: e.target.checked
|
|
287
|
+
})
|
|
288
|
+
}), /* @__PURE__ */ l("span", {
|
|
289
|
+
className: "text-sm text-text-primary",
|
|
290
|
+
children: "Publicly visible"
|
|
291
|
+
})]
|
|
292
|
+
}),
|
|
293
|
+
/* @__PURE__ */ u("label", {
|
|
294
|
+
className: "flex items-center gap-2",
|
|
295
|
+
children: [/* @__PURE__ */ l("input", {
|
|
296
|
+
type: "checkbox",
|
|
297
|
+
checked: k.requiresApproval,
|
|
298
|
+
onChange: (e) => A({
|
|
299
|
+
...k,
|
|
300
|
+
requiresApproval: e.target.checked
|
|
301
|
+
})
|
|
302
|
+
}), /* @__PURE__ */ l("span", {
|
|
303
|
+
className: "text-sm text-text-primary",
|
|
304
|
+
children: "Requires admin approval"
|
|
305
|
+
})]
|
|
306
|
+
}),
|
|
307
|
+
/* @__PURE__ */ u("label", {
|
|
308
|
+
className: "flex items-center gap-2 md:col-span-2",
|
|
309
|
+
children: [/* @__PURE__ */ l("input", {
|
|
310
|
+
type: "checkbox",
|
|
311
|
+
checked: k.allowUnverifiedPublishers,
|
|
312
|
+
onChange: (e) => A({
|
|
313
|
+
...k,
|
|
314
|
+
allowUnverifiedPublishers: e.target.checked
|
|
315
|
+
})
|
|
316
|
+
}), /* @__PURE__ */ l("span", {
|
|
317
|
+
className: "text-sm text-text-primary",
|
|
318
|
+
children: "Allow unverified publishers to submit"
|
|
319
|
+
})]
|
|
320
|
+
})
|
|
321
|
+
]
|
|
322
|
+
}),
|
|
323
|
+
/* @__PURE__ */ u("div", {
|
|
324
|
+
className: "mt-4 flex justify-end gap-2",
|
|
325
|
+
children: [/* @__PURE__ */ l("button", {
|
|
326
|
+
type: "button",
|
|
327
|
+
onClick: () => {
|
|
328
|
+
O(!1), M(null), A(_);
|
|
329
|
+
},
|
|
330
|
+
className: "rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary hover:bg-surface-hover",
|
|
331
|
+
children: "Cancel"
|
|
332
|
+
}), /* @__PURE__ */ l("button", {
|
|
333
|
+
type: "button",
|
|
334
|
+
onClick: () => void I(),
|
|
335
|
+
className: "rounded-md bg-surface-accent px-3 py-1.5 text-sm font-medium text-text-on-accent hover:bg-surface-accent-hover",
|
|
336
|
+
children: j ? "Save changes" : "Create"
|
|
337
|
+
})]
|
|
338
|
+
})
|
|
339
|
+
]
|
|
340
|
+
}),
|
|
341
|
+
C && x.length === 0 ? /* @__PURE__ */ l("div", {
|
|
342
|
+
role: "status",
|
|
343
|
+
className: "py-16 text-center text-text-secondary",
|
|
344
|
+
children: "Loading stores…"
|
|
345
|
+
}) : x.length === 0 ? /* @__PURE__ */ l("div", {
|
|
346
|
+
className: "py-16 text-center text-text-secondary",
|
|
347
|
+
children: "No stores yet."
|
|
348
|
+
}) : /* @__PURE__ */ l("div", {
|
|
349
|
+
className: "overflow-hidden rounded-lg border border-border-default",
|
|
350
|
+
children: /* @__PURE__ */ u("table", {
|
|
351
|
+
className: "w-full text-sm",
|
|
352
|
+
children: [/* @__PURE__ */ l("thead", {
|
|
353
|
+
className: "bg-surface-muted text-left text-xs uppercase tracking-wide text-text-secondary",
|
|
354
|
+
children: /* @__PURE__ */ u("tr", { children: [
|
|
355
|
+
/* @__PURE__ */ l("th", {
|
|
356
|
+
className: "px-4 py-2",
|
|
357
|
+
children: "Slug"
|
|
358
|
+
}),
|
|
359
|
+
/* @__PURE__ */ l("th", {
|
|
360
|
+
className: "px-4 py-2",
|
|
361
|
+
children: "Name"
|
|
362
|
+
}),
|
|
363
|
+
/* @__PURE__ */ l("th", {
|
|
364
|
+
className: "px-4 py-2",
|
|
365
|
+
children: "Type"
|
|
366
|
+
}),
|
|
367
|
+
/* @__PURE__ */ l("th", {
|
|
368
|
+
className: "px-4 py-2",
|
|
369
|
+
children: "Public"
|
|
370
|
+
}),
|
|
371
|
+
/* @__PURE__ */ l("th", {
|
|
372
|
+
className: "px-4 py-2",
|
|
373
|
+
children: "Approval"
|
|
374
|
+
}),
|
|
375
|
+
/* @__PURE__ */ l("th", {
|
|
376
|
+
className: "px-4 py-2",
|
|
377
|
+
children: "Currency"
|
|
378
|
+
}),
|
|
379
|
+
/* @__PURE__ */ l("th", {
|
|
380
|
+
className: "px-4 py-2 text-right",
|
|
381
|
+
children: "Actions"
|
|
382
|
+
})
|
|
383
|
+
] })
|
|
384
|
+
}), /* @__PURE__ */ l("tbody", {
|
|
385
|
+
className: "divide-y divide-border-default bg-surface-raised",
|
|
386
|
+
children: x.map((e) => /* @__PURE__ */ u("tr", {
|
|
387
|
+
className: "text-text-primary",
|
|
388
|
+
children: [
|
|
389
|
+
/* @__PURE__ */ l("td", {
|
|
390
|
+
className: "px-4 py-2 font-mono text-xs",
|
|
391
|
+
children: e.slug
|
|
392
|
+
}),
|
|
393
|
+
/* @__PURE__ */ l("td", {
|
|
394
|
+
className: "px-4 py-2",
|
|
395
|
+
children: e.name
|
|
396
|
+
}),
|
|
397
|
+
/* @__PURE__ */ l("td", {
|
|
398
|
+
className: "px-4 py-2",
|
|
399
|
+
children: /* @__PURE__ */ l("span", {
|
|
400
|
+
className: "rounded-full bg-surface-accent-muted px-2 py-0.5 text-xs font-medium text-text-accent",
|
|
401
|
+
children: e.type
|
|
402
|
+
})
|
|
403
|
+
}),
|
|
404
|
+
/* @__PURE__ */ l("td", {
|
|
405
|
+
className: "px-4 py-2 text-xs",
|
|
406
|
+
children: e.isPublic ? "Yes" : "No"
|
|
407
|
+
}),
|
|
408
|
+
/* @__PURE__ */ l("td", {
|
|
409
|
+
className: "px-4 py-2 text-xs",
|
|
410
|
+
children: e.requiresApproval ? "Required" : "Auto-publish"
|
|
411
|
+
}),
|
|
412
|
+
/* @__PURE__ */ l("td", {
|
|
413
|
+
className: "px-4 py-2 text-xs",
|
|
414
|
+
children: e.currency
|
|
415
|
+
}),
|
|
416
|
+
/* @__PURE__ */ u("td", {
|
|
417
|
+
className: "px-4 py-2 text-right",
|
|
418
|
+
children: [/* @__PURE__ */ u("button", {
|
|
419
|
+
type: "button",
|
|
420
|
+
onClick: () => F(e),
|
|
421
|
+
className: "inline-flex items-center gap-1 rounded-md border border-border-default px-2 py-1 text-xs text-text-primary hover:bg-surface-hover",
|
|
422
|
+
children: [/* @__PURE__ */ l(i, { className: "h-3 w-3" }), "Edit"]
|
|
423
|
+
}), e.id !== "store_public_default" && /* @__PURE__ */ u("button", {
|
|
424
|
+
type: "button",
|
|
425
|
+
onClick: () => void L(e.id),
|
|
426
|
+
className: "ml-2 inline-flex items-center gap-1 rounded-md border border-border-danger px-2 py-1 text-xs text-text-danger hover:bg-surface-danger-muted",
|
|
427
|
+
children: [/* @__PURE__ */ l(c, { className: "h-3 w-3" }), "Delete"]
|
|
428
|
+
})]
|
|
429
|
+
})
|
|
430
|
+
]
|
|
431
|
+
}, e.id))
|
|
432
|
+
})]
|
|
433
|
+
})
|
|
434
|
+
})
|
|
435
|
+
]
|
|
436
|
+
})]
|
|
437
|
+
});
|
|
438
|
+
};
|
|
439
|
+
//#endregion
|
|
440
|
+
export { v as AdminStoresPage };
|
|
441
|
+
|
|
442
|
+
//# sourceMappingURL=AdminStoresPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminStoresPage.js","names":[],"sources":["../../src/pages/AdminStoresPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect, useState } from 'react';\nimport { ArrowLeft, Plus, Pencil, Trash2, RefreshCw, Store as StoreIcon } from 'lucide-react';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { useNavigate } from 'react-router-dom';\nimport { useStore } from '../providers/StoreProvider';\n\ntype StoreRecord = {\n id: string;\n slug: string;\n name: string;\n type: 'PUBLIC' | 'PRIVATE' | 'ENTERPRISE';\n tenantId?: string | null;\n isPublic: boolean;\n requiresApproval: boolean;\n allowUnverifiedPublishers: boolean;\n currency: string;\n logoUrl?: string | null;\n description?: string | null;\n createdAt: string;\n};\n\nconst STORES_QUERY = /* GraphQL */ `\n query AdminStores {\n stores {\n id\n slug\n name\n type\n tenantId\n isPublic\n requiresApproval\n allowUnverifiedPublishers\n currency\n logoUrl\n description\n createdAt\n }\n }\n`;\n\nconst CREATE_STORE_MUTATION = /* GraphQL */ `\n mutation CreateStore($input: CreateStoreInput!) {\n createStore(input: $input) {\n id\n slug\n name\n type\n }\n }\n`;\n\nconst UPDATE_STORE_MUTATION = /* GraphQL */ `\n mutation UpdateStore($id: ID!, $input: UpdateStoreInput!) {\n updateStore(id: $id, input: $input) {\n id\n name\n isPublic\n requiresApproval\n }\n }\n`;\n\nconst DELETE_STORE_MUTATION = /* GraphQL */ `\n mutation DeleteStore($id: ID!) {\n deleteStore(id: $id)\n }\n`;\n\ntype FormState = {\n slug: string;\n name: string;\n type: StoreRecord['type'];\n tenantId: string;\n isPublic: boolean;\n requiresApproval: boolean;\n allowUnverifiedPublishers: boolean;\n currency: string;\n description: string;\n};\n\nconst emptyForm: FormState = {\n slug: '',\n name: '',\n type: 'PRIVATE',\n tenantId: '',\n isPublic: false,\n requiresApproval: false,\n allowUnverifiedPublishers: true,\n currency: 'USD',\n description: '',\n};\n\nexport const AdminStoresPage: FC = () => {\n const navigate = useNavigate();\n const { authToken, basePath } = useStore();\n const [stores, setStores] = useState<StoreRecord[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [showForm, setShowForm] = useState(false);\n const [form, setForm] = useState<FormState>(emptyForm);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await graphqlFetch<{ stores: StoreRecord[] }>({\n gateway: 'global',\n query: STORES_QUERY,\n authToken: authToken || undefined,\n });\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message ?? 'Failed to load stores');\n }\n setStores(result.data?.stores ?? []);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load stores');\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void load();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const openCreate = () => {\n setEditingId(null);\n setForm(emptyForm);\n setShowForm(true);\n };\n\n const openEdit = (s: StoreRecord) => {\n setEditingId(s.id);\n setForm({\n slug: s.slug,\n name: s.name,\n type: s.type,\n tenantId: s.tenantId ?? '',\n isPublic: s.isPublic,\n requiresApproval: s.requiresApproval,\n allowUnverifiedPublishers: s.allowUnverifiedPublishers,\n currency: s.currency,\n description: s.description ?? '',\n });\n setShowForm(true);\n };\n\n const submit = async () => {\n if (!form.slug.trim() || !form.name.trim()) {\n setError('Slug and name are required');\n return;\n }\n setError(null);\n try {\n if (editingId) {\n await graphqlFetch({\n gateway: 'global',\n query: UPDATE_STORE_MUTATION,\n variables: {\n id: editingId,\n input: {\n name: form.name,\n isPublic: form.isPublic,\n requiresApproval: form.requiresApproval,\n allowUnverifiedPublishers: form.allowUnverifiedPublishers,\n currency: form.currency,\n description: form.description || null,\n },\n },\n authToken: authToken || undefined,\n });\n } else {\n await graphqlFetch({\n gateway: 'global',\n query: CREATE_STORE_MUTATION,\n variables: {\n input: {\n slug: form.slug,\n name: form.name,\n type: form.type,\n tenantId: form.tenantId || null,\n isPublic: form.isPublic,\n requiresApproval: form.requiresApproval,\n allowUnverifiedPublishers: form.allowUnverifiedPublishers,\n currency: form.currency,\n description: form.description || null,\n },\n },\n authToken: authToken || undefined,\n });\n }\n setShowForm(false);\n setEditingId(null);\n setForm(emptyForm);\n await load();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Save failed');\n }\n };\n\n const remove = async (id: string) => {\n if (!confirm('Delete this store? This is a soft delete.')) return;\n try {\n await graphqlFetch({\n gateway: 'global',\n query: DELETE_STORE_MUTATION,\n variables: { id },\n authToken: authToken || undefined,\n });\n await load();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Delete failed');\n }\n };\n\n return (\n <div className=\"min-h-screen bg-surface-default\">\n <header className=\"border-b border-border-default bg-surface-raised\">\n <div className=\"mx-auto max-w-7xl px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/dashboard`)}\n className=\"inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-sm text-text-secondary hover:bg-surface-hover hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n <div className=\"flex items-center gap-2\">\n <StoreIcon className=\"h-5 w-5 text-text-primary\" />\n <h1 className=\"text-xl font-semibold text-text-primary\">Store registry</h1>\n <span className=\"rounded-full bg-surface-accent-muted px-2 py-0.5 text-xs font-medium text-text-accent\">\n {stores.length}\n </span>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => void load()}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary hover:bg-surface-hover\"\n disabled={loading}\n >\n <RefreshCw className={`h-4 w-4 ${loading ? 'animate-spin' : ''}`} />\n Refresh\n </button>\n <button\n type=\"button\"\n onClick={openCreate}\n className=\"inline-flex items-center gap-2 rounded-md bg-surface-accent px-3 py-1.5 text-sm font-medium text-text-on-accent hover:bg-surface-accent-hover\"\n >\n <Plus className=\"h-4 w-4\" />\n Create store\n </button>\n </div>\n </div>\n </div>\n </header>\n\n <main className=\"mx-auto max-w-7xl px-6 py-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-md border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger\"\n >\n {error}\n </div>\n )}\n\n {showForm && (\n <div className=\"mb-6 rounded-lg border border-border-default bg-surface-raised p-4\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">\n {editingId ? 'Edit store' : 'Create store'}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n <label className=\"block\">\n <span className=\"text-xs text-text-secondary\">Slug</span>\n <input\n type=\"text\"\n value={form.slug}\n onChange={(e) => setForm({ ...form, slug: e.target.value })}\n disabled={!!editingId}\n required\n aria-required=\"true\"\n className=\"mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary disabled:opacity-60\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-xs text-text-secondary\">Name</span>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n required\n aria-required=\"true\"\n className=\"mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-xs text-text-secondary\">Type</span>\n <select\n value={form.type}\n onChange={(e) => setForm({ ...form, type: e.target.value as FormState['type'] })}\n disabled={!!editingId}\n className=\"mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary disabled:opacity-60\"\n >\n <option value=\"PUBLIC\">Public</option>\n <option value=\"PRIVATE\">Private (opt-in)</option>\n <option value=\"ENTERPRISE\">Enterprise (tenant-scoped)</option>\n </select>\n </label>\n <label className=\"block\">\n <span className=\"text-xs text-text-secondary\">Currency</span>\n <input\n type=\"text\"\n value={form.currency}\n onChange={(e) => setForm({ ...form, currency: e.target.value })}\n className=\"mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary\"\n />\n </label>\n {form.type !== 'PUBLIC' && (\n <label className=\"block md:col-span-2\">\n <span className=\"text-xs text-text-secondary\">Tenant ID (optional)</span>\n <input\n type=\"text\"\n value={form.tenantId}\n onChange={(e) => setForm({ ...form, tenantId: e.target.value })}\n disabled={!!editingId}\n className=\"mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary disabled:opacity-60\"\n />\n </label>\n )}\n <label className=\"block md:col-span-2\">\n <span className=\"text-xs text-text-secondary\">Description</span>\n <textarea\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n rows={2}\n className=\"mt-1 w-full rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary\"\n />\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={form.isPublic}\n onChange={(e) => setForm({ ...form, isPublic: e.target.checked })}\n />\n <span className=\"text-sm text-text-primary\">Publicly visible</span>\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={form.requiresApproval}\n onChange={(e) => setForm({ ...form, requiresApproval: e.target.checked })}\n />\n <span className=\"text-sm text-text-primary\">Requires admin approval</span>\n </label>\n <label className=\"flex items-center gap-2 md:col-span-2\">\n <input\n type=\"checkbox\"\n checked={form.allowUnverifiedPublishers}\n onChange={(e) =>\n setForm({ ...form, allowUnverifiedPublishers: e.target.checked })\n }\n />\n <span className=\"text-sm text-text-primary\">\n Allow unverified publishers to submit\n </span>\n </label>\n </div>\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setShowForm(false);\n setEditingId(null);\n setForm(emptyForm);\n }}\n className=\"rounded-md border border-border-default bg-surface-default px-3 py-1.5 text-sm text-text-primary hover:bg-surface-hover\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => void submit()}\n className=\"rounded-md bg-surface-accent px-3 py-1.5 text-sm font-medium text-text-on-accent hover:bg-surface-accent-hover\"\n >\n {editingId ? 'Save changes' : 'Create'}\n </button>\n </div>\n </div>\n )}\n\n {loading && stores.length === 0 ? (\n <div role=\"status\" className=\"py-16 text-center text-text-secondary\">\n Loading stores…\n </div>\n ) : stores.length === 0 ? (\n <div className=\"py-16 text-center text-text-secondary\">No stores yet.</div>\n ) : (\n <div className=\"overflow-hidden rounded-lg border border-border-default\">\n <table className=\"w-full text-sm\">\n <thead className=\"bg-surface-muted text-left text-xs uppercase tracking-wide text-text-secondary\">\n <tr>\n <th className=\"px-4 py-2\">Slug</th>\n <th className=\"px-4 py-2\">Name</th>\n <th className=\"px-4 py-2\">Type</th>\n <th className=\"px-4 py-2\">Public</th>\n <th className=\"px-4 py-2\">Approval</th>\n <th className=\"px-4 py-2\">Currency</th>\n <th className=\"px-4 py-2 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-default bg-surface-raised\">\n {stores.map((s) => (\n <tr key={s.id} className=\"text-text-primary\">\n <td className=\"px-4 py-2 font-mono text-xs\">{s.slug}</td>\n <td className=\"px-4 py-2\">{s.name}</td>\n <td className=\"px-4 py-2\">\n <span className=\"rounded-full bg-surface-accent-muted px-2 py-0.5 text-xs font-medium text-text-accent\">\n {s.type}\n </span>\n </td>\n <td className=\"px-4 py-2 text-xs\">{s.isPublic ? 'Yes' : 'No'}</td>\n <td className=\"px-4 py-2 text-xs\">\n {s.requiresApproval ? 'Required' : 'Auto-publish'}\n </td>\n <td className=\"px-4 py-2 text-xs\">{s.currency}</td>\n <td className=\"px-4 py-2 text-right\">\n <button\n type=\"button\"\n onClick={() => openEdit(s)}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-default px-2 py-1 text-xs text-text-primary hover:bg-surface-hover\"\n >\n <Pencil className=\"h-3 w-3\" />\n Edit\n </button>\n {s.id !== 'store_public_default' && (\n <button\n type=\"button\"\n onClick={() => void remove(s.id)}\n className=\"ml-2 inline-flex items-center gap-1 rounded-md border border-border-danger px-2 py-1 text-xs text-text-danger hover:bg-surface-danger-muted\"\n >\n <Trash2 className=\"h-3 w-3\" />\n Delete\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|