@burdenoff/microfe-subscriberbot 2026.715.3 → 2026.719.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.
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AA8E1C,eAAO,MAAM,kBAAkB,EAAE,EAkPhC,CAAC"}
1
+ {"version":3,"file":"AdminDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AA8E1C,eAAO,MAAM,kBAAkB,EAAE,EAwOhC,CAAC"}
@@ -133,21 +133,9 @@ var A = [{
133
133
  }),
134
134
  /* @__PURE__ */ u(D, {
135
135
  value: "adapters",
136
- children: /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(_, { children: "Adapter approvals" }), /* @__PURE__ */ u(h, { children: "Review submitted integration adapters before they are published to the SubscriberBot adapter marketplace." })] }), /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ d("div", {
136
+ children: /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(_, { children: "Adapter approvals" }), /* @__PURE__ */ u(h, { children: "Review submitted integration adapters before they are published to the SubscriberBot adapter marketplace." })] }), /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u("div", {
137
137
  className: "mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text",
138
- children: [
139
- "Backend query not yet implemented. Wire",
140
- /* @__PURE__ */ u("code", {
141
- className: "mx-1 rounded bg-bg-sunken px-1 py-0.5 font-mono text-text-primary",
142
- children: "subListAdapterSubmissions"
143
- }),
144
- "from ",
145
- /* @__PURE__ */ u("code", {
146
- className: "font-mono",
147
- children: "wspace-subscriberbot-svc"
148
- }),
149
- " to replace the placeholder rows below."
150
- ]
138
+ children: "Live adapter submissions aren't available yet — showing sample data below."
151
139
  }), /* @__PURE__ */ u("div", {
152
140
  className: "overflow-x-auto",
153
141
  children: /* @__PURE__ */ d(b, { children: [/* @__PURE__ */ u(w, { children: /* @__PURE__ */ d(T, { children: [
@@ -195,21 +183,9 @@ var A = [{
195
183
  }),
196
184
  /* @__PURE__ */ u(D, {
197
185
  value: "marketplace",
198
- children: /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(_, { children: "Marketplace moderation" }), /* @__PURE__ */ u(h, { children: "Review reported marketplace listings and take moderation actions." })] }), /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ d("div", {
186
+ children: /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(_, { children: "Marketplace moderation" }), /* @__PURE__ */ u(h, { children: "Review reported marketplace listings and take moderation actions." })] }), /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u("div", {
199
187
  className: "mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text",
200
- children: [
201
- "Backend query not yet implemented. Wire",
202
- /* @__PURE__ */ u("code", {
203
- className: "mx-1 rounded bg-bg-sunken px-1 py-0.5 font-mono text-text-primary",
204
- children: "subListMarketplaceReports"
205
- }),
206
- "from ",
207
- /* @__PURE__ */ u("code", {
208
- className: "font-mono",
209
- children: "wspace-subscriberbot-svc"
210
- }),
211
- " to replace the placeholder rows below."
212
- ]
188
+ children: "Live moderation reports aren't available yet — showing sample data below."
213
189
  }), /* @__PURE__ */ u("div", {
214
190
  className: "overflow-x-auto",
215
191
  children: /* @__PURE__ */ d(b, { children: [/* @__PURE__ */ u(w, { children: /* @__PURE__ */ d(T, { children: [
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboardPage.js","names":[],"sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"sourcesContent":["/**\n * SubscriberBot Admin Dashboard\n * @module subscriberbot/admin\n *\n * Product-specific admin surface mounted inside `admin-app`. It exposes the\n * three governance operations requested for SubscriberBot:\n * 1. Provider registry curation (real — wires `subListProviders` / `subUpdateProvider`).\n * 2. Adapter approval queue (placeholder — backend query does not exist yet).\n * 3. Marketplace moderation queue (placeholder — backend query does not exist yet).\n */\n\nimport { useState, type FC } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmptyState,\n Spinner,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, Plug, Settings2, Store } from 'lucide-react';\n\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { useProviders, useUpdateProvider } from '../hooks';\nimport { formatDate } from '../utils/formatters';\nimport type { SubProvider } from '../types';\n\n// Placeholder rows for surfaces that don't have a backend query yet.\n// These are intentionally typed as read-only data so the UI is structured\n// and the next engineer can swap in a real React-Query hook.\nconst PLACEHOLDER_ADAPTERS: Array<{\n id: string;\n name: string;\n kind: string;\n submittedAt: string;\n status: 'pending' | 'approved' | 'rejected';\n}> = [\n {\n id: 'adapter-placeholder-1',\n name: 'Stripe Billing Adapter',\n kind: 'BILLING',\n submittedAt: '2026-07-10T08:30:00Z',\n status: 'pending',\n },\n {\n id: 'adapter-placeholder-2',\n name: 'Chargebee Sync Adapter',\n kind: 'BILLING',\n submittedAt: '2026-07-12T14:22:00Z',\n status: 'pending',\n },\n];\n\nconst PLACEHOLDER_LISTINGS: Array<{\n id: string;\n title: string;\n provider: string;\n reportedAt: string;\n reason: string;\n}> = [\n {\n id: 'listing-placeholder-1',\n title: 'Premium SaaS Bundle',\n provider: 'ExampleSoft',\n reportedAt: '2026-07-14T09:15:00Z',\n reason: 'Misleading pricing',\n },\n {\n id: 'listing-placeholder-2',\n title: 'Newsletter Pro',\n provider: 'MailMaster',\n reportedAt: '2026-07-13T16:40:00Z',\n reason: 'Trademark concern',\n },\n];\n\nexport const AdminDashboardPage: FC = () => {\n const [activeTab, setActiveTab] = useState('providers');\n const { data: providersData, isLoading: providersLoading } = useProviders({\n pagination: { limit: 50 },\n });\n const updateProvider = useUpdateProvider();\n\n const handleVerify = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'VERIFIED' } });\n };\n\n const handleDeprecate = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'DEPRECATED' } });\n };\n\n const providers = providersData?.items ?? [];\n\n return (\n <PageLayout\n title=\"SubscriberBot Admin\"\n description=\"Provider registry curation, adapter approvals, and marketplace moderation.\"\n >\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"mb-4 grid w-full grid-cols-3 sm:w-auto sm:inline-flex\">\n <TabsTrigger value=\"providers\" className=\"gap-2\">\n <Settings2 size={16} />\n Provider Registry\n </TabsTrigger>\n <TabsTrigger value=\"adapters\" className=\"gap-2\">\n <Plug size={16} />\n Adapter Approvals\n </TabsTrigger>\n <TabsTrigger value=\"marketplace\" className=\"gap-2\">\n <Store size={16} />\n Marketplace Moderation\n </TabsTrigger>\n </TabsList>\n\n {/* Provider registry curation — backed by real GraphQL queries. */}\n <TabsContent value=\"providers\">\n <Card>\n <CardHeader>\n <CardTitle>Provider registry</CardTitle>\n <CardDescription>\n Curate the global provider catalog. Verify submitted providers or deprecate stale\n entries.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {providersLoading ? (\n <div className=\"flex min-h-[200px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : providers.length === 0 ? (\n <EmptyState\n icon={<Store className=\"size-6 text-action-primary-bg\" />}\n title=\"No providers yet\"\n description=\"Once providers are created or claimed they will appear here for curation.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Category</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Created</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {providers.map((provider: SubProvider) => (\n <TableRow key={provider.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {provider.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{provider.category}</TableCell>\n <TableCell>\n <StatusBadge status={provider.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(provider.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n {provider.status !== 'VERIFIED' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleVerify(provider.id)}\n disabled={updateProvider.isPending}\n >\n <CheckCircle2 size={14} className=\"mr-1\" />\n Verify\n </Button>\n )}\n {provider.status !== 'DEPRECATED' && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => handleDeprecate(provider.id)}\n disabled={updateProvider.isPending}\n >\n Deprecate\n </Button>\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Adapter approval queue — placeholder until backend exists. */}\n <TabsContent value=\"adapters\">\n <Card>\n <CardHeader>\n <CardTitle>Adapter approvals</CardTitle>\n <CardDescription>\n Review submitted integration adapters before they are published to the SubscriberBot\n adapter marketplace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n Backend query not yet implemented. Wire\n <code className=\"mx-1 rounded bg-bg-sunken px-1 py-0.5 font-mono text-text-primary\">\n subListAdapterSubmissions\n </code>\n from <code className=\"font-mono\">wspace-subscriberbot-svc</code> to replace the\n placeholder rows below.\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Adapter</TableHead>\n <TableHead>Kind</TableHead>\n <TableHead>Submitted</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {PLACEHOLDER_ADAPTERS.map((adapter) => (\n <TableRow key={adapter.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {adapter.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{adapter.kind}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(adapter.submittedAt)}\n </TableCell>\n <TableCell>\n <StatusBadge status={adapter.status} />\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" disabled>\n Approve\n </Button>\n <Button size=\"sm\" variant=\"secondary\" disabled>\n Reject\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Marketplace moderation — placeholder until backend exists. */}\n <TabsContent value=\"marketplace\">\n <Card>\n <CardHeader>\n <CardTitle>Marketplace moderation</CardTitle>\n <CardDescription>\n Review reported marketplace listings and take moderation actions.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n Backend query not yet implemented. Wire\n <code className=\"mx-1 rounded bg-bg-sunken px-1 py-0.5 font-mono text-text-primary\">\n subListMarketplaceReports\n </code>\n from <code className=\"font-mono\">wspace-subscriberbot-svc</code> to replace the\n placeholder rows below.\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Listing</TableHead>\n <TableHead>Provider</TableHead>\n <TableHead>Reported</TableHead>\n <TableHead>Reason</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {PLACEHOLDER_LISTINGS.map((listing) => (\n <TableRow key={listing.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {listing.title}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{listing.provider}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(listing.reportedAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{listing.reason}</TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" disabled>\n Dismiss\n </Button>\n <Button size=\"sm\" variant=\"destructive\" disabled>\n Remove\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdminDashboardPage.js","names":[],"sources":["../../../src/subscriberbot/admin/AdminDashboardPage.tsx"],"sourcesContent":["/**\n * SubscriberBot Admin Dashboard\n * @module subscriberbot/admin\n *\n * Product-specific admin surface mounted inside `admin-app`. It exposes the\n * three governance operations requested for SubscriberBot:\n * 1. Provider registry curation (real — wires `subListProviders` / `subUpdateProvider`).\n * 2. Adapter approval queue (placeholder — backend query does not exist yet).\n * 3. Marketplace moderation queue (placeholder — backend query does not exist yet).\n */\n\nimport { useState, type FC } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmptyState,\n Spinner,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, Plug, Settings2, Store } from 'lucide-react';\n\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { useProviders, useUpdateProvider } from '../hooks';\nimport { formatDate } from '../utils/formatters';\nimport type { SubProvider } from '../types';\n\n// Placeholder rows for surfaces that don't have a backend query yet.\n// These are intentionally typed as read-only data so the UI is structured\n// and the next engineer can swap in a real React-Query hook.\nconst PLACEHOLDER_ADAPTERS: Array<{\n id: string;\n name: string;\n kind: string;\n submittedAt: string;\n status: 'pending' | 'approved' | 'rejected';\n}> = [\n {\n id: 'adapter-placeholder-1',\n name: 'Stripe Billing Adapter',\n kind: 'BILLING',\n submittedAt: '2026-07-10T08:30:00Z',\n status: 'pending',\n },\n {\n id: 'adapter-placeholder-2',\n name: 'Chargebee Sync Adapter',\n kind: 'BILLING',\n submittedAt: '2026-07-12T14:22:00Z',\n status: 'pending',\n },\n];\n\nconst PLACEHOLDER_LISTINGS: Array<{\n id: string;\n title: string;\n provider: string;\n reportedAt: string;\n reason: string;\n}> = [\n {\n id: 'listing-placeholder-1',\n title: 'Premium SaaS Bundle',\n provider: 'ExampleSoft',\n reportedAt: '2026-07-14T09:15:00Z',\n reason: 'Misleading pricing',\n },\n {\n id: 'listing-placeholder-2',\n title: 'Newsletter Pro',\n provider: 'MailMaster',\n reportedAt: '2026-07-13T16:40:00Z',\n reason: 'Trademark concern',\n },\n];\n\nexport const AdminDashboardPage: FC = () => {\n const [activeTab, setActiveTab] = useState('providers');\n const { data: providersData, isLoading: providersLoading } = useProviders({\n pagination: { limit: 50 },\n });\n const updateProvider = useUpdateProvider();\n\n const handleVerify = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'VERIFIED' } });\n };\n\n const handleDeprecate = (id: string) => {\n updateProvider.mutate({ id, input: { status: 'DEPRECATED' } });\n };\n\n const providers = providersData?.items ?? [];\n\n return (\n <PageLayout\n title=\"SubscriberBot Admin\"\n description=\"Provider registry curation, adapter approvals, and marketplace moderation.\"\n >\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"w-full\">\n <TabsList className=\"mb-4 grid w-full grid-cols-3 sm:w-auto sm:inline-flex\">\n <TabsTrigger value=\"providers\" className=\"gap-2\">\n <Settings2 size={16} />\n Provider Registry\n </TabsTrigger>\n <TabsTrigger value=\"adapters\" className=\"gap-2\">\n <Plug size={16} />\n Adapter Approvals\n </TabsTrigger>\n <TabsTrigger value=\"marketplace\" className=\"gap-2\">\n <Store size={16} />\n Marketplace Moderation\n </TabsTrigger>\n </TabsList>\n\n {/* Provider registry curation — backed by real GraphQL queries. */}\n <TabsContent value=\"providers\">\n <Card>\n <CardHeader>\n <CardTitle>Provider registry</CardTitle>\n <CardDescription>\n Curate the global provider catalog. Verify submitted providers or deprecate stale\n entries.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {providersLoading ? (\n <div className=\"flex min-h-[200px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : providers.length === 0 ? (\n <EmptyState\n icon={<Store className=\"size-6 text-action-primary-bg\" />}\n title=\"No providers yet\"\n description=\"Once providers are created or claimed they will appear here for curation.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Category</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Created</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {providers.map((provider: SubProvider) => (\n <TableRow key={provider.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {provider.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{provider.category}</TableCell>\n <TableCell>\n <StatusBadge status={provider.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(provider.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n {provider.status !== 'VERIFIED' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleVerify(provider.id)}\n disabled={updateProvider.isPending}\n >\n <CheckCircle2 size={14} className=\"mr-1\" />\n Verify\n </Button>\n )}\n {provider.status !== 'DEPRECATED' && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => handleDeprecate(provider.id)}\n disabled={updateProvider.isPending}\n >\n Deprecate\n </Button>\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Adapter approval queue — placeholder until backend exists. */}\n <TabsContent value=\"adapters\">\n <Card>\n <CardHeader>\n <CardTitle>Adapter approvals</CardTitle>\n <CardDescription>\n Review submitted integration adapters before they are published to the SubscriberBot\n adapter marketplace.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n Live adapter submissions aren&apos;t available yet — showing sample data below.\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Adapter</TableHead>\n <TableHead>Kind</TableHead>\n <TableHead>Submitted</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {PLACEHOLDER_ADAPTERS.map((adapter) => (\n <TableRow key={adapter.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {adapter.name}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{adapter.kind}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(adapter.submittedAt)}\n </TableCell>\n <TableCell>\n <StatusBadge status={adapter.status} />\n </TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" disabled>\n Approve\n </Button>\n <Button size=\"sm\" variant=\"secondary\" disabled>\n Reject\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n {/* Marketplace moderation — placeholder until backend exists. */}\n <TabsContent value=\"marketplace\">\n <Card>\n <CardHeader>\n <CardTitle>Marketplace moderation</CardTitle>\n <CardDescription>\n Review reported marketplace listings and take moderation actions.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4 rounded-md border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n Live moderation reports aren&apos;t available yet — showing sample data below.\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Listing</TableHead>\n <TableHead>Provider</TableHead>\n <TableHead>Reported</TableHead>\n <TableHead>Reason</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {PLACEHOLDER_LISTINGS.map((listing) => (\n <TableRow key={listing.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {listing.title}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{listing.provider}</TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(listing.reportedAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{listing.reason}</TableCell>\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" disabled>\n Dismiss\n </Button>\n <Button size=\"sm\" variant=\"destructive\" disabled>\n Remove\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-subscriberbot",
3
- "version": "2026.715.3",
3
+ "version": "2026.719.1",
4
4
  "description": "Burdenoff SubscriberBot Microfrontend",
5
5
  "type": "module",
6
6
  "files": [