@iann29/rastro 0.9.0 → 0.10.0

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 (257) 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 +637 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +385 -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 +277 -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 +352 -0
  35. package/dist/component/meta.d.ts.map +1 -0
  36. package/dist/component/meta.js +1239 -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 +98 -0
  55. package/dist/component/pipeline.d.ts.map +1 -0
  56. package/dist/component/pipeline.js +324 -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 +19 -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 +97 -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 +38 -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 +127 -0
  137. package/dist/ui/integrations/ClientsTable.js.map +1 -0
  138. package/dist/ui/integrations/Connect.d.ts +29 -0
  139. package/dist/ui/integrations/Connect.d.ts.map +1 -0
  140. package/dist/ui/integrations/Connect.js +49 -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 +94 -0
  145. package/dist/ui/integrations/Connection.js.map +1 -0
  146. package/dist/ui/integrations/Dialogs.d.ts +18 -0
  147. package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
  148. package/dist/ui/integrations/Dialogs.js +25 -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 +57 -0
  153. package/dist/ui/integrations/EventsFeed.js.map +1 -0
  154. package/dist/ui/integrations/EventsSheet.d.ts +28 -0
  155. package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
  156. package/dist/ui/integrations/EventsSheet.js +121 -0
  157. package/dist/ui/integrations/EventsSheet.js.map +1 -0
  158. package/dist/ui/integrations/Icons.d.ts +36 -0
  159. package/dist/ui/integrations/Icons.d.ts.map +1 -0
  160. package/dist/ui/integrations/Icons.js +38 -0
  161. package/dist/ui/integrations/Icons.js.map +1 -0
  162. package/dist/ui/integrations/IntegrationsView.d.ts +14 -0
  163. package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
  164. package/dist/ui/integrations/IntegrationsView.js +113 -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/RowMenu.d.ts +15 -0
  171. package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
  172. package/dist/ui/integrations/RowMenu.js +47 -0
  173. package/dist/ui/integrations/RowMenu.js.map +1 -0
  174. package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
  175. package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
  176. package/dist/ui/integrations/UnlinkDialog.js +29 -0
  177. package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
  178. package/dist/ui/integrations/format.d.ts +28 -0
  179. package/dist/ui/integrations/format.d.ts.map +1 -0
  180. package/dist/ui/integrations/format.js +101 -0
  181. package/dist/ui/integrations/format.js.map +1 -0
  182. package/dist/ui/integrations/index.d.ts +5 -0
  183. package/dist/ui/integrations/index.d.ts.map +1 -0
  184. package/dist/ui/integrations/index.js +3 -0
  185. package/dist/ui/integrations/index.js.map +1 -0
  186. package/dist/ui/integrations/model.d.ts +84 -0
  187. package/dist/ui/integrations/model.d.ts.map +1 -0
  188. package/dist/ui/integrations/model.js +131 -0
  189. package/dist/ui/integrations/model.js.map +1 -0
  190. package/dist/ui/integrations/overlay.d.ts +10 -0
  191. package/dist/ui/integrations/overlay.d.ts.map +1 -0
  192. package/dist/ui/integrations/overlay.js +77 -0
  193. package/dist/ui/integrations/overlay.js.map +1 -0
  194. package/dist/ui/integrations/parts.d.ts +36 -0
  195. package/dist/ui/integrations/parts.d.ts.map +1 -0
  196. package/dist/ui/integrations/parts.js +85 -0
  197. package/dist/ui/integrations/parts.js.map +1 -0
  198. package/dist/ui/integrations/types.d.ts +96 -0
  199. package/dist/ui/integrations/types.d.ts.map +1 -0
  200. package/dist/ui/integrations/types.js +2 -0
  201. package/dist/ui/integrations/types.js.map +1 -0
  202. package/dist/ui/metrics.d.ts +106 -0
  203. package/dist/ui/metrics.d.ts.map +1 -0
  204. package/dist/ui/metrics.js +166 -0
  205. package/dist/ui/metrics.js.map +1 -0
  206. package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
  207. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
  208. package/dist/ui/portfolio/PortfolioView.js +216 -0
  209. package/dist/ui/portfolio/PortfolioView.js.map +1 -0
  210. package/dist/ui/portfolio/SpendChart.d.ts +10 -0
  211. package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
  212. package/dist/ui/portfolio/SpendChart.js +196 -0
  213. package/dist/ui/portfolio/SpendChart.js.map +1 -0
  214. package/dist/ui/portfolio/alerts.d.ts +74 -0
  215. package/dist/ui/portfolio/alerts.d.ts.map +1 -0
  216. package/dist/ui/portfolio/alerts.js +291 -0
  217. package/dist/ui/portfolio/alerts.js.map +1 -0
  218. package/dist/ui/portfolio/figures.d.ts +79 -0
  219. package/dist/ui/portfolio/figures.d.ts.map +1 -0
  220. package/dist/ui/portfolio/figures.js +103 -0
  221. package/dist/ui/portfolio/figures.js.map +1 -0
  222. package/dist/ui/portfolio/format.d.ts +8 -0
  223. package/dist/ui/portfolio/format.d.ts.map +1 -0
  224. package/dist/ui/portfolio/format.js +28 -0
  225. package/dist/ui/portfolio/format.js.map +1 -0
  226. package/dist/ui/sample.d.ts +474 -0
  227. package/dist/ui/sample.d.ts.map +1 -0
  228. package/dist/ui/sample.js +553 -0
  229. package/dist/ui/sample.js.map +1 -0
  230. package/dist/ui/seed.d.ts +188 -0
  231. package/dist/ui/seed.d.ts.map +1 -0
  232. package/dist/ui/seed.js +563 -0
  233. package/dist/ui/seed.js.map +1 -0
  234. package/dist/ui/ui.css +3356 -0
  235. package/docs/federation.md +46 -1
  236. package/docs/meta-ads.md +746 -0
  237. package/docs/upgrading.md +95 -0
  238. package/llms.txt +3 -0
  239. package/package.json +15 -3
  240. package/src/component/_generated/api.ts +14 -0
  241. package/src/component/_generated/component.ts +323 -1
  242. package/src/component/_generated/server.ts +4 -0
  243. package/src/component/constants.ts +10 -0
  244. package/src/component/convex.config.ts +9 -0
  245. package/src/component/errors.ts +5 -1
  246. package/src/component/leads.ts +517 -17
  247. package/src/component/meta.ts +1461 -0
  248. package/src/component/metaCapi.ts +921 -0
  249. package/src/component/metaFake.ts +277 -0
  250. package/src/component/metaGraph.ts +722 -0
  251. package/src/component/metaSync.ts +1164 -0
  252. package/src/component/pipeline.ts +392 -0
  253. package/src/component/schema.ts +197 -1
  254. package/src/component/secrets.ts +98 -0
  255. package/src/component/validators.ts +376 -3
  256. package/src/tracker/generated.ts +1 -1
  257. package/src/ui/seed.ts +755 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowMenu.js","sourceRoot":"","sources":["../../../src/ui/integrations/RowMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ClientRow } from "./model.js";
