@iann29/rastro 0.9.0 → 0.10.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 (265) hide show
  1. package/README.md +9 -1
  2. package/agent/integration.md +23 -1
  3. package/agent/manifest.json +4 -4
  4. package/dist/client/federation.d.ts +114 -9
  5. package/dist/client/federation.d.ts.map +1 -1
  6. package/dist/client/federation.js +54 -2
  7. package/dist/client/federation.js.map +1 -1
  8. package/dist/client/index.d.ts +642 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +391 -9
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +14 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +278 -1
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/_generated/server.d.ts +4 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -1
  19. package/dist/component/_generated/server.js.map +1 -1
  20. package/dist/component/constants.d.ts +5 -0
  21. package/dist/component/constants.d.ts.map +1 -1
  22. package/dist/component/constants.js +10 -0
  23. package/dist/component/constants.js.map +1 -1
  24. package/dist/component/convex.config.d.ts +4 -0
  25. package/dist/component/convex.config.js +9 -0
  26. package/dist/component/convex.config.js.map +1 -1
  27. package/dist/component/errors.d.ts +1 -1
  28. package/dist/component/errors.d.ts.map +1 -1
  29. package/dist/component/errors.js.map +1 -1
  30. package/dist/component/leads.d.ts +69 -3
  31. package/dist/component/leads.d.ts.map +1 -1
  32. package/dist/component/leads.js +419 -16
  33. package/dist/component/leads.js.map +1 -1
  34. package/dist/component/meta.d.ts +358 -0
  35. package/dist/component/meta.d.ts.map +1 -0
  36. package/dist/component/meta.js +1295 -0
  37. package/dist/component/meta.js.map +1 -0
  38. package/dist/component/metaCapi.d.ts +162 -0
  39. package/dist/component/metaCapi.d.ts.map +1 -0
  40. package/dist/component/metaCapi.js +754 -0
  41. package/dist/component/metaCapi.js.map +1 -0
  42. package/dist/component/metaFake.d.ts +5 -0
  43. package/dist/component/metaFake.d.ts.map +1 -0
  44. package/dist/component/metaFake.js +225 -0
  45. package/dist/component/metaFake.js.map +1 -0
  46. package/dist/component/metaGraph.d.ts +165 -0
  47. package/dist/component/metaGraph.d.ts.map +1 -0
  48. package/dist/component/metaGraph.js +507 -0
  49. package/dist/component/metaGraph.js.map +1 -0
  50. package/dist/component/metaSync.d.ts +186 -0
  51. package/dist/component/metaSync.d.ts.map +1 -0
  52. package/dist/component/metaSync.js +961 -0
  53. package/dist/component/metaSync.js.map +1 -0
  54. package/dist/component/pipeline.d.ts +99 -0
  55. package/dist/component/pipeline.d.ts.map +1 -0
  56. package/dist/component/pipeline.js +337 -0
  57. package/dist/component/pipeline.js.map +1 -0
  58. package/dist/component/schema.d.ts +404 -2
  59. package/dist/component/schema.d.ts.map +1 -1
  60. package/dist/component/schema.js +168 -2
  61. package/dist/component/schema.js.map +1 -1
  62. package/dist/component/secrets.d.ts +15 -0
  63. package/dist/component/secrets.d.ts.map +1 -0
  64. package/dist/component/secrets.js +67 -0
  65. package/dist/component/secrets.js.map +1 -0
  66. package/dist/component/validators.d.ts +1052 -15
  67. package/dist/component/validators.d.ts.map +1 -1
  68. package/dist/component/validators.js +307 -3
  69. package/dist/component/validators.js.map +1 -1
  70. package/dist/tracker/generated.d.ts +1 -1
  71. package/dist/tracker/generated.d.ts.map +1 -1
  72. package/dist/tracker/generated.js +1 -1
  73. package/dist/tracker/generated.js.map +1 -1
  74. package/dist/ui/campaigns/CampaignsView.d.ts +48 -0
  75. package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -0
  76. package/dist/ui/campaigns/CampaignsView.js +47 -0
  77. package/dist/ui/campaigns/CampaignsView.js.map +1 -0
  78. package/dist/ui/campaigns/Conversions.d.ts +16 -0
  79. package/dist/ui/campaigns/Conversions.d.ts.map +1 -0
  80. package/dist/ui/campaigns/Conversions.js +40 -0
  81. package/dist/ui/campaigns/Conversions.js.map +1 -0
  82. package/dist/ui/campaigns/Drawer.d.ts +24 -0
  83. package/dist/ui/campaigns/Drawer.d.ts.map +1 -0
  84. package/dist/ui/campaigns/Drawer.js +120 -0
  85. package/dist/ui/campaigns/Drawer.js.map +1 -0
  86. package/dist/ui/campaigns/Icons.d.ts +35 -0
  87. package/dist/ui/campaigns/Icons.d.ts.map +1 -0
  88. package/dist/ui/campaigns/Icons.js +41 -0
  89. package/dist/ui/campaigns/Icons.js.map +1 -0
  90. package/dist/ui/campaigns/Summary.d.ts +21 -0
  91. package/dist/ui/campaigns/Summary.d.ts.map +1 -0
  92. package/dist/ui/campaigns/Summary.js +56 -0
  93. package/dist/ui/campaigns/Summary.js.map +1 -0
  94. package/dist/ui/campaigns/Thumbnail.d.ts +11 -0
  95. package/dist/ui/campaigns/Thumbnail.d.ts.map +1 -0
  96. package/dist/ui/campaigns/Thumbnail.js +23 -0
  97. package/dist/ui/campaigns/Thumbnail.js.map +1 -0
  98. package/dist/ui/campaigns/Tree.d.ts +12 -0
  99. package/dist/ui/campaigns/Tree.d.ts.map +1 -0
  100. package/dist/ui/campaigns/Tree.js +105 -0
  101. package/dist/ui/campaigns/Tree.js.map +1 -0
  102. package/dist/ui/campaigns/glyphs.d.ts +20 -0
  103. package/dist/ui/campaigns/glyphs.d.ts.map +1 -0
  104. package/dist/ui/campaigns/glyphs.js +19 -0
  105. package/dist/ui/campaigns/glyphs.js.map +1 -0
  106. package/dist/ui/campaigns/index.d.ts +4 -0
  107. package/dist/ui/campaigns/index.d.ts.map +1 -0
  108. package/dist/ui/campaigns/index.js +3 -0
  109. package/dist/ui/campaigns/index.js.map +1 -0
  110. package/dist/ui/campaigns/labels.d.ts +53 -0
  111. package/dist/ui/campaigns/labels.d.ts.map +1 -0
  112. package/dist/ui/campaigns/labels.js +169 -0
  113. package/dist/ui/campaigns/labels.js.map +1 -0
  114. package/dist/ui/campaigns/model.d.ts +99 -0
  115. package/dist/ui/campaigns/model.d.ts.map +1 -0
  116. package/dist/ui/campaigns/model.js +230 -0
  117. package/dist/ui/campaigns/model.js.map +1 -0
  118. package/dist/ui/campaigns/modes.d.ts +18 -0
  119. package/dist/ui/campaigns/modes.d.ts.map +1 -0
  120. package/dist/ui/campaigns/modes.js +7 -0
  121. package/dist/ui/campaigns/modes.js.map +1 -0
  122. package/dist/ui/index.d.ts +21 -0
  123. package/dist/ui/index.d.ts.map +1 -0
  124. package/dist/ui/index.js +20 -0
  125. package/dist/ui/index.js.map +1 -0
  126. package/dist/ui/integrations/AccountPicker.d.ts +26 -0
  127. package/dist/ui/integrations/AccountPicker.d.ts.map +1 -0
  128. package/dist/ui/integrations/AccountPicker.js +101 -0
  129. package/dist/ui/integrations/AccountPicker.js.map +1 -0
  130. package/dist/ui/integrations/ClientCards.d.ts +17 -0
  131. package/dist/ui/integrations/ClientCards.d.ts.map +1 -0
  132. package/dist/ui/integrations/ClientCards.js +42 -0
  133. package/dist/ui/integrations/ClientCards.js.map +1 -0
  134. package/dist/ui/integrations/ClientsTable.d.ts +36 -0
  135. package/dist/ui/integrations/ClientsTable.d.ts.map +1 -0
  136. package/dist/ui/integrations/ClientsTable.js +143 -0
  137. package/dist/ui/integrations/ClientsTable.js.map +1 -0
  138. package/dist/ui/integrations/Connect.d.ts +35 -0
  139. package/dist/ui/integrations/Connect.d.ts.map +1 -0
  140. package/dist/ui/integrations/Connect.js +62 -0
  141. package/dist/ui/integrations/Connect.js.map +1 -0
  142. package/dist/ui/integrations/Connection.d.ts +37 -0
  143. package/dist/ui/integrations/Connection.d.ts.map +1 -0
  144. package/dist/ui/integrations/Connection.js +108 -0
  145. package/dist/ui/integrations/Connection.js.map +1 -0
  146. package/dist/ui/integrations/Dialogs.d.ts +21 -0
  147. package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
  148. package/dist/ui/integrations/Dialogs.js +34 -0
  149. package/dist/ui/integrations/Dialogs.js.map +1 -0
  150. package/dist/ui/integrations/EventsFeed.d.ts +15 -0
  151. package/dist/ui/integrations/EventsFeed.d.ts.map +1 -0
  152. package/dist/ui/integrations/EventsFeed.js +61 -0
  153. package/dist/ui/integrations/EventsFeed.js.map +1 -0
  154. package/dist/ui/integrations/EventsSheet.d.ts +34 -0
  155. package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
  156. package/dist/ui/integrations/EventsSheet.js +136 -0
  157. package/dist/ui/integrations/EventsSheet.js.map +1 -0
  158. package/dist/ui/integrations/Icons.d.ts +38 -0
  159. package/dist/ui/integrations/Icons.d.ts.map +1 -0
  160. package/dist/ui/integrations/Icons.js +40 -0
  161. package/dist/ui/integrations/Icons.js.map +1 -0
  162. package/dist/ui/integrations/IntegrationsView.d.ts +15 -0
  163. package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
  164. package/dist/ui/integrations/IntegrationsView.js +141 -0
  165. package/dist/ui/integrations/IntegrationsView.js.map +1 -0
  166. package/dist/ui/integrations/Overlay.d.ts +18 -0
  167. package/dist/ui/integrations/Overlay.d.ts.map +1 -0
  168. package/dist/ui/integrations/Overlay.js +36 -0
  169. package/dist/ui/integrations/Overlay.js.map +1 -0
  170. package/dist/ui/integrations/Partner.d.ts +14 -0
  171. package/dist/ui/integrations/Partner.d.ts.map +1 -0
  172. package/dist/ui/integrations/Partner.js +38 -0
  173. package/dist/ui/integrations/Partner.js.map +1 -0
  174. package/dist/ui/integrations/RowMenu.d.ts +15 -0
  175. package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
  176. package/dist/ui/integrations/RowMenu.js +47 -0
  177. package/dist/ui/integrations/RowMenu.js.map +1 -0
  178. package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
  179. package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
  180. package/dist/ui/integrations/UnlinkDialog.js +29 -0
  181. package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
  182. package/dist/ui/integrations/audience.d.ts +12 -0
  183. package/dist/ui/integrations/audience.d.ts.map +1 -0
  184. package/dist/ui/integrations/audience.js +12 -0
  185. package/dist/ui/integrations/audience.js.map +1 -0
  186. package/dist/ui/integrations/format.d.ts +28 -0
  187. package/dist/ui/integrations/format.d.ts.map +1 -0
  188. package/dist/ui/integrations/format.js +101 -0
  189. package/dist/ui/integrations/format.js.map +1 -0
  190. package/dist/ui/integrations/index.d.ts +5 -0
  191. package/dist/ui/integrations/index.d.ts.map +1 -0
  192. package/dist/ui/integrations/index.js +3 -0
  193. package/dist/ui/integrations/index.js.map +1 -0
  194. package/dist/ui/integrations/modal.d.ts +10 -0
  195. package/dist/ui/integrations/modal.d.ts.map +1 -0
  196. package/dist/ui/integrations/modal.js +77 -0
  197. package/dist/ui/integrations/modal.js.map +1 -0
  198. package/dist/ui/integrations/model.d.ts +99 -0
  199. package/dist/ui/integrations/model.d.ts.map +1 -0
  200. package/dist/ui/integrations/model.js +164 -0
  201. package/dist/ui/integrations/model.js.map +1 -0
  202. package/dist/ui/integrations/parts.d.ts +36 -0
  203. package/dist/ui/integrations/parts.d.ts.map +1 -0
  204. package/dist/ui/integrations/parts.js +85 -0
  205. package/dist/ui/integrations/parts.js.map +1 -0
  206. package/dist/ui/integrations/types.d.ts +146 -0
  207. package/dist/ui/integrations/types.d.ts.map +1 -0
  208. package/dist/ui/integrations/types.js +2 -0
  209. package/dist/ui/integrations/types.js.map +1 -0
  210. package/dist/ui/metrics.d.ts +106 -0
  211. package/dist/ui/metrics.d.ts.map +1 -0
  212. package/dist/ui/metrics.js +166 -0
  213. package/dist/ui/metrics.js.map +1 -0
  214. package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
  215. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
  216. package/dist/ui/portfolio/PortfolioView.js +216 -0
  217. package/dist/ui/portfolio/PortfolioView.js.map +1 -0
  218. package/dist/ui/portfolio/SpendChart.d.ts +10 -0
  219. package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
  220. package/dist/ui/portfolio/SpendChart.js +196 -0
  221. package/dist/ui/portfolio/SpendChart.js.map +1 -0
  222. package/dist/ui/portfolio/alerts.d.ts +74 -0
  223. package/dist/ui/portfolio/alerts.d.ts.map +1 -0
  224. package/dist/ui/portfolio/alerts.js +291 -0
  225. package/dist/ui/portfolio/alerts.js.map +1 -0
  226. package/dist/ui/portfolio/figures.d.ts +79 -0
  227. package/dist/ui/portfolio/figures.d.ts.map +1 -0
  228. package/dist/ui/portfolio/figures.js +103 -0
  229. package/dist/ui/portfolio/figures.js.map +1 -0
  230. package/dist/ui/portfolio/format.d.ts +8 -0
  231. package/dist/ui/portfolio/format.d.ts.map +1 -0
  232. package/dist/ui/portfolio/format.js +28 -0
  233. package/dist/ui/portfolio/format.js.map +1 -0
  234. package/dist/ui/sample.d.ts +536 -0
  235. package/dist/ui/sample.d.ts.map +1 -0
  236. package/dist/ui/sample.js +574 -0
  237. package/dist/ui/sample.js.map +1 -0
  238. package/dist/ui/seed.d.ts +188 -0
  239. package/dist/ui/seed.d.ts.map +1 -0
  240. package/dist/ui/seed.js +563 -0
  241. package/dist/ui/seed.js.map +1 -0
  242. package/dist/ui/ui.css +3424 -0
  243. package/docs/federation.md +46 -1
  244. package/docs/meta-ads.md +795 -0
  245. package/docs/upgrading.md +116 -0
  246. package/llms.txt +3 -0
  247. package/package.json +15 -3
  248. package/src/component/_generated/api.ts +14 -0
  249. package/src/component/_generated/component.ts +324 -1
  250. package/src/component/_generated/server.ts +4 -0
  251. package/src/component/constants.ts +10 -0
  252. package/src/component/convex.config.ts +9 -0
  253. package/src/component/errors.ts +5 -1
  254. package/src/component/leads.ts +517 -17
  255. package/src/component/meta.ts +1525 -0
  256. package/src/component/metaCapi.ts +921 -0
  257. package/src/component/metaFake.ts +277 -0
  258. package/src/component/metaGraph.ts +722 -0
  259. package/src/component/metaSync.ts +1164 -0
  260. package/src/component/pipeline.ts +410 -0
  261. package/src/component/schema.ts +197 -1
  262. package/src/component/secrets.ts +98 -0
  263. package/src/component/validators.ts +376 -3
  264. package/src/tracker/generated.ts +1 -1
  265. package/src/ui/seed.ts +755 -0
