@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,105 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { formatReturn, paidFunnel, returnBand, RETURN_BAND_LABELS, RETURN_BANDS, rowMetrics, } from "../metrics.js";
4
+ import { AppGlyph, Icon } from "./Icons.js";
5
+ import { adLabel, adsetLabel, adStatusLabel, campaignApps, campaignLabel, CREATIVE_LABELS, findAd, plural, } from "./labels.js";
6
+ import { Thumbnail } from "./Thumbnail.js";
7
+ const campaignKey = (id) => `c:${id ?? ""}`;
8
+ const adsetKey = (campaign, adset) => `${campaignKey(campaign)}:a:${adset ?? ""}`;
9
+ /**
10
+ * Starts like the mockup: the first campaign and its first ad set open, the
11
+ * rest folded, and whatever holds the selected ad open too.
12
+ */
13
+ function initialCollapsed(report, selectedAdId) {
14
+ const collapsed = new Set();
15
+ const selected = findAd(report, selectedAdId);
16
+ report.campaigns.forEach((campaign, campaignIndex) => {
17
+ const holdsSelected = selected?.campaign === campaign;
18
+ if (campaignIndex > 0 && !holdsSelected) {
19
+ collapsed.add(campaignKey(campaign.campaignId));
20
+ }
21
+ campaign.adsets.forEach((adset, adsetIndex) => {
22
+ const open = selected
23
+ ? selected.adset === adset
24
+ : campaignIndex === 0 && adsetIndex === 0;
25
+ if (!open)
26
+ collapsed.add(adsetKey(campaign.campaignId, adset.adsetId));
27
+ });
28
+ });
29
+ return collapsed;
30
+ }
31
+ function Figures({ row, mode, money, }) {
32
+ const metrics = rowMetrics(row);
33
+ const count = (value) => (_jsx("td", { className: "rastro-campaigns__n rastro-num", children: value.toLocaleString("pt-BR") }));
34
+ if (mode === "none") {
35
+ return (_jsxs(_Fragment, { children: [count(row.leads), count(row.qualified), count(row.won), _jsx("td", { className: "rastro-campaigns__n rastro-num", children: money.revenue(row.revenueCents) }), _jsx("td", { className: "rastro-campaigns__bar-cell", children: _jsxs("span", { className: "rastro-campaigns__rowbar", role: "img", "aria-label": `${row.leads} leads, ${row.qualified} qualificados, ${row.won} vendas`, children: [_jsx("i", { style: {
36
+ width: `${row.leads > 0 ? (row.qualified / row.leads) * 100 : 0}%`,
37
+ } }), _jsx("i", { style: {
38
+ width: `${row.leads > 0 ? (row.won / row.leads) * 100 : 0}%`,
39
+ } })] }) })] }));
40
+ }
41
+ const band = returnBand(metrics.returnOnSpend);
42
+ return (_jsxs(_Fragment, { children: [_jsx("td", { className: "rastro-campaigns__n rastro-num", children: money.spend(row.spendCents) }), count(row.leads), _jsx("td", { className: "rastro-campaigns__n rastro-num", children: money.spend(metrics.costPerLeadCents) }), count(row.qualified), count(row.won), _jsx("td", { className: "rastro-campaigns__n rastro-num", children: money.revenue(row.revenueCents) }), mode === "full" && (_jsx("td", { className: "rastro-campaigns__n", children: _jsx("span", { className: "rastro-band", "data-band": band ?? undefined, title: band ? `Retorno ${RETURN_BAND_LABELS[band]}` : undefined, children: formatReturn(metrics.returnOnSpend) }) }))] }));
43
+ }
44
+ function NameCell({ depth, title, meta, lead, }) {
45
+ return (_jsxs("div", { className: "rastro-campaigns__name", "data-depth": depth, style: { paddingLeft: depth * 20 }, children: [lead, _jsxs("div", { className: "rastro-campaigns__name-text", children: [_jsx("div", { className: "rastro-campaigns__name-title", children: title }), meta && _jsx("div", { className: "rastro-campaigns__name-meta", children: meta })] })] }));
46
+ }
47
+ function Toggle({ open, label, onToggle, }) {
48
+ return (_jsx("button", { type: "button", className: "rastro-campaigns__toggle", "aria-expanded": open, "aria-label": `${open ? "Recolher" : "Expandir"} ${label}`, onClick: onToggle, children: _jsx(Icon, { name: open ? "chevronDown" : "chevronRight", size: 14 }) }));
49
+ }
50
+ function adMeta(ad) {
51
+ const kind = ad.creativeType ? CREATIVE_LABELS[ad.creativeType] : null;
52
+ return (_jsxs(_Fragment, { children: [_jsx(AppGlyph, { app: ad.sourceApp, size: 11 }), kind ?? "Anúncio", ad.adStatus &&
53
+ ad.adStatus !== "ACTIVE" &&
54
+ ` · ${adStatusLabel(ad.adStatus)}`] }));
55
+ }
56
+ export function CampaignTree({ report, mode, money, selectedAdId, onSelectAd, }) {
57
+ const [collapsed, setCollapsed] = useState(() => initialCollapsed(report, selectedAdId));
58
+ const toggle = (key) => setCollapsed((current) => {
59
+ const next = new Set(current);
60
+ if (next.has(key))
61
+ next.delete(key);
62
+ else
63
+ next.add(key);
64
+ return next;
65
+ });
66
+ const adRow = (ad, key) => {
67
+ const selected = ad.adId === selectedAdId;
68
+ return (_jsxs("tr", { className: "rastro-campaigns__row", "data-depth": 2, "data-selected": selected ? "true" : undefined, children: [_jsx("td", { className: "rastro-campaigns__name-cell", children: _jsx(NameCell, { depth: 2, lead: _jsx(Thumbnail, { url: ad.thumbnailUrl, type: ad.creativeType, seed: ad.adId, size: "row" }), title: _jsx("button", { type: "button", className: "rastro-campaigns__ad-button", "aria-pressed": selected, onClick: () => onSelectAd(selected ? null : ad.adId), children: adLabel(ad) }), meta: adMeta(ad) }) }), _jsx(Figures, { row: ad, mode: mode, money: money })] }, key));
69
+ };
70
+ const rows = [];
71
+ for (const campaign of report.campaigns) {
72
+ const cKey = campaignKey(campaign.campaignId);
73
+ const campaignOpen = !collapsed.has(cKey);
74
+ const pending = campaign.campaignId === null;
75
+ const apps = campaignApps(campaign);
76
+ rows.push(_jsxs("tr", { className: "rastro-campaigns__row", "data-depth": 0, children: [_jsx("td", { className: "rastro-campaigns__name-cell", children: _jsx(NameCell, { depth: 0, lead: _jsx(Toggle, { open: campaignOpen, label: campaignLabel(campaign), onToggle: () => toggle(cKey) }), title: campaignLabel(campaign), meta: pending ? (_jsxs(_Fragment, { children: [_jsx(Icon, { name: "info", size: 12 }), "Os nomes chegam quando a conta de an\u00FAncios for conectada"] })) : (_jsxs(_Fragment, { children: [apps.map((app) => (_jsx(AppGlyph, { app: app, size: 11 }, app))), plural(campaign.adsets.length, "conjunto", "conjuntos")] })) }) }), _jsx(Figures, { row: campaign, mode: mode, money: money })] }, cKey));
77
+ if (!campaignOpen)
78
+ continue;
79
+ for (const adset of campaign.adsets) {
80
+ const aKey = adsetKey(campaign.campaignId, adset.adsetId);
81
+ // Ads not named yet have no ad set to open: list them straight away.
82
+ if (!pending) {
83
+ const adsetOpen = !collapsed.has(aKey);
84
+ rows.push(_jsxs("tr", { className: "rastro-campaigns__row", "data-depth": 1, children: [_jsx("td", { className: "rastro-campaigns__name-cell", children: _jsx(NameCell, { depth: 1, lead: _jsx(Toggle, { open: adsetOpen, label: adsetLabel(adset), onToggle: () => toggle(aKey) }), title: adsetLabel(adset), meta: `Conjunto · ${plural(adset.ads.length, "anúncio", "anúncios")}` }) }), _jsx(Figures, { row: adset, mode: mode, money: money })] }, aKey));
85
+ if (!adsetOpen)
86
+ continue;
87
+ }
88
+ for (const ad of adset.ads)
89
+ rows.push(adRow(ad, `${aKey}:${ad.adId}`));
90
+ }
91
+ }
92
+ return (_jsx("div", { className: "rastro-campaigns__table-wrap", "data-slot": "table-container", children: _jsxs("table", { className: "rastro-campaigns__table", "data-mode": mode, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Nome" }), mode === "none" ? (_jsxs(_Fragment, { children: [_jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Leads" }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Qualif." }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Vendas" }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Receita" }), _jsx("th", { scope: "col", className: "rastro-campaigns__bar-cell", children: _jsxs("span", { className: "rastro-campaigns__bar-legend", children: [_jsx("i", { "data-layer": "lead" }), "lead", _jsx("i", { "data-layer": "qualified" }), "qualif.", _jsx("i", { "data-layer": "won" }), "venda"] }) })] })) : (_jsxs(_Fragment, { children: [_jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Gasto" }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Leads" }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: _jsx("abbr", { title: "Custo por lead", children: "CPL" }) }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Qualif." }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Vendas" }), _jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Receita" }), mode === "full" && (_jsx("th", { scope: "col", className: "rastro-campaigns__n", children: "Retorno" }))] }))] }) }), _jsx("tbody", { children: rows }), mode !== "none" && (_jsx("tfoot", { children: _jsxs("tr", { children: [_jsx("td", { children: "Total com an\u00FAncio" }), _jsx(Figures, { row: paidFunnel(report).row, mode: mode, money: money })] }) }))] }) }));
93
+ }
94
+ const bandNumber = (value) => value.toLocaleString("pt-BR");
95
+ /** What the return colors mean, under the table, from `RETURN_BANDS`. */
96
+ export function BandLegend() {
97
+ const { strong, ok } = RETURN_BANDS;
98
+ const keys = [
99
+ ["strong", `≥ ${bandNumber(strong)}x`],
100
+ ["ok", `${bandNumber(ok)}–${bandNumber(strong)}x`],
101
+ ["weak", `< ${bandNumber(ok)}x`],
102
+ ];
103
+ return (_jsxs("div", { className: "rastro-campaigns__bands", children: [_jsx("span", { className: "rastro-campaigns__bands-rule", children: "Retorno = receita \u00F7 gasto" }), keys.map(([band, range]) => (_jsxs("span", { children: [_jsx("span", { className: "rastro-band rastro-campaigns__band-key", "data-band": band, children: range }), RETURN_BAND_LABELS[band]] }, band)))] }));
104
+ }
105
+ //# sourceMappingURL=Tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Tree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Brand glyphs for the apps an ad ran on and the channel a lead wrote from,
3
+ * copied from simple-icons (CC0) so the package ships no icon dependency.
4
+ */
5
+ export declare const BRAND_GLYPHS: {
6
+ readonly instagram: {
7
+ readonly hex: "#FF0069";
8
+ readonly path: "M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077";
9
+ };
10
+ readonly facebook: {
11
+ readonly hex: "#0866FF";
12
+ readonly path: "M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z";
13
+ };
14
+ readonly whatsapp: {
15
+ readonly hex: "#25D366";
16
+ readonly path: "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z";
17
+ };
18
+ };
19
+ export type BrandKey = keyof typeof BRAND_GLYPHS;
20
+ //# sourceMappingURL=glyphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glyphs.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/glyphs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,YAAY;aACvB,SAAS;iBACP,GAAG,EAAE,SAAS;iBACd,IAAI,EAAE,s8DAAs8D;;aAE98D,QAAQ;iBACN,GAAG,EAAE,SAAS;iBACd,IAAI,EAAE,gbAAgb;;aAExb,QAAQ;iBACN,GAAG,EAAE,SAAS;iBACd,IAAI,EAAE,klCAAklC;;CAEllC,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Brand glyphs for the apps an ad ran on and the channel a lead wrote from,
3
+ * copied from simple-icons (CC0) so the package ships no icon dependency.
4
+ */
5
+ export const BRAND_GLYPHS = {
6
+ instagram: {
7
+ hex: "#FF0069",
8
+ path: "M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077",
9
+ },
10
+ facebook: {
11
+ hex: "#0866FF",
12
+ path: "M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z",
13
+ },
14
+ whatsapp: {
15
+ hex: "#25D366",
16
+ path: "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z",
17
+ },
18
+ };
19
+ //# sourceMappingURL=glyphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glyphs.js","sourceRoot":"","sources":["../../../src/ui/campaigns/glyphs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE;QACT,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,s8DAAs8D;KAC78D;IACD,QAAQ,EAAE;QACR,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,gbAAgb;KACvb;IACD,QAAQ,EAAE;QACR,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,klCAAklC;KACzlC;CACO,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { CampaignsView, type CampaignsViewProps } from "./CampaignsView.js";
2
+ export type { CampaignsMode, CreativesModeProps } from "./modes.js";
3
+ export { funnel as campaignsFunnel, indicators as campaignsIndicators, metaLink, organicOrigins, spendMode, type Funnel, type Indicator, type MetaLink, type SpendMode, } from "./model.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EACL,MAAM,IAAI,eAAe,EACzB,UAAU,IAAI,mBAAmB,EACjC,QAAQ,EACR,cAAc,EACd,SAAS,EACT,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,SAAS,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CampaignsView } from "./CampaignsView.js";
2
+ export { funnel as campaignsFunnel, indicators as campaignsIndicators, metaLink, organicOrigins, spendMode, } from "./model.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/campaigns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EACL,MAAM,IAAI,eAAe,EACzB,UAAU,IAAI,mBAAmB,EACjC,QAAQ,EACR,cAAc,EACd,SAAS,GAKV,MAAM,YAAY,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * The words and small lookups Campanhas shows: origin and stage names, row
3
+ * labels for ads Meta has not named yet, initials, relative times. Pure, so
4
+ * the view and its tests read the same strings.
5
+ */
6
+ import type { LeadJourney, LeadsReport, LeadSummary } from "../../client/index.js";
7
+ export type CampaignRow = LeadsReport["campaigns"][number];
8
+ export type AdsetRow = CampaignRow["adsets"][number];
9
+ export type AdRow = AdsetRow["ads"][number];
10
+ export type OriginRow = LeadsReport["origins"][number];
11
+ export type JourneyEvent = NonNullable<LeadJourney>["events"][number];
12
+ /** The ad origin: what spend buys. Every other origin is organic. */
13
+ export declare const AD_ORIGIN = "ctwa_ad";
14
+ /** Where a WhatsApp conversation started, as the host reported it. */
15
+ export declare const ORIGIN_LABELS: Record<string, string>;
16
+ export declare function originLabel(key: string): string;
17
+ export declare const STAGE_LABELS: Record<LeadSummary["stage"], string>;
18
+ export declare const APP_LABELS: Record<string, string>;
19
+ export declare function appLabel(app: string | null | undefined): string | null;
20
+ export declare const CREATIVE_LABELS: Record<string, string>;
21
+ /** Meta's effective status in the manager's words; unknown ones stay raw. */
22
+ export declare const AD_STATUS_LABELS: Record<string, string>;
23
+ export declare function adStatusLabel(status: string | null | undefined): string | null;
24
+ /** `120200000000000001` → `1202…0001`: enough to tell ads apart. */
25
+ export declare function shortAdId(adId: string): string;
26
+ export declare function adLabel(ad: Pick<AdRow, "adId" | "adName">): string;
27
+ export declare function campaignLabel(campaign: Pick<CampaignRow, "campaignName">): string;
28
+ export declare function adsetLabel(adset: Pick<AdsetRow, "adsetName">): string;
29
+ /** "1 conjunto", "2 conjuntos". */
30
+ export declare function plural(count: number, one: string, many: string): string;
31
+ /** The apps a campaign's ads ran on, in first-seen order. */
32
+ export declare function campaignApps(campaign: CampaignRow): string[];
33
+ export interface FoundAd {
34
+ ad: AdRow;
35
+ campaign: CampaignRow;
36
+ adset: AdsetRow;
37
+ }
38
+ export declare function findAd(report: LeadsReport | undefined, adId: string | null): FoundAd | undefined;
39
+ /** The ads Meta counts in a report, whatever campaign they sit in. */
40
+ export declare function adCount(report: LeadsReport): number;
41
+ /** A figure long enough to need a smaller type to fit its box. */
42
+ export declare function isLong(value: string): boolean;
43
+ /** "Marina C." → "MC"; "?" without a name. */
44
+ export declare function initials(label: string | null): string;
45
+ /** "agora", "há 12 min", "há 2 h", "ontem", "há 3 d". */
46
+ export declare function relativeTime(at: number, now: number): string;
47
+ /** "26/09 · 10:41", in Brasília time like the rest of the screen. */
48
+ export declare function dateTimeLabel(at: number): string;
49
+ /** The app the first message came through: "no Instagram", or null. */
50
+ export declare function arrivalLabel(journey: NonNullable<LeadJourney>): string | null;
51
+ /** One line per event in a lead's history, in the manager's words. */
52
+ export declare function journeyStepLabel(event: JourneyEvent, journey: NonNullable<LeadJourney>, money: (cents: number) => string): string;
53
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ /** The ad origin: what spend buys. Every other origin is organic. */
2
+ export const AD_ORIGIN = "ctwa_ad";
3
+ /** Where a WhatsApp conversation started, as the host reported it. */
4
+ export const ORIGIN_LABELS = {
5
+ ctwa_ad: "Anúncio",
6
+ click_to_chat_link: "Link na bio",
7
+ message_short_link: "Link do WhatsApp",
8
+ global_search_new_chat: "Busca no WhatsApp",
9
+ phone_number_hyperlink: "Número clicado em página",
10
+ status: "Status",
11
+ none: "Sem porta de entrada",
12
+ };
13
+ export function originLabel(key) {
14
+ return ORIGIN_LABELS[key] ?? key;
15
+ }
16
+ export const STAGE_LABELS = {
17
+ lead: "Lead",
18
+ qualified: "Qualificado",
19
+ won: "Venda",
20
+ lost: "Perdido",
21
+ };
22
+ export const APP_LABELS = {
23
+ instagram: "Instagram",
24
+ facebook: "Facebook",
25
+ messenger: "Messenger",
26
+ whatsapp: "WhatsApp",
27
+ };
28
+ export function appLabel(app) {
29
+ if (!app)
30
+ return null;
31
+ return APP_LABELS[app.toLowerCase()] ?? app;
32
+ }
33
+ export const CREATIVE_LABELS = {
34
+ video: "Vídeo",
35
+ image: "Imagem",
36
+ carousel: "Carrossel",
37
+ other: "Anúncio",
38
+ };
39
+ /** Meta's effective status in the manager's words; unknown ones stay raw. */
40
+ export const AD_STATUS_LABELS = {
41
+ ACTIVE: "ativo",
42
+ PAUSED: "pausado",
43
+ CAMPAIGN_PAUSED: "pausado",
44
+ ADSET_PAUSED: "pausado",
45
+ DISAPPROVED: "reprovado",
46
+ PENDING_REVIEW: "em análise",
47
+ IN_PROCESS: "em análise",
48
+ ARCHIVED: "arquivado",
49
+ DELETED: "arquivado",
50
+ WITH_ISSUES: "com problema",
51
+ };
52
+ export function adStatusLabel(status) {
53
+ if (!status)
54
+ return null;
55
+ return AD_STATUS_LABELS[status] ?? status;
56
+ }
57
+ /** `120200000000000001` → `1202…0001`: enough to tell ads apart. */
58
+ export function shortAdId(adId) {
59
+ return adId.length > 10 ? `${adId.slice(0, 4)}…${adId.slice(-4)}` : adId;
60
+ }
61
+ export function adLabel(ad) {
62
+ return ad.adName ?? `Anúncio ${shortAdId(ad.adId)}`;
63
+ }
64
+ export function campaignLabel(campaign) {
65
+ return campaign.campaignName ?? "Anúncios ainda sem nome";
66
+ }
67
+ export function adsetLabel(adset) {
68
+ return adset.adsetName ?? "Conjunto sem nome";
69
+ }
70
+ /** "1 conjunto", "2 conjuntos". */
71
+ export function plural(count, one, many) {
72
+ return `${count.toLocaleString("pt-BR")} ${count === 1 ? one : many}`;
73
+ }
74
+ /** The apps a campaign's ads ran on, in first-seen order. */
75
+ export function campaignApps(campaign) {
76
+ const apps = [];
77
+ for (const adset of campaign.adsets) {
78
+ for (const ad of adset.ads) {
79
+ if (ad.sourceApp && !apps.includes(ad.sourceApp))
80
+ apps.push(ad.sourceApp);
81
+ }
82
+ }
83
+ return apps;
84
+ }
85
+ export function findAd(report, adId) {
86
+ if (!report || !adId)
87
+ return undefined;
88
+ for (const campaign of report.campaigns) {
89
+ for (const adset of campaign.adsets) {
90
+ const ad = adset.ads.find((row) => row.adId === adId);
91
+ if (ad)
92
+ return { ad, campaign, adset };
93
+ }
94
+ }
95
+ return undefined;
96
+ }
97
+ /** The ads Meta counts in a report, whatever campaign they sit in. */
98
+ export function adCount(report) {
99
+ return report.campaigns.reduce((sum, campaign) => sum + campaign.adsets.reduce((acc, adset) => acc + adset.ads.length, 0), 0);
100
+ }
101
+ /** A figure long enough to need a smaller type to fit its box. */
102
+ export function isLong(value) {
103
+ return value.length > 10;
104
+ }
105
+ /** "Marina C." → "MC"; "?" without a name. */
106
+ export function initials(label) {
107
+ if (!label)
108
+ return "?";
109
+ const parts = label
110
+ .replace(/[^\p{L}\s]/gu, "")
111
+ .trim()
112
+ .split(/\s+/);
113
+ return ((parts[0]?.[0] ?? "?").toUpperCase() + (parts[1]?.[0] ?? "").toUpperCase());
114
+ }
115
+ const MINUTE = 60_000;
116
+ const HOUR = 60 * MINUTE;
117
+ const DAY = 24 * HOUR;
118
+ /** "agora", "há 12 min", "há 2 h", "ontem", "há 3 d". */
119
+ export function relativeTime(at, now) {
120
+ const delta = Math.max(0, now - at);
121
+ if (delta < MINUTE)
122
+ return "agora";
123
+ if (delta < HOUR)
124
+ return `há ${Math.floor(delta / MINUTE)} min`;
125
+ if (delta < DAY)
126
+ return `há ${Math.floor(delta / HOUR)} h`;
127
+ if (delta < 2 * DAY)
128
+ return "ontem";
129
+ return `há ${Math.floor(delta / DAY)} d`;
130
+ }
131
+ const dateTime = new Intl.DateTimeFormat("pt-BR", {
132
+ day: "2-digit",
133
+ month: "2-digit",
134
+ hour: "2-digit",
135
+ minute: "2-digit",
136
+ timeZone: "America/Sao_Paulo",
137
+ });
138
+ /** "26/09 · 10:41", in Brasília time like the rest of the screen. */
139
+ export function dateTimeLabel(at) {
140
+ return dateTime.format(at).replace(",", " ·");
141
+ }
142
+ /** The app the first message came through: "no Instagram", or null. */
143
+ export function arrivalLabel(journey) {
144
+ const app = appLabel(journey.ad?.sourceApp ?? journey.lead.sourceApp);
145
+ return app ? `no ${app}` : null;
146
+ }
147
+ /** One line per event in a lead's history, in the manager's words. */
148
+ export function journeyStepLabel(event, journey, money) {
149
+ switch (event.type) {
150
+ case "created": {
151
+ if (journey.ad || journey.lead.originKey === AD_ORIGIN) {
152
+ const name = journey.ad?.adName ?? journey.ad?.title;
153
+ return name ? `Chegou pelo anúncio "${name}"` : "Chegou por um anúncio";
154
+ }
155
+ return `Primeira mensagem · ${originLabel(journey.lead.originKey)}`;
156
+ }
157
+ case "qualified":
158
+ return "Qualificado no atendimento";
159
+ case "won":
160
+ return event.revenueCents === null
161
+ ? "Venda registrada"
162
+ : `Venda de ${money(event.revenueCents)}`;
163
+ case "lost":
164
+ return "Marcado como perdido";
165
+ case "open":
166
+ return "Reaberto";
167
+ }
168
+ }
169
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../../src/ui/campaigns/labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * What Campanhas derives from a report before drawing it: which totals the
3
+ * figures read (the ad origin once Meta spend is known, every lead without
4
+ * it), the six indicators and their change, the funnel, the organic origins
5
+ * and the Meta link's state. Pure, so the view stays thin and testable.
6
+ */
7
+ import type { LeadsDaily, LeadsReport, MetaStatus } from "../../client/index.js";
8
+ import { type FunnelRow } from "../metrics.js";
9
+ /** How spend shows: none (no Meta), full (spend + return), or spend only. */
10
+ export type SpendMode = "none" | "full" | "spendOnly";
11
+ /**
12
+ * "none" without known spend. "spendOnly" when spend and revenue are not in
13
+ * one currency (the ad account differs, or the sites sell in several), so a
14
+ * return would divide one currency by another. "full" otherwise.
15
+ */
16
+ export declare function spendMode(report: LeadsReport): SpendMode;
17
+ /**
18
+ * The row the indicators read in `mode`: every lead without spend, the paid
19
+ * funnel with it. Both periods read the current period's mode, so a change
20
+ * never compares paid leads against every lead.
21
+ */
22
+ export declare function headlineRow(report: LeadsReport, mode: SpendMode): FunnelRow;
23
+ /**
24
+ * The note for a report where some site bought ads with no known spend:
25
+ * those leads stay out of spend, cost per lead and return.
26
+ */
27
+ export declare function partialSpendNote(report: LeadsReport): string | null;
28
+ export interface Money {
29
+ /** Revenue, in the report's currency. */
30
+ revenue: (cents: number | null | undefined) => string;
31
+ /** Spend and per-unit costs, in the ad account's currency. */
32
+ spend: (cents: number | null | undefined) => string;
33
+ }
34
+ export declare function moneyFor(report: LeadsReport): Money;
35
+ export type Trend = "good" | "bad";
36
+ export interface Indicator {
37
+ key: "spend" | "leads" | "costPerLead" | "qualified" | "won" | "revenue" | "return";
38
+ label: string;
39
+ value: string;
40
+ /** "+8%", "−9%", "+1,6x"; null without a previous period to compare. */
41
+ change: string | null;
42
+ /** Whether the change is good news; null when it is neither (spend). */
43
+ trend: Trend | null;
44
+ /** A line under the value when there is no previous period. */
45
+ detail?: string;
46
+ highlight?: boolean;
47
+ }
48
+ /**
49
+ * The indicator row. With spend: Gasto, Leads, Custo por lead, Vendas,
50
+ * Receita, Retorno (Retorno drops when the currencies differ). Without it:
51
+ * today's four, Leads, Qualificados, Vendas, Receita.
52
+ */
53
+ export declare function indicators(report: LeadsReport, previous?: LeadsReport): Indicator[];
54
+ export interface FunnelStep {
55
+ key: "spend" | "leads" | "qualified" | "won";
56
+ label: string;
57
+ value: string;
58
+ detail: string;
59
+ }
60
+ export interface FunnelLink {
61
+ value: string;
62
+ label: string;
63
+ }
64
+ export interface Funnel {
65
+ steps: FunnelStep[];
66
+ /** The figure between step i and i + 1. */
67
+ links: FunnelLink[];
68
+ /** "R$ 102,44 por venda", or null without a sale. */
69
+ costPerSale: string | null;
70
+ }
71
+ /** Gasto → Leads → Qualificados → Vendas, for the leads spend bought. */
72
+ export declare function funnel(report: LeadsReport): Funnel;
73
+ export interface OrganicOrigin {
74
+ key: string;
75
+ leads: number;
76
+ }
77
+ /** The origins no ad paid for, most leads first. */
78
+ export declare function organicOrigins(report: LeadsReport): OrganicOrigin[];
79
+ export interface MetaLink {
80
+ state: "live" | "syncing" | "error" | "unlinked";
81
+ /** "Meta conectada · atualizado há 12 min". */
82
+ label: string;
83
+ /** The conversions every site queued, all events. */
84
+ conversions: {
85
+ pending: number;
86
+ sent: number;
87
+ failed: number;
88
+ };
89
+ /** Whether any site sends conversions to a pixel. */
90
+ pixel: boolean;
91
+ }
92
+ /** One line for the Meta link of the sites on screen. */
93
+ export declare function metaLink(status: MetaStatus, now: number): MetaLink;
94
+ /**
95
+ * Sales per day for the line on the Vendas indicator. The daily series only
96
+ * counts ad leads, so it draws only when the card does too (with spend).
97
+ */
98
+ export declare function salesPerDay(daily: LeadsDaily | undefined, mode: SpendMode): number[] | null;
99
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/model.ts"],"names":[],"mappings":"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"}