2
+ import type { MetaConnection, UnlinkPreview } from "./types.js";
3
+ /**
4
+ * B6: unlinking erases the account's spend from the client, so the dialog
5
+ * says how much, offers a replacement, and asks for the client's name typed.
6
+ */
7
+ export declare function UnlinkDialog({ row, accounts, preview, permitted, busy, onRequestPreview, onConfirm, onClose, }: {
8
+ row: ClientRow;
9
+ accounts: MetaConnection["adAccounts"];
10
+ /** undefined while it loads, null when the host cannot say. */
11
+ preview: UnlinkPreview | null | undefined;
12
+ permitted: boolean;
13
+ busy: boolean;
14
+ onRequestPreview?: () => void;
15
+ onConfirm: (replaceWith?: string) => void;
16
+ onClose: () => void;
17
+ }): import("react").JSX.Element;
18
+ //# sourceMappingURL=UnlinkDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnlinkDialog.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/UnlinkDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,QAAQ,EACR,OAAO,EACP,SAAS,EACT,IAAI,EACJ,gBAAgB,EAChB,SAAS,EACT,OAAO,GACR,EAAE;IACD,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IACvC,+DAA+D;IAC/D,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,+BAkJA"}
@@ -0,0 +1,29 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useRef, useState } from "react";
3
+ import { formatMoney } from "../metrics.js";
4
+ import { Icon } from "./Icons.js";
5
+ import { Overlay } from "./Overlay.js";
6
+ /**
7
+ * B6: unlinking erases the account's spend from the client, so the dialog
8
+ * says how much, offers a replacement, and asks for the client's name typed.
9
+ */
10
+ export function UnlinkDialog({ row, accounts, preview, permitted, busy, onRequestPreview, onConfirm, onClose, }) {
11
+ const id = useId();
12
+ const [typed, setTyped] = useState("");
13
+ const [replaceWith, setReplaceWith] = useState("");
14
+ const request = useRef(onRequestPreview);
15
+ useEffect(() => {
16
+ request.current?.();
17
+ }, []);
18
+ const account = row.account;
19
+ const name = row.site.name;
20
+ const matches = typed.trim().toLocaleLowerCase("pt-BR") ===
21
+ name.trim().toLocaleLowerCase("pt-BR");
22
+ const free = accounts.filter((option) => option.linkedSiteId === null &&
23
+ !option.linkedOutsideScope &&
24
+ option.adAccountId !== account.adAccountId);
25
+ return (_jsx(Overlay, { role: "alertdialog", labelledBy: `${id}-title`, describedBy: `${id}-desc`, onClose: onClose, children: _jsxs("div", { className: "rastro-integrations__dialog", children: [_jsxs("div", { className: "rastro-integrations__dialog-head", children: [_jsx("span", { className: "rastro-integrations__danger-tile", children: _jsx(Icon, { name: "unlink", size: 20 }) }), _jsxs("div", { children: [_jsxs("h3", { id: `${id}-title`, className: "rastro-integrations__dialog-title", children: ["Desvincular a conta da ", name, "?"] }), _jsxs("p", { id: `${id}-desc`, className: "rastro-integrations__desc rastro-integrations__lede", children: [_jsx("b", { children: row.accountName }), " ", _jsx("span", { className: "rastro-integrations__mono", children: account.adAccountId }), " ", "deixa de alimentar a ", name, "."] })] })] }), _jsxs("div", { className: "rastro-integrations__callout", "data-tone": "bad", "data-stack": "", children: [_jsxs("strong", { className: "rastro-integrations__row-gap", "data-gap": "8", children: [_jsx(Icon, { name: "trash", size: 14 }), " O gasto desta conta \u00E9 apagado da", " ", name] }), _jsxs("ul", { className: "rastro-integrations__bullets", children: [_jsx("li", { children: preview ? (_jsxs(_Fragment, { children: [_jsxs("b", { children: [preview.partial ? "pelo menos " : "", formatMoney(preview.spendCents, preview.currency)] }), " ", "de gasto em ", preview.days, " dias e o custo por lead e o retorno que vinham dele"] })) : preview === null ? ("Todo o gasto lido desta conta e o custo por lead e o retorno que vinham dele") : (_jsx("span", { className: "rastro-skeleton rastro-integrations__line-skeleton" })) }), _jsxs("li", { children: ["As campanhas somem da tela Campanhas da ", name, "; leads e vendas ficam"] }), _jsx("li", { children: "Ligar de novo rel\u00EA os 90 dias desde o come\u00E7o (leva alguns minutos)" })] })] }), _jsxs("div", { className: "rastro-integrations__field", children: [_jsx("label", { htmlFor: `${id}-swap`, children: "Trocar por outra conta (opcional)" }), _jsxs("span", { className: "rastro-integrations__select", "data-tone": "none", children: [_jsxs("select", { id: `${id}-swap`, value: replaceWith, onChange: (event) => setReplaceWith(event.target.value), children: [_jsx("option", { value: "", children: "S\u00F3 desvincular, sem conta nova" }), free.map((option) => (_jsxs("option", { value: option.adAccountId, children: [option.name, " \u00B7 ", option.adAccountId] }, option.adAccountId)))] }), _jsx(Icon, { name: "chevronDown", size: 14 })] }), _jsxs("span", { className: "rastro-integrations__hint", children: ["O pixel e os eventos da ", name, " n\u00E3o mudam."] })] }), _jsxs("div", { className: "rastro-integrations__field", children: [_jsxs("label", { htmlFor: `${id}-confirm`, children: ["Para confirmar, digite ", _jsx("b", { children: name })] }), _jsx("input", { id: `${id}-confirm`, className: "rastro-integrations__input", autoComplete: "off", spellCheck: false, value: typed, onChange: (event) => setTyped(event.target.value) })] }), _jsxs("div", { className: "rastro-integrations__dialog-foot", children: [_jsx("button", { type: "button", className: "rastro-integrations__btn", "data-variant": "outline", onClick: onClose, children: "Cancelar" }), _jsxs("button", { type: "button", className: "rastro-integrations__btn", "data-variant": "danger", disabled: !matches || !permitted || busy, onClick: () => onConfirm(replaceWith || undefined), children: [_jsx(Icon, { name: "unlink", size: 14 }), replaceWith
26
+ ? "Trocar a conta e apagar o gasto"
27
+ : "Desvincular e apagar o gasto"] })] })] }) }));
28
+ }
29
+ //# sourceMappingURL=UnlinkDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnlinkDialog.js","sourceRoot":"","sources":["../../../src/ui/integrations/UnlinkDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** Words and figures the Integrações screen writes, in pt-BR. */
2
+ /** "06:40", in Brasília time like the rest of the screens. */
3
+ export declare const clockLabel: (at: number) => string;
4
+ /** "08/10". */
5
+ export declare const dayLabel: (at: number) => string;
6
+ /** "hoje 06:40", "ontem 22:10", "08/10 06:40". */
7
+ export declare function whenLabel(at: number, now: number): string;
8
+ /** "há 12 min", "há 3 h 12 min", "há 2 d"; "agora" under a minute. */
9
+ export declare function agoLabel(at: number, now: number, { short }?: {
10
+ short?: boolean | undefined;
11
+ }): string;
12
+ /** "há 18 min", "há 1 h", "ontem": a sent event's age. */
13
+ export declare function sentAgo(at: number, now: number): string;
14
+ /** "1188 4402 9917 305": a pixel id read in groups of four. */
15
+ export declare const pixelDigits: (pixelId: string) => string;
16
+ /** "1188…305": a pixel id that fits a phone line. */
17
+ export declare const pixelShort: (pixelId: string) => string;
18
+ /** "R$" for BRL, "US$" for USD: the account currency's own sign. */
19
+ export declare function currencySign(currency: string): string;
20
+ /** "America/Sao_Paulo" → "São Paulo". */
21
+ export declare function zoneCity(timezone: string): string;
22
+ /** "act_4056102938" → "act_4056…" for a narrow picker. */
23
+ export declare const accountShort: (adAccountId: string) => string;
24
+ /** "1 venda", "3 vendas". */
25
+ export declare const plural: (count: number, one: string, many: string) => string;
26
+ /** Lower case, no accents, letters and digits only: names compare by this. */
27
+ export declare const nameKey: (name: string) => string;
28
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/format.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAkBjE,8DAA8D;AAC9D,eAAO,MAAM,UAAU,OAAQ,MAAM,WAAqB,CAAC;AAC3D,eAAe;AACf,eAAO,MAAM,QAAQ,OAAQ,MAAM,WAAwB,CAAC;AAE5D,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAShD;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,KAAa,EAAE;;CAAK,UASvE;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAQ9C;AAED,+DAA+D;AAC/D,eAAO,MAAM,WAAW,YAAa,MAAM,WACkB,CAAC;AAE9D,qDAAqD;AACrD,eAAO,MAAM,UAAU,YAAa,MAAM,WACoC,CAAC;AAE/E,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,UAY5C;AAWD,yCAAyC;AACzC,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,UAGxC;AAED,0DAA0D;AAC1D,eAAO,MAAM,YAAY,gBAAiB,MAAM,WACsB,CAAC;AAEvE,6BAA6B;AAC7B,eAAO,MAAM,MAAM,UAAW,MAAM,OAAO,MAAM,QAAQ,MAAM,WACC,CAAC;AAEjE,8EAA8E;AAC9E,eAAO,MAAM,OAAO,SAAU,MAAM,WAMzB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /** Words and figures the Integrações screen writes, in pt-BR. */
2
+ const MINUTE_MS = 60_000;
3
+ const HOUR_MS = 60 * MINUTE_MS;
4
+ const DAY_MS = 24 * HOUR_MS;
5
+ const ZONE = "America/Sao_Paulo";
6
+ const clock = new Intl.DateTimeFormat("pt-BR", {
7
+ hour: "2-digit",
8
+ minute: "2-digit",
9
+ timeZone: ZONE,
10
+ });
11
+ const dayMonth = new Intl.DateTimeFormat("pt-BR", {
12
+ day: "2-digit",
13
+ month: "2-digit",
14
+ timeZone: ZONE,
15
+ });
16
+ /** "06:40", in Brasília time like the rest of the screens. */
17
+ export const clockLabel = (at) => clock.format(at);
18
+ /** "08/10". */
19
+ export const dayLabel = (at) => dayMonth.format(at);
20
+ /** "hoje 06:40", "ontem 22:10", "08/10 06:40". */
21
+ export function whenLabel(at, now) {
22
+ const day = dayMonth.format(at);
23
+ const prefix = day === dayMonth.format(now)
24
+ ? "hoje"
25
+ : day === dayMonth.format(now - DAY_MS)
26
+ ? "ontem"
27
+ : day;
28
+ return `${prefix} ${clock.format(at)}`;
29
+ }
30
+ /** "há 12 min", "há 3 h 12 min", "há 2 d"; "agora" under a minute. */
31
+ export function agoLabel(at, now, { short = false } = {}) {
32
+ const minutes = Math.max(0, Math.floor((now - at) / MINUTE_MS));
33
+ if (minutes < 1)
34
+ return "agora";
35
+ if (minutes < 60)
36
+ return short ? `${minutes} min` : `há ${minutes} min`;
37
+ const hours = Math.floor(minutes / 60);
38
+ if (hours >= 24)
39
+ return `há ${Math.floor(hours / 24)} d`;
40
+ const rest = minutes % 60;
41
+ if (short || rest === 0)
42
+ return `há ${hours} h`;
43
+ return `há ${hours} h ${rest} min`;
44
+ }
45
+ /** "há 18 min", "há 1 h", "ontem": a sent event's age. */
46
+ export function sentAgo(at, now) {
47
+ const delta = Math.max(0, now - at);
48
+ if (delta < MINUTE_MS)
49
+ return "agora";
50
+ if (delta < HOUR_MS)
51
+ return `há ${Math.floor(delta / MINUTE_MS)} min`;
52
+ if (dayMonth.format(at) === dayMonth.format(now))
53
+ return `há ${Math.floor(delta / HOUR_MS)} h`;
54
+ if (dayMonth.format(at) === dayMonth.format(now - DAY_MS))
55
+ return "ontem";
56
+ return `há ${Math.floor(delta / DAY_MS)} d`;
57
+ }
58
+ /** "1188 4402 9917 305": a pixel id read in groups of four. */
59
+ export const pixelDigits = (pixelId) => pixelId.replace(/\D/g, "").replace(/(\d{4})(?=\d)/g, "$1 ");
60
+ /** "1188…305": a pixel id that fits a phone line. */
61
+ export const pixelShort = (pixelId) => pixelId.length > 8 ? `${pixelId.slice(0, 4)}…${pixelId.slice(-3)}` : pixelId;
62
+ /** "R$" for BRL, "US$" for USD: the account currency's own sign. */
63
+ export function currencySign(currency) {
64
+ try {
65
+ const part = new Intl.NumberFormat("pt-BR", {
66
+ style: "currency",
67
+ currency,
68
+ })
69
+ .formatToParts(0)
70
+ .find((piece) => piece.type === "currency");
71
+ return part?.value ?? currency;
72
+ }
73
+ catch {
74
+ return currency;
75
+ }
76
+ }
77
+ const CITY_NAMES = {
78
+ Sao_Paulo: "São Paulo",
79
+ Belem: "Belém",
80
+ Maceio: "Maceió",
81
+ Cuiaba: "Cuiabá",
82
+ Araguaina: "Araguaína",
83
+ Santarem: "Santarém",
84
+ };
85
+ /** "America/Sao_Paulo" → "São Paulo". */
86
+ export function zoneCity(timezone) {
87
+ const city = timezone.split("/").at(-1) ?? timezone;
88
+ return CITY_NAMES[city] ?? city.replace(/_/g, " ");
89
+ }
90
+ /** "act_4056102938" → "act_4056…" for a narrow picker. */
91
+ export const accountShort = (adAccountId) => adAccountId.length > 9 ? `${adAccountId.slice(0, 8)}…` : adAccountId;
92
+ /** "1 venda", "3 vendas". */
93
+ export const plural = (count, one, many) => `${count.toLocaleString("pt-BR")} ${count === 1 ? one : many}`;
94
+ /** Lower case, no accents, letters and digits only: names compare by this. */
95
+ export const nameKey = (name) => name
96
+ .normalize("NFD")
97
+ .replace(/\p{Diacritic}/gu, "")
98
+ .toLowerCase()
99
+ .replace(/[^a-z0-9]+/g, " ")
100
+ .trim();
101
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/ui/integrations/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { IntegrationsBadge, IntegrationsView } from "./IntegrationsView.js";
2
+ export { clientRows, integrationsHeadline, suggestedAccount } from "./model.js";
3
+ export type { ClientRow, ClientState } from "./model.js";
4
+ export type { EventMap, EventMapColumn, IntegrationConversion, IntegrationsBusy, IntegrationSite, IntegrationStatus, IntegrationsViewProps, MetaColumnEvent, MetaConnection, MetaConnectionAdAccount, MetaEventName, MetaPixel, MetaPixelSource, PixelChoice, SentCounts, SetEventMapInput, UnlinkPreview, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChF,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EACV,QAAQ,EACR,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { IntegrationsBadge, IntegrationsView } from "./IntegrationsView.js";
2
+ export { clientRows, integrationsHeadline, suggestedAccount } from "./model.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/integrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * The code a `lastError` starts with ("AD_ACCOUNT_NOT_GRANTED: grant it in
3
+ * Meta…" → "AD_ACCOUNT_NOT_GRANTED"); the host adds its explanation after it.
4
+ */
5
+ export declare function errorCode(lastError: string | null | undefined): string | null;
6
+ import type { EventMap, IntegrationSite, IntegrationStatus, MetaConnection, SentCounts } from "./types.js";
7
+ type StatusSite = IntegrationStatus[number];
8
+ export type StatusAccount = StatusSite["adAccounts"][number];
9
+ /**
10
+ * - `offline`: the agency never connected Meta.
11
+ * - `unlinked`: connected, the client has no ad account yet.
12
+ * - `planB`: no account, but a pixel with the client's own token.
13
+ * - `live` / `syncing` / `error`: the linked account's sync.
14
+ * - `stopped`: the agency token was refused; the account waits for it.
15
+ */
16
+ export type ClientState = "offline" | "unlinked" | "planB" | "live" | "syncing" | "error" | "stopped";
17
+ export interface ClientRow {
18
+ site: IntegrationSite;
19
+ state: ClientState;
20
+ account: StatusAccount | null;
21
+ /** The account's name in the connection's listing, when it has one. */
22
+ accountName: string | null;
23
+ pixel: {
24
+ pixelId: string;
25
+ name: string | null;
26
+ source: "connection" | "token" | null;
27
+ /** Set by another owner of the site ("uze.ai"): locked here. */
28
+ owner: string | null;
29
+ } | null;
30
+ /** The account was linked by another owner ("uze.ai"): locked here. */
31
+ accountOwner: string | null;
32
+ pending: number;
33
+ sent: number;
34
+ failed: number;
35
+ eventMap: EventMap | undefined;
36
+ /** What the pixel got in 30 days, when the host says. */
37
+ sent30d: SentCounts | undefined;
38
+ /**
39
+ * The Meta login no longer releases what the client uses: its account
40
+ * (`AD_ACCOUNT_NOT_GRANTED`) or its pixel (`PIXEL_NOT_GRANTED`).
41
+ */
42
+ notGranted: "account" | "pixel" | null;
43
+ /**
44
+ * The pixel has a test event code: its sales reach only Meta's Test Events,
45
+ * never the ads' optimization.
46
+ */
47
+ testMode: boolean;
48
+ /** Needs a hand: no account, or a sync that stopped. */
49
+ attention: boolean;
50
+ }
51
+ export declare function clientRows({ sites, connection, status, eventMaps, sentBySite, otherOwnerLabel, }: {
52
+ sites: readonly IntegrationSite[];
53
+ connection: MetaConnection | null;
54
+ status: IntegrationStatus | undefined;
55
+ eventMaps: Record<string, EventMap> | undefined;
56
+ sentBySite?: Record<string, SentCounts> | undefined;
57
+ /** Who `own: false` means: the site's other owner. */
58
+ otherOwnerLabel?: string;
59
+ }): ClientRow[];
60
+ /**
61
+ * What the host counted for the pixel: the last 30 UTC days by event and
62
+ * today. Absent from hosts before these counters, and null without `now`.
63
+ */
64
+ export declare function sentFromStatus(entry: IntegrationStatus[number] | undefined): SentCounts | undefined;
65
+ /**
66
+ * The backfill's block in progress, "2 de 3": the blocks read plus the one
67
+ * running, never past the total.
68
+ */
69
+ export declare function backfillStep(backfill: {
70
+ done: number;
71
+ total: number;
72
+ } | null | undefined): {
73
+ current: number;
74
+ total: number;
75
+ } | null;
76
+ /** The account a client most likely owns: its name inside the account's. */
77
+ export declare function suggestedAccount(site: IntegrationSite, accounts: MetaConnection["adAccounts"]): string | null;
78
+ /** The header line: "3 de 4 clientes ligados", "3 clientes parados". */
79
+ export declare function integrationsHeadline(rows: readonly ClientRow[], connection: MetaConnection | null | undefined): {
80
+ tone: "ok" | "bad";
81
+ text: string;
82
+ } | null;
83
+ export {};
84
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Where each client stands with Meta, read once from the connection, the
3
+ * status and the event maps, so the table, the phone cards and the summaries
4
+ * tell the same story.
5
+ */
6
+ import { nameKey } from "./format.js";
7
+ /**
8
+ * The code a `lastError` starts with ("AD_ACCOUNT_NOT_GRANTED: grant it in
9
+ * Meta…" → "AD_ACCOUNT_NOT_GRANTED"); the host adds its explanation after it.
10
+ */
11
+ export function errorCode(lastError) {
12
+ if (!lastError)
13
+ return null;
14
+ const match = /^([A-Z][A-Z0-9_]+)(?::|$)/.exec(lastError);
15
+ return match?.[1] ?? null;
16
+ }
17
+ function stateOf(connection, account, pixel) {
18
+ if (!account) {
19
+ if (pixel?.source === "token")
20
+ return "planB";
21
+ return connection ? "unlinked" : "offline";
22
+ }
23
+ if (connection?.status === "invalid")
24
+ return "stopped";
25
+ if (account.syncState === "error")
26
+ return "error";
27
+ if (account.syncState === "backfill" || account.lastSyncAt === null)
28
+ return "syncing";
29
+ return "live";
30
+ }
31
+ export function clientRows({ sites, connection, status, eventMaps, sentBySite, otherOwnerLabel = "uze.ai", }) {
32
+ const bySite = new Map((status ?? []).map((entry) => [entry.siteId, entry]));
33
+ const names = new Map((connection?.adAccounts ?? []).map((account) => [
34
+ account.adAccountId,
35
+ account.name,
36
+ ]));
37
+ return sites.map((site) => {
38
+ const entry = bySite.get(site.siteId);
39
+ const account = entry?.adAccounts[0] ?? null;
40
+ const pixel = entry?.pixel.enabled && entry.pixel.pixelId
41
+ ? {
42
+ pixelId: entry.pixel.pixelId,
43
+ name: entry.pixel.name ?? null,
44
+ source: entry.pixel.source ?? null,
45
+ // `own` is false only for another owner's pixel; a pixel set
46
+ // before owners were recorded counts as the host's.
47
+ owner: entry.pixel.own === false ? otherOwnerLabel : null,
48
+ }
49
+ : null;
50
+ const notGranted = errorCode(account?.lastError) === "AD_ACCOUNT_NOT_GRANTED"
51
+ ? "account"
52
+ : errorCode(entry?.pixel.lastError) === "PIXEL_NOT_GRANTED"
53
+ ? "pixel"
54
+ : null;
55
+ const state = notGranted ? "error" : stateOf(connection, account, pixel);
56
+ return {
57
+ site,
58
+ state,
59
+ account,
60
+ accountName: account
61
+ ? (names.get(account.adAccountId) ?? account.name)
62
+ : null,
63
+ pixel,
64
+ accountOwner: account?.own === false ? otherOwnerLabel : null,
65
+ notGranted,
66
+ testMode: pixel !== null && entry?.pixel.testMode === true,
67
+ pending: entry?.conversions.pending ?? 0,
68
+ sent: entry?.conversions.sent ?? 0,
69
+ failed: entry?.conversions.failed ?? 0,
70
+ eventMap: eventMaps?.[site.siteId],
71
+ sent30d: sentBySite?.[site.siteId] ?? sentFromStatus(entry),
72
+ attention: state === "unlinked" || state === "error" || state === "stopped",
73
+ };
74
+ });
75
+ }
76
+ /**
77
+ * What the host counted for the pixel: the last 30 UTC days by event and
78
+ * today. Absent from hosts before these counters, and null without `now`.
79
+ */
80
+ export function sentFromStatus(entry) {
81
+ const last30d = entry?.conversions.last30d;
82
+ if (!last30d)
83
+ return undefined;
84
+ const sentToday = entry.conversions.sentToday;
85
+ return {
86
+ ...last30d,
87
+ ...(sentToday === null || sentToday === undefined
88
+ ? {}
89
+ : { today: { sent: sentToday } }),
90
+ };
91
+ }
92
+ /**
93
+ * The backfill's block in progress, "2 de 3": the blocks read plus the one
94
+ * running, never past the total.
95
+ */
96
+ export function backfillStep(backfill) {
97
+ if (!backfill || backfill.total <= 0)
98
+ return null;
99
+ return {
100
+ current: Math.min(backfill.done + 1, backfill.total),
101
+ total: backfill.total,
102
+ };
103
+ }
104
+ /** The account a client most likely owns: its name inside the account's. */
105
+ export function suggestedAccount(site, accounts) {
106
+ const key = nameKey(site.name);
107
+ if (!key)
108
+ return null;
109
+ const free = accounts.filter((account) => account.linkedSiteId === null && !account.linkedOutsideScope);
110
+ const match = free.find((account) => nameKey(account.name).startsWith(key)) ??
111
+ free.find((account) => nameKey(account.name).includes(key)) ??
112
+ free.find((account) => key.includes(nameKey(account.name)));
113
+ return match?.adAccountId ?? null;
114
+ }
115
+ /** The header line: "3 de 4 clientes ligados", "3 clientes parados". */
116
+ export function integrationsHeadline(rows, connection) {
117
+ if (!connection || rows.length === 0)
118
+ return null;
119
+ const stopped = rows.filter((row) => row.state === "stopped" || row.state === "error").length;
120
+ if (stopped > 0)
121
+ return {
122
+ tone: "bad",
123
+ text: `${stopped} ${stopped === 1 ? "cliente parado" : "clientes parados"}`,
124
+ };
125
+ const linked = rows.filter((row) => row.account !== null).length;
126
+ return {
127
+ tone: "ok",
128
+ text: `${linked} de ${rows.length} ${rows.length === 1 ? "cliente ligado" : "clientes ligados"}`,
129
+ };
130
+ }
131
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/ui/integrations/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type RefObject } from "react";
2
+ /**
3
+ * A modal's keyboard contract: focus moves in (to `initial` or the first
4
+ * control), Tab stays inside, Esc closes, and focus returns to whatever
5
+ * opened it.
6
+ */
7
+ export declare function useModal(ref: RefObject<HTMLElement | null>, onClose: () => void, initial?: RefObject<HTMLElement | null>): void;
8
+ /** A popover closes on Esc and on a click outside it and its trigger. */
9
+ export declare function useDismiss(open: boolean, refs: ReadonlyArray<RefObject<HTMLElement | null>>, onClose: () => void): void;
10
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKpE;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,OAAO,EAAE,MAAM,IAAI,EACnB,OAAO,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,QA2CxC;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,EAClD,OAAO,EAAE,MAAM,IAAI,QAsBpB"}
@@ -0,0 +1,77 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ const FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
3
+ /**
4
+ * A modal's keyboard contract: focus moves in (to `initial` or the first
5
+ * control), Tab stays inside, Esc closes, and focus returns to whatever
6
+ * opened it.
7
+ */
8
+ export function useModal(ref, onClose, initial) {
9
+ const close = useRef(onClose);
10
+ close.current = onClose;
11
+ // Whatever had focus when the modal first rendered, before showModal()
12
+ // moves it inside: focus goes back there on close.
13
+ const [opener] = useState(() => typeof document !== "undefined" &&
14
+ document.activeElement instanceof HTMLElement
15
+ ? document.activeElement
16
+ : null);
17
+ useEffect(() => {
18
+ const root = ref.current;
19
+ const first = initial?.current ?? root?.querySelector(FOCUSABLE) ?? root;
20
+ first?.focus();
21
+ const onKey = (event) => {
22
+ if (event.key === "Escape") {
23
+ event.stopPropagation();
24
+ close.current();
25
+ return;
26
+ }
27
+ if (event.key !== "Tab" || !root)
28
+ return;
29
+ const items = [...root.querySelectorAll(FOCUSABLE)];
30
+ if (items.length === 0)
31
+ return;
32
+ const head = items[0];
33
+ const tail = items[items.length - 1];
34
+ if (event.shiftKey && document.activeElement === head) {
35
+ event.preventDefault();
36
+ tail.focus();
37
+ }
38
+ else if (!event.shiftKey && document.activeElement === tail) {
39
+ event.preventDefault();
40
+ head.focus();
41
+ }
42
+ };
43
+ root?.addEventListener("keydown", onKey);
44
+ return () => {
45
+ root?.removeEventListener("keydown", onKey);
46
+ opener?.focus();
47
+ };
48
+ // Mount and unmount only: the modal owns focus for its whole life.
49
+ }, []);
50
+ }
51
+ /** A popover closes on Esc and on a click outside it and its trigger. */
52
+ export function useDismiss(open, refs, onClose) {
53
+ const close = useRef(onClose);
54
+ close.current = onClose;
55
+ useEffect(() => {
56
+ if (!open)
57
+ return;
58
+ const onPointer = (event) => {
59
+ const target = event.target;
60
+ if (refs.some((ref) => ref.current?.contains(target)))
61
+ return;
62
+ close.current();
63
+ };
64
+ const onKey = (event) => {
65
+ if (event.key === "Escape")
66
+ close.current();
67
+ };
68
+ document.addEventListener("pointerdown", onPointer);
69
+ document.addEventListener("keydown", onKey);
70
+ return () => {
71
+ document.removeEventListener("pointerdown", onPointer);
72
+ document.removeEventListener("keydown", onKey);
73
+ };
74
+ // The refs are stable objects; only opening re-arms the listeners.
75
+ }, [open]);
76
+ }
77
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/ui/integrations/overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ReactNode } from "react";
2
+ import { type IconName } from "./Icons.js";
3
+ import { type ClientRow } from "./model.js";
4
+ export type PillTone = "ok" | "sync" | "bad" | "warn" | "ghost" | "plain";
5
+ /** A rounded status chip: a dot, a spinner or an icon, then its words. */
6
+ export declare function Pill({ tone, icon, children, }: {
7
+ tone: PillTone;
8
+ icon?: IconName | "dot" | "spin";
9
+ children: ReactNode;
10
+ }): import("react").JSX.Element;
11
+ export declare const TEST_MODE_TEXT = "Modo de teste: as vendas v\u00E3o s\u00F3 para o Test Events da Meta";
12
+ /**
13
+ * The pixel has a test event code (`metaStatus.pixel.testMode`): what is sent
14
+ * shows up in Meta's Test Events and nowhere else. `line` is the client row's
15
+ * and the phone card's chip; the events sheet says it as a callout.
16
+ */
17
+ export declare function TestModeNote({ variant }: {
18
+ variant: "line" | "callout";
19
+ }): import("react").JSX.Element;
20
+ /** A client's initials in its color slot (the order the agency lists them). */
21
+ export declare function Avatar({ name, slot, size, }: {
22
+ name: string;
23
+ slot: number;
24
+ size?: "sm" | "md" | "lg";
25
+ }): import("react").JSX.Element;
26
+ /** The Estado chip: how the client's account syncs. */
27
+ export declare function StateChip({ row, now, compact, }: {
28
+ row: ClientRow;
29
+ now: number;
30
+ compact?: boolean;
31
+ }): import("react").JSX.Element;
32
+ /** "41 vendas · 118 qualificados": what the pixel got in 30 days. */
33
+ export declare function sentSummary(row: ClientRow, { compact }?: {
34
+ compact?: boolean | undefined;
35
+ }): string | null;
36
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1E,0EAA0E;AAC1E,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,SAAS,CAAC;CACrB,+BAaA;AAED,eAAO,MAAM,cAAc,yEACmC,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BA6BxE;AAED,+EAA+E;AAC/E,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,IAAI,EACJ,IAAW,GACZ,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B,+BAWA;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,GAAG,EACH,OAAe,GAChB,EAAE;IACD,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,+BA6DA;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,OAAe,EAAE;;CAAK,iBAcnE"}