@@ -0,0 +1,47 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ConversionsList } from "./Conversions.js";
3
+ import { AdDrawer } from "./Drawer.js";
4
+ import { Icon } from "./Icons.js";
5
+ import { paidFunnel } from "../metrics.js";
6
+ import { adCount, findAd } from "./labels.js";
7
+ import { funnel, indicators, metaLink, moneyFor, organicOrigins, partialSpendNote, salesPerDay, spendMode, } from "./model.js";
8
+ import { CREATIVES_VIEW } from "./modes.js";
9
+ import { FunnelCard, Indicators, MetaStrip, OrganicCard, OriginsCard, } from "./Summary.js";
10
+ import { BandLegend, CampaignTree } from "./Tree.js";
11
+ function Loading() {
12
+ return (_jsxs("div", { className: "rastro-ui rastro-campaigns", role: "status", "aria-busy": "true", "aria-label": "Carregando campanhas", children: [_jsx("div", { className: "rastro-campaigns__kpis", "data-count": 6, children: Array.from({ length: 6 }, (_, index) => (_jsx("div", { className: "rastro-skeleton", style: { height: 104 } }, index))) }), _jsx("div", { className: "rastro-skeleton", style: { height: 150 } }), _jsxs("div", { className: "rastro-campaigns__main", children: [_jsx("div", { className: "rastro-skeleton", style: { height: 420 } }), _jsx("div", { className: "rastro-skeleton", style: { height: 420 } })] })] }));
13
+ }
14
+ /**
15
+ * Campanhas for one client (Direção A): from what Meta spent to the sale on
16
+ * WhatsApp. Six indicators with the change against the previous period, the
17
+ * funnel, the campaign → ad set → ad tree with cost per lead and return, the
18
+ * drawer of the selected ad (its leads and one lead's path) and the sales sent
19
+ * back to Meta. Without Meta spend it is the leads screen it grew from: no
20
+ * empty spend column. With spend in another currency, return is left out.
21
+ */
22
+ export function CampaignsView(props) {
23
+ const { report, previous, daily, status, conversions, mode, onModeChange, onSelectAd, adLeads, recentLeads, adDaily, selectedLeadId, onSelectLead, journey, now, loading, } = props;
24
+ if (loading || !report)
25
+ return _jsx(Loading, {});
26
+ // A selection the report no longer holds (another site or period) is none.
27
+ const selectedAdId = findAd(report, props.selectedAdId)
28
+ ? props.selectedAdId
29
+ : null;
30
+ const spend = spendMode(report);
31
+ const money = moneyFor(report);
32
+ const hasSpend = (paidFunnel(report).row.spendCents ?? 0) > 0;
33
+ if (report.totals.leads === 0 && !hasSpend) {
34
+ return (_jsx("div", { className: "rastro-ui rastro-campaigns", children: _jsxs("div", { className: "rastro-card rastro-empty", children: [_jsx("strong", { children: "Nenhum lead no per\u00EDodo" }), _jsx("span", { children: "Os leads aparecem aqui assim que chegar a primeira conversa do per\u00EDodo. Tente um per\u00EDodo maior." })] }) }));
35
+ }
36
+ const link = status ? metaLink(status, now) : null;
37
+ const Creatives = CREATIVES_VIEW;
38
+ const showCreatives = Creatives !== null && mode === "creatives";
39
+ const hasAds = adCount(report) > 0;
40
+ const partialNote = spend === "none" ? null : partialSpendNote(report);
41
+ // Set by hosts from 0.10 when the period has too many ad rows for spend.
42
+ const spendIncomplete = spend !== "none" && report.spendIncomplete === true;
43
+ return (_jsxs("div", { className: "rastro-ui rastro-campaigns", "data-spend": spend, children: [link && _jsx(MetaStrip, { link: link }), report.currency === null ? (_jsxs("div", { className: "rastro-campaigns__notice", role: "note", children: [_jsx(Icon, { name: "alert", size: 16 }), _jsxs("span", { children: ["Os sites vendem em moedas diferentes: a receita \u00E9 uma soma aproximada", spend === "none" ? "." : " e o retorno fica de fora."] })] })) : (spend === "spendOnly" && (_jsxs("div", { className: "rastro-campaigns__notice", role: "note", children: [_jsx(Icon, { name: "alert", size: 16 }), _jsxs("span", { children: ["A conta de an\u00FAncios gasta em", " ", report.spendCurrency ?? "outra moeda", " e as vendas est\u00E3o em", " ", report.currency, ". O gasto e o custo por lead aparecem na moeda da conta; o retorno fica de fora at\u00E9 as moedas baterem."] })] }))), partialNote && (_jsxs("div", { className: "rastro-campaigns__notice", role: "note", children: [_jsx(Icon, { name: "info", size: 16 }), _jsx("span", { children: partialNote })] })), _jsx(Indicators, { items: indicators(report, previous), sales: salesPerDay(daily, spend) }), spend === "none" ? (_jsx(OriginsCard, { report: report })) : (_jsxs("div", { className: "rastro-campaigns__overview", children: [_jsx(FunnelCard, { funnel: funnel(report) }), _jsx(OrganicCard, { origins: organicOrigins(report) })] })), _jsxs("div", { className: "rastro-campaigns__main", children: [_jsxs("section", { className: "rastro-card rastro-campaigns__tree", "aria-label": "Campanhas da Meta", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Campanhas da Meta" }), _jsx("p", { className: "rastro-campaigns__desc", children: spend === "none"
44
+ ? "Campanha → conjunto → anúncio · leads que chegaram por anúncio"
45
+ : "Campanha → conjunto → anúncio · nomes, imagens e gasto vêm da conta de anúncios" })] }), Creatives && (_jsxs("div", { className: "rastro-campaigns__segmented", role: "group", "aria-label": "Modo", children: [_jsx("button", { type: "button", "aria-pressed": !showCreatives, onClick: () => onModeChange("tree"), children: "\u00C1rvore" }), _jsx("button", { type: "button", "aria-pressed": showCreatives, onClick: () => onModeChange("creatives"), children: "Criativos" })] }))] }), spendIncomplete && (_jsxs("p", { className: "rastro-campaigns__tree-note", role: "note", children: [_jsx(Icon, { name: "info", size: 14 }), "Gasto por an\u00FAncio indispon\u00EDvel neste per\u00EDodo; escolha um per\u00EDodo menor."] })), showCreatives && Creatives ? (_jsx(Creatives, { report: report, adDaily: adDaily, adLeads: adLeads, selectedAdId: selectedAdId, onSelectAd: onSelectAd })) : hasAds ? (_jsxs(_Fragment, { children: [_jsx(CampaignTree, { report: report, mode: spend, money: money, selectedAdId: selectedAdId, onSelectAd: onSelectAd }), spend === "full" && _jsx(BandLegend, {})] })) : (_jsx("div", { className: "rastro-empty", children: _jsx("strong", { children: "Nenhum lead veio de an\u00FAncio no per\u00EDodo" }) })), link && (_jsx(ConversionsList, { report: report, link: link, conversions: conversions, money: money }))] }), !showCreatives && (_jsx(AdDrawer, { report: report, mode: spend, money: money, selectedAdId: selectedAdId, onSelectAd: onSelectAd, leads: selectedAdId ? adLeads?.[selectedAdId] : undefined, recentLeads: recentLeads, daily: selectedAdId ? adDaily?.[selectedAdId] : undefined, selectedLeadId: selectedLeadId, onSelectLead: onSelectLead, journey: journey, conversions: conversions, now: now }))] })] }));
46
+ }
47
+ //# sourceMappingURL=CampaignsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CampaignsView.js","sourceRoot":"","sources":["../../../src/ui/campaigns/CampaignsView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { LeadsReport, MetaConversion } from "../../client/index.js";
2
+ import type { MetaLink, Money } from "./model.js";
3
+ /** How many of the newest conversions the list shows. */
4
+ export declare const CONVERSIONS_SHOWN = 5;
5
+ /**
6
+ * "Devolvidas pra Meta": what Rastro sent back to the client's pixel. The
7
+ * header counts every event ever queued (enviadas / na fila / com erro); the
8
+ * list shows the newest ones.
9
+ */
10
+ export declare function ConversionsList({ report, link, conversions, money, }: {
11
+ report: LeadsReport;
12
+ link: MetaLink;
13
+ conversions: MetaConversion[] | undefined;
14
+ money: Money;
15
+ }): import("react").JSX.Element;
16
+ //# sourceMappingURL=Conversions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Conversions.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Conversions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAElD,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAenC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,IAAI,EACJ,WAAW,EACX,KAAK,GACN,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,KAAK,CAAC;CACd,+BA4EA"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "./Icons.js";
3
+ import { adLabel, dateTimeLabel, findAd, plural } from "./labels.js";
4
+ /** How many of the newest conversions the list shows. */
5
+ export const CONVERSIONS_SHOWN = 5;
6
+ const EVENT_LABELS = {
7
+ Purchase: "Venda",
8
+ QualifiedLead: "Qualificado",
9
+ Schedule: "Agendamento",
10
+ Lead: "Lead",
11
+ };
12
+ const STATUS_LABELS = {
13
+ sent: "enviada",
14
+ pending: "na fila",
15
+ failed: "com erro",
16
+ };
17
+ /**
18
+ * "Devolvidas pra Meta": what Rastro sent back to the client's pixel. The
19
+ * header counts every event ever queued (enviadas / na fila / com erro); the
20
+ * list shows the newest ones.
21
+ */
22
+ export function ConversionsList({ report, link, conversions, money, }) {
23
+ const { sent, pending, failed } = link.conversions;
24
+ return (_jsxs("section", { className: "rastro-campaigns__conversions", "aria-label": "Devolvidas pra Meta", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Devolvidas pra Meta" }), _jsx("p", { className: "rastro-campaigns__desc", children: link.pixel
25
+ ? "Cada venda volta pro pixel do cliente como Compra, com o valor, pra Meta otimizar por quem compra"
26
+ : "Configure o pixel do cliente pra devolver as vendas à Meta" })] }), link.pixel && (_jsxs("div", { className: "rastro-campaigns__counts", children: [_jsx("span", { className: "rastro-campaigns__pill", "data-tone": "good", children: plural(sent, "enviada", "enviadas") }), pending > 0 && (_jsxs("span", { className: "rastro-campaigns__pill", children: [pending.toLocaleString("pt-BR"), " na fila"] })), failed > 0 && (_jsxs("span", { className: "rastro-campaigns__pill", "data-tone": "bad", children: [failed.toLocaleString("pt-BR"), " com erro"] }))] }))] }), conversions === undefined && link.pixel ? (_jsx("div", { className: "rastro-skeleton", style: { height: 72 } })) : conversions && conversions.length > 0 ? (_jsx("ul", { className: "rastro-campaigns__conversion-list", children: conversions.slice(0, CONVERSIONS_SHOWN).map((row) => {
27
+ const ad = findAd(report, row.adId);
28
+ const parts = [
29
+ EVENT_LABELS[row.eventName],
30
+ row.leadLabel,
31
+ row.valueCents === null ? null : money.revenue(row.valueCents),
32
+ ].filter(Boolean);
33
+ return (_jsxs("li", { "data-status": row.status, children: [_jsx(Icon, { name: row.status === "sent"
34
+ ? "check"
35
+ : row.status === "failed"
36
+ ? "alert"
37
+ : "clock", size: 14 }), _jsx("span", { className: "rastro-campaigns__conversion-what", children: parts.join(" · ") }), _jsx("span", { className: "rastro-campaigns__conversion-ad", children: ad ? adLabel(ad.ad) : "" }), _jsxs("span", { className: "rastro-campaigns__conversion-when rastro-num", children: [STATUS_LABELS[row.status], " ", dateTimeLabel(row.sentAt ?? row.createdAt)] })] }, row.eventId));
38
+ }) })) : link.pixel ? (_jsx("p", { className: "rastro-muted", children: "Nenhum evento enviado ainda." })) : null] }));
39
+ }
40
+ //# sourceMappingURL=Conversions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Conversions.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Conversions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { LeadJourney, LeadsDaily, LeadsReport, LeadSummary, MetaConversion } from "../../client/index.js";
2
+ import type { Money, SpendMode } from "./model.js";
3
+ /** How many of the ad's leads the drawer lists. */
4
+ export declare const DRAWER_LEADS = 6;
5
+ export declare function AdDrawer({ report, mode, money, selectedAdId, onSelectAd, leads, recentLeads, daily, selectedLeadId, onSelectLead, journey, conversions, now, }: {
6
+ report: LeadsReport;
7
+ mode: SpendMode;
8
+ money: Money;
9
+ selectedAdId: string | null;
10
+ onSelectAd: (adId: string | null) => void;
11
+ leads: LeadSummary[] | undefined;
12
+ /** The newest leads of any origin, for the drawer with no ad selected. */
13
+ recentLeads: LeadSummary[] | null | undefined;
14
+ daily: LeadsDaily | undefined;
15
+ selectedLeadId: string | null | undefined;
16
+ onSelectLead?: (lead: {
17
+ siteId: string;
18
+ leadId: string;
19
+ } | null) => void;
20
+ journey: LeadJourney | undefined;
21
+ conversions: MetaConversion[] | undefined;
22
+ now: number;
23
+ }): import("react").JSX.Element;
24
+ //# sourceMappingURL=Drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Drawer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,uBAAuB,CAAC;AAoB/B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGnD,mDAAmD;AACnD,eAAO,MAAM,YAAY,IAAI,CAAC;AA4O9B,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,EACX,KAAK,EACL,cAAc,EACd,YAAY,EACZ,OAAO,EACP,WAAW,EACX,GAAG,GACJ,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACjC,0EAA0E;IAC1E,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACzE,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC;CACb,+BA6LA"}
@@ -0,0 +1,120 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { formatReturn, returnBand, rowMetrics } from "../metrics.js";
4
+ import { AppGlyph, Icon } from "./Icons.js";
5
+ import { adLabel, AD_ORIGIN, adsetLabel, appLabel, arrivalLabel, campaignLabel, CREATIVE_LABELS, dateTimeLabel, findAd, initials, isLong, journeyStepLabel, originLabel, relativeTime, STAGE_LABELS, } from "./labels.js";
6
+ import { Thumbnail } from "./Thumbnail.js";
7
+ /** How many of the ad's leads the drawer lists. */
8
+ export const DRAWER_LEADS = 6;
9
+ function DailyBars({ daily, money, mode, }) {
10
+ const maxSpend = Math.max(1, ...daily.map((day) => day.spendCents ?? 0));
11
+ const maxWon = Math.max(1, ...daily.map((day) => day.won));
12
+ const sales = daily.reduce((sum, day) => sum + day.won, 0);
13
+ const spend = daily.reduce((sum, day) => sum + (day.spendCents ?? 0), 0);
14
+ // Spend draws only where the screen shows spend (never under hideSpend).
15
+ const hasSpend = mode !== "none" && daily.some((day) => day.spendCents !== null);
16
+ return (_jsxs("figure", { className: "rastro-campaigns__daily", children: [_jsx("div", { className: "rastro-campaigns__daily-plot", role: "img", "aria-label": `${sales} vendas${hasSpend ? ` e ${money.spend(spend)} de gasto` : ""} em ${daily.length} dias`, children: daily.map((day) => (_jsxs("span", { className: "rastro-campaigns__daily-day", children: [hasSpend && (_jsx("i", { "data-layer": "spend", style: {
17
+ height: `${((day.spendCents ?? 0) / maxSpend) * 100}%`,
18
+ } })), _jsx("i", { "data-layer": "won", style: { height: `${(day.won / maxWon) * 100}%` } })] }, day.dayStart))) }), _jsxs("figcaption", { className: "rastro-campaigns__legend", children: [_jsxs("span", { children: [_jsx("i", { "data-layer": "won" }), "vendas por dia"] }), hasSpend && (_jsxs("span", { children: [_jsx("i", { "data-layer": "spend" }), "gasto"] }))] })] }));
19
+ }
20
+ function sentToMeta(lead, conversions) {
21
+ return conversions?.find((row) => row.leadId === lead.leadId &&
22
+ row.eventName === "Purchase" &&
23
+ row.status === "sent");
24
+ }
25
+ function Journey({ lead, journey, conversions, money, }) {
26
+ const name = lead.label ?? "Lead sem nome";
27
+ if (journey === undefined) {
28
+ return (_jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["Caminho \u00B7 ", name] }), _jsx("div", { className: "rastro-skeleton", style: { height: 96 } })] }));
29
+ }
30
+ if (journey === null) {
31
+ return (_jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["Caminho \u00B7 ", name] }), _jsx("p", { className: "rastro-muted", children: "Este lead n\u00E3o est\u00E1 mais dispon\u00EDvel." })] }));
32
+ }
33
+ const sent = sentToMeta(lead, conversions);
34
+ return (_jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["Caminho \u00B7 ", name] }), _jsx("ol", { className: "rastro-campaigns__timeline", children: journey.events.map((event, index) => (_jsxs("li", { children: [_jsxs("span", { className: "rastro-campaigns__timeline-title", children: [event.type === "created" ? (_jsx(AppGlyph, { app: "whatsapp", size: 12 })) : (_jsx(Icon, { name: event.type === "won" ? "check" : "star", size: 12 })), journeyStepLabel(event, journey, money.revenue)] }), _jsxs("span", { className: "rastro-campaigns__timeline-detail", children: [dateTimeLabel(event.at), event.type === "created" &&
35
+ arrivalLabel(journey) &&
36
+ ` · ${arrivalLabel(journey)}`, event.type === "won" &&
37
+ sent &&
38
+ " · devolvida pra Meta como Compra"] })] }, `${event.type}-${event.at}-${index}`))) })] }));
39
+ }
40
+ /**
41
+ * The line under a lead's name. A sale shows its value and when it closed
42
+ * ("Venda · R$ 890 · há 2 h"); otherwise where the lead came from and when:
43
+ * the app for an ad's own leads, the ad's name or the entry point for the
44
+ * newest leads of any origin.
45
+ */
46
+ function leadLine(lead, report, origin, money, now) {
47
+ if (lead.stage === "won") {
48
+ return `Venda · ${money.revenue(lead.revenueCents)} · ${relativeTime(lead.stageAt, now)}`;
49
+ }
50
+ let source;
51
+ if (origin === "app")
52
+ source = appLabel(lead.sourceApp);
53
+ else if (lead.originKey !== AD_ORIGIN)
54
+ source = originLabel(lead.originKey);
55
+ else {
56
+ const found = findAd(report, lead.adId);
57
+ source = found ? adLabel(found.ad) : "Anúncio";
58
+ }
59
+ return [source, relativeTime(lead.firstAt, now)].filter(Boolean).join(" · ");
60
+ }
61
+ function LeadList({ report, leads, selectedLeadId, onSelectLead, money, now, origin, }) {
62
+ const [expanded, setExpanded] = useState(false);
63
+ const shown = expanded ? leads : leads.slice(0, DRAWER_LEADS);
64
+ const hidden = leads.length - shown.length;
65
+ return (_jsxs(_Fragment, { children: [_jsx("ul", { className: "rastro-campaigns__leads", children: shown.map((lead) => {
66
+ const selected = lead.leadId === selectedLeadId;
67
+ return (_jsx("li", { children: _jsxs("button", { type: "button", className: "rastro-campaigns__lead", "aria-pressed": selected, disabled: !onSelectLead, onClick: () => onSelectLead?.(selected
68
+ ? null
69
+ : { siteId: lead.siteId, leadId: lead.leadId }), children: [_jsx("span", { className: "rastro-campaigns__avatar", children: initials(lead.label) }), _jsxs("span", { className: "rastro-campaigns__lead-text", children: [_jsx("span", { className: "rastro-campaigns__lead-name", children: lead.label ?? "Lead sem nome" }), _jsxs("span", { className: "rastro-campaigns__lead-meta", children: [_jsx(AppGlyph, { app: lead.sourceApp, size: 11 }), _jsx("span", { className: "rastro-campaigns__clip", children: leadLine(lead, report, origin, money, now) })] })] }), _jsx("span", { className: "rastro-campaigns__pill", "data-stage": lead.stage, children: STAGE_LABELS[lead.stage] })] }) }, lead.leadId));
70
+ }) }), hidden > 0 && (_jsxs("button", { type: "button", className: "rastro-campaigns__more", onClick: () => setExpanded(true), children: ["Ver mais ", hidden.toLocaleString("pt-BR")] }))] }));
71
+ }
72
+ export function AdDrawer({ report, mode, money, selectedAdId, onSelectAd, leads, recentLeads, daily, selectedLeadId, onSelectLead, journey, conversions, now, }) {
73
+ const found = findAd(report, selectedAdId);
74
+ if (!found) {
75
+ if (recentLeads === undefined) {
76
+ return (_jsx("aside", { className: "rastro-card rastro-campaigns__drawer", "aria-label": "An\u00FAncio", children: _jsxs("div", { className: "rastro-empty", children: [_jsx(Icon, { name: "megaphone", size: 20 }), _jsx("strong", { children: "Escolha um an\u00FAncio" }), _jsx("span", { children: "Toque num an\u00FAncio da tabela pra ver os leads dele e o caminho de cada um at\u00E9 a venda." })] }) }));
77
+ }
78
+ const selectedRecent = recentLeads?.find((lead) => lead.leadId === selectedLeadId);
79
+ return (_jsxs("aside", { className: "rastro-card rastro-campaigns__drawer", "aria-label": "Leads recentes", children: [_jsx("h3", { className: "rastro-campaigns__drawer-title", children: "Leads recentes" }), _jsx("p", { className: "rastro-campaigns__drawer-meta", children: "Os que chegaram por \u00FAltimo, de qualquer origem. Toque num an\u00FAncio da tabela pra ver s\u00F3 os dele." }), _jsx("div", { className: "rastro-campaigns__section", children: recentLeads === null ? (_jsx("div", { className: "rastro-skeleton", style: { height: 120 } })) : recentLeads.length === 0 ? (_jsx("p", { className: "rastro-muted", children: "Nenhum lead no per\u00EDodo." })) : (_jsx(LeadList, { report: report, leads: recentLeads, selectedLeadId: selectedLeadId, onSelectLead: onSelectLead, money: money, now: now, origin: "entry" })) }), selectedRecent && (_jsx(Journey, { lead: selectedRecent, journey: journey, conversions: conversions, money: money }))] }));
80
+ }
81
+ const { ad, campaign, adset } = found;
82
+ const metrics = rowMetrics(ad);
83
+ const kind = ad.creativeType ? CREATIVE_LABELS[ad.creativeType] : null;
84
+ const app = appLabel(ad.sourceApp);
85
+ const selectedLead = leads?.find((lead) => lead.leadId === selectedLeadId);
86
+ const band = returnBand(metrics.returnOnSpend);
87
+ const minis = mode === "none"
88
+ ? [
89
+ { label: "Leads", value: ad.leads.toLocaleString("pt-BR") },
90
+ { label: "Vendas", value: ad.won.toLocaleString("pt-BR") },
91
+ { label: "Receita", value: money.revenue(ad.revenueCents) },
92
+ ]
93
+ : [
94
+ {
95
+ label: "Custo por lead",
96
+ value: money.spend(metrics.costPerLeadCents),
97
+ },
98
+ {
99
+ label: "Custo por venda",
100
+ value: money.spend(metrics.costPerSaleCents),
101
+ },
102
+ mode === "full"
103
+ ? {
104
+ label: "Retorno",
105
+ value: formatReturn(metrics.returnOnSpend),
106
+ band,
107
+ }
108
+ : { label: "Vendas", value: ad.won.toLocaleString("pt-BR") },
109
+ ];
110
+ return (_jsxs("aside", { className: "rastro-card rastro-campaigns__drawer", "aria-label": `Anúncio ${adLabel(ad)}`, children: [_jsxs("header", { className: "rastro-campaigns__drawer-head", children: [_jsxs("span", { className: "rastro-campaigns__crumb", children: ["An\u00FAncio \u00B7 ", campaignLabel(campaign), " \u203A ", adsetLabel(adset)] }), _jsx("button", { type: "button", className: "rastro-campaigns__close", "aria-label": "Fechar an\u00FAncio", onClick: () => onSelectAd(null), children: _jsx(Icon, { name: "x", size: 14 }) })] }), _jsx(Thumbnail, { url: ad.thumbnailUrl, type: ad.creativeType, seed: ad.adId, size: "hero" }), _jsx("h3", { className: "rastro-campaigns__drawer-title", children: adLabel(ad) }), _jsxs("p", { className: "rastro-campaigns__drawer-meta", children: [_jsx(AppGlyph, { app: ad.sourceApp, size: 12 }), [
111
+ kind,
112
+ app,
113
+ mode === "none" || ad.spendCents == null
114
+ ? null
115
+ : `${money.spend(ad.spendCents)} gastos`,
116
+ ]
117
+ .filter(Boolean)
118
+ .join(" · ")] }), ad.sourceUrl && (_jsx("a", { className: "rastro-campaigns__post", href: ad.sourceUrl, target: "_blank", rel: "noreferrer", children: ad.sourceUrl.replace(/^https?:\/\/(www\.)?/, "") })), _jsx("dl", { className: "rastro-campaigns__minis", children: minis.map((mini) => (_jsxs("div", { "data-band": "band" in mini ? (mini.band ?? undefined) : undefined, children: [_jsx("dt", { children: mini.label }), _jsx("dd", { className: "rastro-num", "data-long": isLong(mini.value) ? "true" : undefined, children: mini.value })] }, mini.label))) }), daily && daily.length > 1 && (_jsx(DailyBars, { daily: daily, money: money, mode: mode })), _jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["\u00DAltimos leads \u00B7 ", ad.leads.toLocaleString("pt-BR"), " no per\u00EDodo"] }), leads === undefined ? (_jsx("div", { className: "rastro-skeleton", style: { height: 120 } })) : leads.length === 0 ? (_jsx("p", { className: "rastro-muted", children: "Nenhum lead deste an\u00FAncio no per\u00EDodo." })) : (_jsx(LeadList, { report: report, leads: leads, selectedLeadId: selectedLeadId, onSelectLead: onSelectLead, money: money, now: now, origin: "app" }, ad.adId))] }), selectedLead && (_jsx(Journey, { lead: selectedLead, journey: journey, conversions: conversions, money: money }))] }));
119
+ }
120
+ //# sourceMappingURL=Drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drawer.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Drawer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /** A brand glyph in its own color, or nothing for an app Rastro does not know. */
2
+ export declare function AppGlyph({ app, size, title, }: {
3
+ app: string | null | undefined;
4
+ size?: number;
5
+ title?: string;
6
+ }): import("react").JSX.Element | null;
7
+ declare const LINES: {
8
+ megaphone: import("react").JSX.Element;
9
+ message: import("react").JSX.Element;
10
+ target: import("react").JSX.Element;
11
+ check: import("react").JSX.Element;
12
+ dollar: import("react").JSX.Element;
13
+ layers: import("react").JSX.Element;
14
+ star: import("react").JSX.Element;
15
+ chevronRight: import("react").JSX.Element;
16
+ chevronDown: import("react").JSX.Element;
17
+ x: import("react").JSX.Element;
18
+ search: import("react").JSX.Element;
19
+ link: import("react").JSX.Element;
20
+ eye: import("react").JSX.Element;
21
+ info: import("react").JSX.Element;
22
+ alert: import("react").JSX.Element;
23
+ clock: import("react").JSX.Element;
24
+ play: import("react").JSX.Element;
25
+ image: import("react").JSX.Element;
26
+ gallery: import("react").JSX.Element;
27
+ };
28
+ export type IconName = keyof typeof LINES;
29
+ export declare function Icon({ name, size, className, }: {
30
+ name: IconName;
31
+ size?: number;
32
+ className?: string;
33
+ }): import("react").JSX.Element;
34
+ export {};
35
+ //# sourceMappingURL=Icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icons.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Icons.tsx"],"names":[],"mappings":"AAIA,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,IAAS,EACT,KAAK,GACN,EAAE;IACD,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,sCAkBA;AAID,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;CA+E0B,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC;AAE1C,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAS,EACT,SAAS,GACV,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAqBA"}
@@ -0,0 +1,41 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BRAND_GLYPHS } from "./glyphs.js";
3
+ import { appLabel } from "./labels.js";
4
+ /** A brand glyph in its own color, or nothing for an app Rastro does not know. */
5
+ export function AppGlyph({ app, size = 12, title, }) {
6
+ const key = app?.toLowerCase();
7
+ const glyph = key ? BRAND_GLYPHS[key] : undefined;
8
+ if (!glyph)
9
+ return null;
10
+ const label = title ?? appLabel(app) ?? undefined;
11
+ return (_jsx("svg", { className: "rastro-campaigns__glyph", viewBox: "0 0 24 24", width: size, height: size, role: label ? "img" : undefined, "aria-label": label, "aria-hidden": label ? undefined : true, children: _jsx("path", { fill: glyph.hex, d: glyph.path }) }));
12
+ }
13
+ // Line icons in the dashboard's family (lucide strokes), inlined so the
14
+ // package needs no icon library.
15
+ const LINES = {
16
+ megaphone: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m3 11 18-5v12L3 14v-3z" }), _jsx("path", { d: "M11.6 16.8a3 3 0 1 1-5.8-1.6" })] })),
17
+ message: _jsx("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
18
+ target: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("circle", { cx: "12", cy: "12", r: "6" }), _jsx("circle", { cx: "12", cy: "12", r: "2" })] })),
19
+ check: _jsx("path", { d: "M20 6 9 17l-5-5" }),
20
+ dollar: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8M12 18V6" })] })),
21
+ layers: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m12.8 2.2 8.5 3.9a1 1 0 0 1 0 1.8l-8.5 3.9a2 2 0 0 1-1.6 0L2.7 7.9a1 1 0 0 1 0-1.8l8.5-3.9a2 2 0 0 1 1.6 0Z" }), _jsx("path", { d: "m22 17.6-9.2 4.2a2 2 0 0 1-1.6 0L2 17.6M22 12.6l-9.2 4.2a2 2 0 0 1-1.6 0L2 12.6" })] })),
22
+ star: (_jsx("path", { d: "M11.5 2.3a.5.5 0 0 1 1 0l2.3 4.7 5.2.8a.5.5 0 0 1 .3.9l-3.8 3.7.9 5.2a.5.5 0 0 1-.7.5L12 15.7l-4.7 2.4a.5.5 0 0 1-.7-.5l.9-5.2-3.8-3.7a.5.5 0 0 1 .3-.9l5.2-.8z" })),
23
+ chevronRight: _jsx("path", { d: "m9 18 6-6-6-6" }),
24
+ chevronDown: _jsx("path", { d: "m6 9 6 6 6-6" }),
25
+ x: _jsx("path", { d: "M18 6 6 18M6 6l12 12" }),
26
+ search: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] })),
27
+ link: _jsx("path", { d: "M9 17H7A5 5 0 0 1 7 7h2M15 7h2a5 5 0 1 1 0 10h-2M8 12h8" }),
28
+ eye: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z" }), _jsx("circle", { cx: "12", cy: "12", r: "3" })] })),
29
+ info: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 16v-4M12 8h.01" })] })),
30
+ alert: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z" }), _jsx("path", { d: "M12 9v4M12 17h.01" })] })),
31
+ clock: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 6v6l4 2" })] })),
32
+ play: _jsx("polygon", { points: "6 3 20 12 6 21 6 3" }),
33
+ image: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("circle", { cx: "9", cy: "9", r: "2" }), _jsx("path", { d: "m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21" })] })),
34
+ gallery: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "2", y: "6", width: "14", height: "14", rx: "2" }), _jsx("path", { d: "M6 2h12a4 4 0 0 1 4 4v12" })] })),
35
+ };
36
+ export function Icon({ name, size = 16, className, }) {
37
+ return (_jsx("svg", { className: className
38
+ ? `rastro-campaigns__icon ${className}`
39
+ : "rastro-campaigns__icon", viewBox: "0 0 24 24", width: size, height: size, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: LINES[name] }));
40
+ }
41
+ //# sourceMappingURL=Icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icons.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Icons.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { LeadsReport } from "../../client/index.js";
2
+ import type { Funnel, Indicator, MetaLink, OrganicOrigin } from "./model.js";
3
+ export declare function Indicators({ items, sales, }: {
4
+ items: Indicator[];
5
+ sales: number[] | null;
6
+ }): import("react").JSX.Element;
7
+ export declare function FunnelCard({ funnel }: {
8
+ funnel: Funnel;
9
+ }): import("react").JSX.Element;
10
+ export declare function OrganicCard({ origins }: {
11
+ origins: OrganicOrigin[];
12
+ }): import("react").JSX.Element;
13
+ /** Today's origin bar, for a host without Meta spend. */
14
+ export declare function OriginsCard({ report }: {
15
+ report: LeadsReport;
16
+ }): import("react").JSX.Element;
17
+ /** The Meta link and the conversions it sent back, above the figures. */
18
+ export declare function MetaStrip({ link }: {
19
+ link: MetaLink;
20
+ }): import("react").JSX.Element;
21
+ //# sourceMappingURL=Summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Summary.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Summary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgC7E,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACxB,+BA+CA;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BAsDxD;AASD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,+BAyCpE;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,+BAoC9D;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,+BAyBrD"}
@@ -0,0 +1,56 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "./Icons.js";
3
+ import { isLong, originLabel, plural } from "./labels.js";
4
+ const INDICATOR_ICONS = {
5
+ spend: "megaphone",
6
+ leads: "message",
7
+ costPerLead: "target",
8
+ qualified: "star",
9
+ won: "check",
10
+ revenue: "dollar",
11
+ return: "layers",
12
+ };
13
+ /** A tiny line of daily values, drawn to fit its box. */
14
+ function Sparkline({ values, label }) {
15
+ const max = Math.max(1, ...values);
16
+ const step = 100 / Math.max(1, values.length - 1);
17
+ const points = values
18
+ .map((value, index) => `${index * step},${28 - (value / max) * 24}`)
19
+ .join(" ");
20
+ return (_jsx("svg", { className: "rastro-campaigns__spark", viewBox: "0 0 100 30", preserveAspectRatio: "none", role: "img", "aria-label": label, children: _jsx("polyline", { points: points, fill: "none", vectorEffect: "non-scaling-stroke" }) }));
21
+ }
22
+ export function Indicators({ items, sales, }) {
23
+ return (_jsx("section", { className: "rastro-campaigns__kpis", "data-count": items.length, "aria-label": "Indicadores das campanhas", children: items.map((item) => (_jsxs("div", { className: "rastro-card rastro-campaigns__kpi", "data-highlight": item.highlight ? "true" : undefined, children: [_jsxs("div", { className: "rastro-campaigns__kpi-head", children: [_jsx("span", { className: "rastro-campaigns__kpi-label", children: item.label }), _jsx("span", { className: "rastro-campaigns__kpi-icon", children: _jsx(Icon, { name: INDICATOR_ICONS[item.key], size: 14 }) })] }), _jsx("div", { className: "rastro-campaigns__kpi-value rastro-num", "data-long": isLong(item.value) ? "true" : undefined, children: item.value }), _jsx("div", { className: "rastro-campaigns__kpi-foot", children: item.change ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "rastro-change rastro-campaigns__change", "data-trend": item.trend ?? undefined, children: item.change }), " ", _jsx("span", { children: "vs. per\u00EDodo anterior" })] })) : (_jsx("span", { children: item.detail ?? " " })) }), item.key === "won" && sales && (_jsx(Sparkline, { values: sales, label: "Vendas por dia no per\u00EDodo" }))] }, item.key))) }));
24
+ }
25
+ export function FunnelCard({ funnel }) {
26
+ return (_jsxs("section", { className: "rastro-card rastro-campaigns__funnel", "aria-label": "Do gasto \u00E0 venda", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Do gasto \u00E0 venda" }), _jsx("p", { className: "rastro-campaigns__desc", children: "Leads que chegaram por an\u00FAncio da Meta" })] }), funnel.costPerSale && (_jsx("span", { className: "rastro-campaigns__aside rastro-num", children: funnel.costPerSale }))] }), _jsx("ol", { className: "rastro-campaigns__funnel-steps", children: funnel.steps.map((step, index) => {
27
+ const link = funnel.links[index];
28
+ return (_jsxs("li", { className: "rastro-campaigns__funnel-item", children: [_jsxs("div", { className: "rastro-campaigns__funnel-step", "data-step": step.key, children: [_jsx("span", { className: "rastro-campaigns__funnel-bar" }), _jsx("span", { className: "rastro-campaigns__funnel-label", children: step.label }), _jsx("span", { className: "rastro-campaigns__funnel-value rastro-num", "data-long": isLong(step.value) ? "true" : undefined, children: step.value }), _jsx("span", { className: "rastro-campaigns__funnel-detail", children: step.detail })] }), link && (_jsxs("div", { className: "rastro-campaigns__funnel-link", children: [_jsx("b", { className: "rastro-num", children: link.value }), _jsx("span", { children: link.label })] }))] }, step.key));
29
+ }) })] }));
30
+ }
31
+ const ORGANIC_ICONS = {
32
+ global_search_new_chat: "search",
33
+ click_to_chat_link: "link",
34
+ message_short_link: "link",
35
+ status: "eye",
36
+ };
37
+ export function OrganicCard({ origins }) {
38
+ const total = origins.reduce((sum, origin) => sum + origin.leads, 0);
39
+ const max = Math.max(1, ...origins.map((origin) => origin.leads));
40
+ return (_jsxs("section", { className: "rastro-card rastro-campaigns__organic", "aria-label": "Sem an\u00FAncio", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Sem an\u00FAncio" }), _jsx("p", { className: "rastro-campaigns__desc", children: total > 0
41
+ ? `${plural(total, "lead", "leads")} · fora do custo por lead`
42
+ : "Nenhum lead orgânico no período" })] }), _jsx("span", { className: "rastro-campaigns__pill", "data-tone": "outline", children: "org\u00E2nico" })] }), origins.length > 0 && (_jsx("ul", { className: "rastro-campaigns__organic-list", children: origins.map((origin) => (_jsxs("li", { children: [_jsx(Icon, { name: ORGANIC_ICONS[origin.key] ?? "message", size: 14 }), _jsx("span", { className: "rastro-campaigns__organic-name", children: originLabel(origin.key) }), _jsx("span", { className: "rastro-campaigns__organic-track", children: _jsx("i", { style: { width: `${(origin.leads / max) * 100}%` } }) }), _jsx("b", { className: "rastro-num", children: origin.leads.toLocaleString("pt-BR") })] }, origin.key))) }))] }));
43
+ }
44
+ /** Today's origin bar, for a host without Meta spend. */
45
+ export function OriginsCard({ report }) {
46
+ const total = report.totals.leads;
47
+ return (_jsxs("section", { className: "rastro-card rastro-campaigns__origins", "aria-label": "De onde v\u00EAm os leads", children: [_jsx("header", { className: "rastro-campaigns__card-head", children: _jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "De onde v\u00EAm os leads" }), _jsx("p", { className: "rastro-campaigns__desc", children: "Porta de entrada da primeira mensagem no WhatsApp" })] }) }), _jsx("div", { className: "rastro-campaigns__origins-bar", children: report.origins.map((origin, index) => (_jsx("i", { "data-shade": Math.min(index, 4), style: {
48
+ width: `${total > 0 ? (origin.leads / total) * 100 : 0}%`,
49
+ } }, origin.key))) }), _jsx("ul", { className: "rastro-campaigns__origins-legend", children: report.origins.map((origin, index) => (_jsxs("li", { children: [_jsx("i", { "data-shade": Math.min(index, 4) }), originLabel(origin.key), " \u00B7 ", origin.leads.toLocaleString("pt-BR")] }, origin.key))) })] }));
50
+ }
51
+ /** The Meta link and the conversions it sent back, above the figures. */
52
+ export function MetaStrip({ link }) {
53
+ const { sent, pending, failed } = link.conversions;
54
+ return (_jsxs("div", { className: "rastro-campaigns__strip", role: "group", "aria-label": "Conex\u00E3o com a Meta", children: [_jsxs("span", { className: "rastro-campaigns__chip", "data-state": link.state, children: [_jsx("i", { className: "rastro-campaigns__dot" }), link.label] }), link.pixel && (_jsxs("span", { className: "rastro-campaigns__chip", "data-state": failed > 0 ? "error" : "live", children: [_jsx(Icon, { name: failed > 0 ? "alert" : "check", size: 14 }), plural(sent, "evento devolvido", "eventos devolvidos"), " pra Meta", pending > 0 && ` · ${pending.toLocaleString("pt-BR")} na fila`, failed > 0 && ` · ${failed.toLocaleString("pt-BR")} com erro`] }))] }));
55
+ }
56
+ //# sourceMappingURL=Summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Summary.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Summary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The ad's creative: the thumbnail Rastro copied from Meta, or a tinted
3
+ * placeholder with the creative's kind until the catalog brings one.
4
+ */
5
+ export declare function Thumbnail({ url, type, seed, size, }: {
6
+ url?: string | null;
7
+ type?: string | null;
8
+ seed: string;
9
+ size: "row" | "hero";
10
+ }): import("react").JSX.Element;
11
+ //# sourceMappingURL=Thumbnail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Thumbnail.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Thumbnail.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,GACL,EAAE;IACD,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACtB,+BA+BA"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "./Icons.js";
3
+ /** A stable hue per ad, so a placeholder keeps its color between renders. */
4
+ function hueOf(seed) {
5
+ let hash = 0;
6
+ for (const char of seed)
7
+ hash = (hash * 31 + char.charCodeAt(0)) >>> 0;
8
+ return hash % 360;
9
+ }
10
+ /**
11
+ * The ad's creative: the thumbnail Rastro copied from Meta, or a tinted
12
+ * placeholder with the creative's kind until the catalog brings one.
13
+ */
14
+ export function Thumbnail({ url, type, seed, size, }) {
15
+ const hue = hueOf(seed);
16
+ const video = type === "video";
17
+ return (_jsxs("span", { className: "rastro-campaigns__thumb", "data-size": size, "data-placeholder": url ? undefined : "true", style: url
18
+ ? undefined
19
+ : {
20
+ background: `linear-gradient(145deg, oklch(0.8 0.08 ${hue}), oklch(0.56 0.12 ${(hue + 25) % 360}))`,
21
+ }, "aria-hidden": "true", children: [url && _jsx("img", { src: url, alt: "", loading: "lazy" }), video && (_jsx("span", { className: "rastro-campaigns__play", children: _jsx(Icon, { name: "play", size: size === "hero" ? 22 : 10 }) })), !url && type === "carousel" && size === "hero" && (_jsx(Icon, { name: "gallery", size: 22 })), !url && type === "image" && size === "hero" && (_jsx(Icon, { name: "image", size: 22 }))] }));
22
+ }
23
+ //# sourceMappingURL=Thumbnail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Thumbnail.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,6EAA6E;AAC7E,SAAS,KAAK,CAAC,IAAY;IACzB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,IAAI;QAAE,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,IAAI,GAAG,GAAG,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,GAML;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC;IAC/B,OAAO,CACL,gBACE,SAAS,EAAC,yBAAyB,eACxB,IAAI,sBACG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAC1C,KAAK,EACH,GAAG;YACD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,UAAU,EAAE,0CAA0C,GAAG,sBAAsB,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI;aACpG,iBAEK,MAAM,aAEjB,GAAG,IAAI,cAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAC,EAAE,EAAC,OAAO,EAAC,MAAM,GAAG,EAC9C,KAAK,IAAI,CACR,eAAM,SAAS,EAAC,wBAAwB,YACtC,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAI,GAChD,CACR,EACA,CAAC,GAAG,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,CACjD,KAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAE,EAAE,GAAI,CAClC,EACA,CAAC,GAAG,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,IAAI,CAC9C,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAE,EAAE,GAAI,CAChC,IACI,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { LeadsReport } from "../../client/index.js";
2
+ import type { Money, SpendMode } from "./model.js";
3
+ export declare function CampaignTree({ report, mode, money, selectedAdId, onSelectAd, }: {
4
+ report: LeadsReport;
5
+ mode: SpendMode;
6
+ money: Money;
7
+ selectedAdId: string | null;
8
+ onSelectAd: (adId: string | null) => void;
9
+ }): import("react").JSX.Element;
10
+ /** What the return colors mean, under the table, from `RETURN_BANDS`. */
11
+ export declare function BandLegend(): import("react").JSX.Element;
12
+ //# sourceMappingURL=Tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Tree.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAsBzD,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqKnD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,GACX,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C,+BAiMA;AAID,yEAAyE;AACzE,wBAAgB,UAAU,gCAyBzB"}