@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
package/dist/ui/ui.css ADDED
@@ -0,0 +1,3424 @@
1
+ /* src/ui/ui.css */
2
+ /*
3
+ * @iann29/rastro/ui.css: the look of the Rastro screens. Everything is scoped
4
+ * under .rastro-ui and every class starts with rastro-, so a host's own CSS
5
+ * (Tailwind or not) never collides. Theme it by setting the variables on any
6
+ * ancestor of .rastro-ui (or on it): the defaults sit on the root with zero
7
+ * specificity, so the host's own declaration always wins and inherits down.
8
+ * The build appends each view's own stylesheet (src/ui/<view>/*.css) after
9
+ * this base.
10
+ */
11
+
12
+ :where(:root) {
13
+ --rastro-font:
14
+ "Instrument Sans Variable", "Instrument Sans", ui-sans-serif, system-ui,
15
+ sans-serif;
16
+ --rastro-bg: oklch(0.985 0.002 247);
17
+ --rastro-card: oklch(1 0 0);
18
+ --rastro-fg: oklch(0.17 0.008 255);
19
+ /* A quiet surface: table headers, bar tracks, hovered rows. */
20
+ --rastro-muted: oklch(0.955 0.004 247);
21
+ /* Secondary text: labels, captions, the period line. */
22
+ --rastro-muted-fg: oklch(0.52 0.012 255);
23
+ --rastro-border: oklch(0.9 0.006 247);
24
+ --rastro-radius: 0.625rem;
25
+ /* The one highlighted figure, like the "Retorno" card. */
26
+ --rastro-accent: oklch(0.24 0.015 255);
27
+ --rastro-accent-fg: oklch(0.985 0.002 247);
28
+ /* A good or bad change drawn on the accent, legible on it. */
29
+ --rastro-on-accent-good: oklch(0.84 0.13 163);
30
+ --rastro-on-accent-bad: oklch(0.8 0.13 30);
31
+ /* Return bands: strong (≥ 8x), ok (4–8x), weak (< 4x). */
32
+ --rastro-strong: oklch(0.42 0.11 163);
33
+ --rastro-strong-bg: color-mix(in oklab, oklch(0.6 0.13 163) 18%, transparent);
34
+ --rastro-ok: oklch(0.48 0.1 70);
35
+ --rastro-ok-bg: oklch(0.95 0.05 85);
36
+ --rastro-weak: oklch(0.5 0.15 30);
37
+ --rastro-weak-bg: oklch(0.94 0.04 30);
38
+ }
39
+
40
+ .rastro-ui {
41
+ font-family: var(--rastro-font);
42
+ color: var(--rastro-fg);
43
+ font-size: 14px;
44
+ line-height: 1.45;
45
+ -webkit-font-smoothing: antialiased;
46
+ }
47
+
48
+ :where(.dark, .rastro-dark) {
49
+ --rastro-bg: oklch(0.16 0.008 255);
50
+ --rastro-card: oklch(0.205 0.01 255);
51
+ --rastro-fg: oklch(0.96 0.003 247);
52
+ --rastro-muted: oklch(0.27 0.012 255);
53
+ --rastro-muted-fg: oklch(0.69 0.012 247);
54
+ --rastro-border: oklch(1 0 0 / 12%);
55
+ --rastro-accent: oklch(0.92 0.005 247);
56
+ --rastro-accent-fg: oklch(0.2 0.01 255);
57
+ --rastro-on-accent-good: oklch(0.45 0.11 163);
58
+ --rastro-on-accent-bad: oklch(0.5 0.15 30);
59
+ --rastro-strong: oklch(0.8 0.12 163);
60
+ --rastro-strong-bg: color-mix(in oklab, oklch(0.6 0.13 163) 24%, transparent);
61
+ --rastro-ok: oklch(0.84 0.11 85);
62
+ --rastro-ok-bg: oklch(0.4 0.07 85 / 45%);
63
+ --rastro-weak: oklch(0.78 0.13 30);
64
+ --rastro-weak-bg: oklch(0.42 0.1 30 / 40%);
65
+ }
66
+
67
+ .rastro-ui *,
68
+ .rastro-ui *::before,
69
+ .rastro-ui *::after {
70
+ box-sizing: border-box;
71
+ }
72
+
73
+ /* Figures line up in columns and never jump while they update. */
74
+ .rastro-num {
75
+ font-variant-numeric: tabular-nums;
76
+ white-space: nowrap;
77
+ }
78
+
79
+ .rastro-muted {
80
+ color: var(--rastro-muted-fg);
81
+ }
82
+
83
+ .rastro-card {
84
+ background: var(--rastro-card);
85
+ border: 1px solid var(--rastro-border);
86
+ border-radius: var(--rastro-radius);
87
+ padding: 16px;
88
+ }
89
+
90
+ /* A return figure in its band: <span class="rastro-band" data-band="strong"> */
91
+ .rastro-band {
92
+ display: inline-block;
93
+ min-width: 48px;
94
+ padding: 2px 8px;
95
+ border-radius: calc(var(--rastro-radius) - 3px);
96
+ font-size: 12px;
97
+ font-weight: 600;
98
+ text-align: center;
99
+ font-variant-numeric: tabular-nums;
100
+ background: var(--rastro-muted);
101
+ color: var(--rastro-muted-fg);
102
+ }
103
+ .rastro-band[data-band="strong"] {
104
+ background: var(--rastro-strong-bg);
105
+ color: var(--rastro-strong);
106
+ }
107
+ .rastro-band[data-band="ok"] {
108
+ background: var(--rastro-ok-bg);
109
+ color: var(--rastro-ok);
110
+ }
111
+ .rastro-band[data-band="weak"] {
112
+ background: var(--rastro-weak-bg);
113
+ color: var(--rastro-weak);
114
+ }
115
+
116
+ /* The change against the previous period: data-trend="good" | "bad". */
117
+ .rastro-change {
118
+ font-size: 12px;
119
+ font-weight: 500;
120
+ font-variant-numeric: tabular-nums;
121
+ color: var(--rastro-muted-fg);
122
+ }
123
+ .rastro-change[data-trend="good"] {
124
+ color: var(--rastro-strong);
125
+ }
126
+ .rastro-change[data-trend="bad"] {
127
+ color: var(--rastro-weak);
128
+ }
129
+
130
+ /* What a view shows with nothing to show, and while it loads. */
131
+ .rastro-empty {
132
+ display: grid;
133
+ gap: 4px;
134
+ place-items: center;
135
+ padding: 40px 16px;
136
+ text-align: center;
137
+ color: var(--rastro-muted-fg);
138
+ }
139
+ .rastro-skeleton {
140
+ border-radius: calc(var(--rastro-radius) - 2px);
141
+ background: var(--rastro-muted);
142
+ animation: rastro-pulse 1.4s ease-in-out infinite;
143
+ }
144
+ @keyframes rastro-pulse {
145
+ 50% {
146
+ opacity: 0.55;
147
+ }
148
+ }
149
+ @media (prefers-reduced-motion: reduce) {
150
+ .rastro-skeleton {
151
+ animation: none;
152
+ }
153
+ }
154
+
155
+ /* src/ui/campaigns/campaigns.css */
156
+ /*
157
+ * Campanhas (Direção A). Laid out by the width the host gives it, not the
158
+ * viewport: the same view sits in the Rastro dashboard and inside uze.ai.
159
+ */
160
+
161
+ .rastro-campaigns {
162
+ container: rastro-campaigns / inline-size;
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: 16px;
166
+ min-width: 0;
167
+ }
168
+
169
+ .rastro-campaigns__icon,
170
+ .rastro-campaigns__glyph {
171
+ flex: none;
172
+ }
173
+
174
+ /* Card headers and text shared by every block. */
175
+ .rastro-campaigns__card-head {
176
+ display: flex;
177
+ flex-wrap: wrap;
178
+ align-items: flex-start;
179
+ justify-content: space-between;
180
+ gap: 8px 12px;
181
+ margin-bottom: 12px;
182
+ }
183
+ .rastro-campaigns__card-head > div:first-child {
184
+ min-width: 0;
185
+ flex: 1 1 220px;
186
+ }
187
+ .rastro-campaigns__title {
188
+ margin: 0;
189
+ font-size: 15px;
190
+ font-weight: 600;
191
+ }
192
+ .rastro-campaigns__desc {
193
+ margin: 2px 0 0;
194
+ font-size: 13px;
195
+ color: var(--rastro-muted-fg);
196
+ }
197
+ .rastro-campaigns__aside {
198
+ font-size: 13px;
199
+ color: var(--rastro-muted-fg);
200
+ }
201
+ .rastro-campaigns__pill {
202
+ display: inline-flex;
203
+ align-items: center;
204
+ gap: 5px;
205
+ height: 22px;
206
+ padding: 0 9px;
207
+ border-radius: 999px;
208
+ font-size: 12px;
209
+ font-weight: 500;
210
+ white-space: nowrap;
211
+ background: var(--rastro-muted);
212
+ color: var(--rastro-fg);
213
+ }
214
+ .rastro-campaigns__pill[data-tone="outline"],
215
+ .rastro-campaigns__pill[data-stage="lead"],
216
+ .rastro-campaigns__pill[data-stage="lost"] {
217
+ background: transparent;
218
+ box-shadow: inset 0 0 0 1px var(--rastro-border);
219
+ color: var(--rastro-muted-fg);
220
+ }
221
+ .rastro-campaigns__pill[data-tone="good"],
222
+ .rastro-campaigns__pill[data-stage="won"] {
223
+ background: var(--rastro-strong-bg);
224
+ color: var(--rastro-strong);
225
+ }
226
+ .rastro-campaigns__pill[data-tone="bad"] {
227
+ background: var(--rastro-weak-bg);
228
+ color: var(--rastro-weak);
229
+ }
230
+
231
+ /* The Meta link above the figures. */
232
+ .rastro-campaigns__strip {
233
+ display: flex;
234
+ flex-wrap: wrap;
235
+ gap: 8px;
236
+ }
237
+ .rastro-campaigns__chip {
238
+ display: inline-flex;
239
+ align-items: center;
240
+ gap: 7px;
241
+ min-height: 32px;
242
+ max-width: 100%;
243
+ padding: 4px 12px;
244
+ border-radius: calc(var(--rastro-radius) - 2px);
245
+ background: var(--rastro-card);
246
+ box-shadow: inset 0 0 0 1px var(--rastro-border);
247
+ font-size: 13px;
248
+ }
249
+ .rastro-campaigns__chip .rastro-campaigns__icon {
250
+ color: var(--rastro-strong);
251
+ }
252
+ .rastro-campaigns__chip[data-state="error"] .rastro-campaigns__icon {
253
+ color: var(--rastro-weak);
254
+ }
255
+ .rastro-campaigns__dot {
256
+ width: 7px;
257
+ height: 7px;
258
+ flex: none;
259
+ border-radius: 999px;
260
+ background: var(--rastro-strong);
261
+ box-shadow: 0 0 0 3px var(--rastro-strong-bg);
262
+ }
263
+ .rastro-campaigns__chip[data-state="syncing"] .rastro-campaigns__dot {
264
+ background: var(--rastro-ok);
265
+ box-shadow: 0 0 0 3px var(--rastro-ok-bg);
266
+ }
267
+ .rastro-campaigns__chip[data-state="error"] .rastro-campaigns__dot {
268
+ background: var(--rastro-weak);
269
+ box-shadow: 0 0 0 3px var(--rastro-weak-bg);
270
+ }
271
+ .rastro-campaigns__chip[data-state="unlinked"] .rastro-campaigns__dot {
272
+ background: var(--rastro-muted-fg);
273
+ box-shadow: none;
274
+ }
275
+
276
+ .rastro-campaigns__notice {
277
+ display: flex;
278
+ gap: 10px;
279
+ align-items: flex-start;
280
+ padding: 12px 14px;
281
+ border-radius: var(--rastro-radius);
282
+ background: var(--rastro-ok-bg);
283
+ color: var(--rastro-ok);
284
+ font-size: 13px;
285
+ }
286
+
287
+ /* Indicators: two per row when narrow, three, then all in one row. */
288
+ .rastro-campaigns__kpis {
289
+ display: grid;
290
+ grid-template-columns: repeat(2, minmax(0, 1fr));
291
+ gap: 12px;
292
+ }
293
+ @container rastro-campaigns (min-width: 640px) {
294
+ .rastro-campaigns__kpis {
295
+ grid-template-columns: repeat(3, minmax(0, 1fr));
296
+ }
297
+ .rastro-campaigns__kpis[data-count="4"] {
298
+ grid-template-columns: repeat(4, minmax(0, 1fr));
299
+ }
300
+ /* Spend without return: five in one row rather than three and two. */
301
+ .rastro-campaigns__kpis[data-count="5"] {
302
+ grid-template-columns: repeat(5, minmax(0, 1fr));
303
+ }
304
+ }
305
+ @container rastro-campaigns (min-width: 1000px) {
306
+ .rastro-campaigns__kpis[data-count="6"] {
307
+ grid-template-columns: repeat(6, minmax(0, 1fr));
308
+ }
309
+ }
310
+ .rastro-campaigns__kpi {
311
+ position: relative;
312
+ min-width: 0;
313
+ padding: 14px;
314
+ overflow: hidden;
315
+ container-type: inline-size;
316
+ }
317
+ .rastro-campaigns__kpi-head {
318
+ display: flex;
319
+ align-items: center;
320
+ justify-content: space-between;
321
+ gap: 8px;
322
+ }
323
+ .rastro-campaigns__kpi-label {
324
+ min-width: 0;
325
+ overflow: hidden;
326
+ font-size: 13px;
327
+ color: var(--rastro-muted-fg);
328
+ text-overflow: ellipsis;
329
+ white-space: nowrap;
330
+ }
331
+ .rastro-campaigns__kpi-icon {
332
+ display: grid;
333
+ flex: none;
334
+ place-items: center;
335
+ width: 28px;
336
+ height: 28px;
337
+ border-radius: calc(var(--rastro-radius) - 2px);
338
+ background: var(--rastro-muted);
339
+ }
340
+ .rastro-campaigns__kpi-value {
341
+ margin-top: 6px;
342
+ font-size: clamp(16px, 15cqi, 26px);
343
+ font-weight: 600;
344
+ letter-spacing: -0.01em;
345
+ }
346
+ /* A figure like "R$ 9.876.543,21" shrinks with its card instead of spilling. */
347
+ .rastro-campaigns__kpi-value[data-long="true"] {
348
+ font-size: clamp(12px, 9.5cqi, 26px);
349
+ }
350
+ .rastro-campaigns__kpi-foot {
351
+ margin-top: 4px;
352
+ overflow: hidden;
353
+ font-size: 12px;
354
+ color: var(--rastro-muted-fg);
355
+ text-overflow: ellipsis;
356
+ white-space: nowrap;
357
+ }
358
+ .rastro-campaigns__kpi[data-highlight="true"] {
359
+ border-color: transparent;
360
+ background: var(--rastro-accent);
361
+ color: var(--rastro-accent-fg);
362
+ }
363
+ .rastro-campaigns__kpi[data-highlight="true"] .rastro-campaigns__kpi-label,
364
+ .rastro-campaigns__kpi[data-highlight="true"] .rastro-campaigns__kpi-foot,
365
+ .rastro-campaigns__kpi[data-highlight="true"] .rastro-campaigns__change {
366
+ color: color-mix(in oklab, var(--rastro-accent-fg) 75%, transparent);
367
+ }
368
+ /* The change on the dark Retorno card: light green and red that read on it. */
369
+ .rastro-campaigns__kpi[data-highlight="true"]
370
+ .rastro-campaigns__change[data-trend="good"] {
371
+ color: var(--rastro-on-accent-good);
372
+ }
373
+ .rastro-campaigns__kpi[data-highlight="true"]
374
+ .rastro-campaigns__change[data-trend="bad"] {
375
+ color: var(--rastro-on-accent-bad);
376
+ }
377
+ .rastro-campaigns__kpi[data-highlight="true"] .rastro-campaigns__kpi-icon {
378
+ background: color-mix(in oklab, var(--rastro-accent-fg) 14%, transparent);
379
+ }
380
+ .rastro-campaigns__spark {
381
+ position: absolute;
382
+ right: 14px;
383
+ bottom: 30px;
384
+ width: 38%;
385
+ height: 26px;
386
+ stroke: var(--rastro-strong);
387
+ stroke-width: 1.5;
388
+ opacity: 0.8;
389
+ }
390
+
391
+ /* The funnel and the organic origins side by side on a wide screen. */
392
+ .rastro-campaigns__overview {
393
+ display: grid;
394
+ grid-template-columns: minmax(0, 1fr);
395
+ gap: 16px;
396
+ }
397
+ @container rastro-campaigns (min-width: 1000px) {
398
+ .rastro-campaigns__overview {
399
+ grid-template-columns: minmax(0, 1fr) 320px;
400
+ }
401
+ }
402
+ .rastro-campaigns__funnel,
403
+ .rastro-campaigns__organic,
404
+ .rastro-campaigns__origins {
405
+ min-width: 0;
406
+ }
407
+ .rastro-campaigns__funnel-steps {
408
+ display: grid;
409
+ grid-template-columns: repeat(2, minmax(0, 1fr));
410
+ gap: 14px 12px;
411
+ margin: 0;
412
+ padding: 0;
413
+ list-style: none;
414
+ }
415
+ @container rastro-campaigns (min-width: 640px) {
416
+ .rastro-campaigns__funnel-steps {
417
+ grid-template-columns: repeat(4, minmax(0, 1fr));
418
+ }
419
+ }
420
+ .rastro-campaigns__funnel-item {
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: 8px;
424
+ min-width: 0;
425
+ container-type: inline-size;
426
+ }
427
+ .rastro-campaigns__funnel-step {
428
+ display: flex;
429
+ flex-direction: column;
430
+ min-width: 0;
431
+ }
432
+ .rastro-campaigns__funnel-bar {
433
+ height: 10px;
434
+ margin-bottom: 10px;
435
+ border-radius: 999px;
436
+ background: var(--rastro-accent);
437
+ }
438
+ .rastro-campaigns__funnel-step[data-step="leads"]
439
+ > .rastro-campaigns__funnel-bar {
440
+ opacity: 0.72;
441
+ }
442
+ .rastro-campaigns__funnel-step[data-step="qualified"]
443
+ > .rastro-campaigns__funnel-bar {
444
+ opacity: 0.5;
445
+ }
446
+ .rastro-campaigns__funnel-step[data-step="won"]
447
+ > .rastro-campaigns__funnel-bar {
448
+ background: var(--rastro-strong);
449
+ }
450
+ .rastro-campaigns__funnel-label,
451
+ .rastro-campaigns__funnel-detail {
452
+ overflow: hidden;
453
+ font-size: 12px;
454
+ color: var(--rastro-muted-fg);
455
+ text-overflow: ellipsis;
456
+ white-space: nowrap;
457
+ }
458
+ .rastro-campaigns__funnel-value {
459
+ margin-top: 2px;
460
+ font-size: clamp(16px, 16cqi, 22px);
461
+ font-weight: 600;
462
+ }
463
+ .rastro-campaigns__funnel-value[data-long="true"] {
464
+ font-size: clamp(12px, 10cqi, 22px);
465
+ }
466
+ .rastro-campaigns__funnel-link {
467
+ display: flex;
468
+ flex-wrap: wrap;
469
+ align-items: baseline;
470
+ gap: 0 6px;
471
+ align-self: flex-start;
472
+ max-width: 100%;
473
+ padding: 4px 10px;
474
+ border-radius: calc(var(--rastro-radius) - 2px);
475
+ background: var(--rastro-muted);
476
+ font-size: 11px;
477
+ color: var(--rastro-muted-fg);
478
+ }
479
+ .rastro-campaigns__funnel-link b {
480
+ font-size: 13px;
481
+ color: var(--rastro-fg);
482
+ }
483
+ .rastro-campaigns__organic-list {
484
+ display: flex;
485
+ flex-direction: column;
486
+ gap: 10px;
487
+ margin: 0;
488
+ padding: 0;
489
+ list-style: none;
490
+ }
491
+ .rastro-campaigns__organic-list li {
492
+ display: grid;
493
+ grid-template-columns: 16px minmax(0, 1.3fr) minmax(0, 1fr) auto;
494
+ align-items: center;
495
+ gap: 8px;
496
+ font-size: 13px;
497
+ }
498
+ .rastro-campaigns__organic-list .rastro-campaigns__icon {
499
+ color: var(--rastro-muted-fg);
500
+ }
501
+ .rastro-campaigns__organic-name {
502
+ overflow: hidden;
503
+ text-overflow: ellipsis;
504
+ white-space: nowrap;
505
+ }
506
+ .rastro-campaigns__organic-track {
507
+ height: 8px;
508
+ border-radius: 999px;
509
+ background: var(--rastro-muted);
510
+ }
511
+ .rastro-campaigns__organic-track i {
512
+ display: block;
513
+ height: 100%;
514
+ border-radius: 999px;
515
+ background: var(--rastro-muted-fg);
516
+ opacity: 0.6;
517
+ }
518
+ .rastro-campaigns__origins-bar {
519
+ display: flex;
520
+ gap: 2px;
521
+ height: 10px;
522
+ overflow: hidden;
523
+ border-radius: 999px;
524
+ background: var(--rastro-muted);
525
+ }
526
+ .rastro-campaigns__origins-legend {
527
+ display: flex;
528
+ flex-wrap: wrap;
529
+ gap: 4px 16px;
530
+ margin: 10px 0 0;
531
+ padding: 0;
532
+ list-style: none;
533
+ font-size: 12px;
534
+ color: var(--rastro-muted-fg);
535
+ }
536
+ .rastro-campaigns__origins-legend li {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 6px;
540
+ }
541
+ .rastro-campaigns__origins-legend i {
542
+ width: 8px;
543
+ height: 8px;
544
+ border-radius: 999px;
545
+ }
546
+ .rastro-campaigns__origins-bar i,
547
+ .rastro-campaigns__origins-legend i {
548
+ display: block;
549
+ background: var(--rastro-accent);
550
+ }
551
+ .rastro-campaigns i[data-shade="1"] {
552
+ opacity: 0.75;
553
+ }
554
+ .rastro-campaigns i[data-shade="2"] {
555
+ opacity: 0.55;
556
+ }
557
+ .rastro-campaigns i[data-shade="3"] {
558
+ opacity: 0.38;
559
+ }
560
+ .rastro-campaigns i[data-shade="4"] {
561
+ opacity: 0.22;
562
+ }
563
+
564
+ /* The tree and the drawer: side by side from 1100px of room. */
565
+ .rastro-campaigns__main {
566
+ display: grid;
567
+ grid-template-columns: minmax(0, 1fr);
568
+ gap: 16px;
569
+ align-items: start;
570
+ }
571
+ @container rastro-campaigns (min-width: 1100px) {
572
+ .rastro-campaigns__main {
573
+ grid-template-columns: minmax(0, 1fr) 360px;
574
+ }
575
+ }
576
+ .rastro-campaigns__tree {
577
+ min-width: 0;
578
+ }
579
+ .rastro-campaigns__segmented {
580
+ display: inline-flex;
581
+ gap: 2px;
582
+ padding: 3px;
583
+ border-radius: calc(var(--rastro-radius) - 1px);
584
+ background: var(--rastro-muted);
585
+ }
586
+ .rastro-campaigns__segmented button {
587
+ padding: 4px 10px;
588
+ border: 0;
589
+ border-radius: calc(var(--rastro-radius) - 3px);
590
+ background: transparent;
591
+ color: var(--rastro-muted-fg);
592
+ font: inherit;
593
+ font-size: 13px;
594
+ cursor: pointer;
595
+ }
596
+ .rastro-campaigns__segmented button[aria-pressed="true"] {
597
+ background: var(--rastro-card);
598
+ color: var(--rastro-fg);
599
+ box-shadow: 0 1px 2px rgb(0 0 0 / 8%);
600
+ }
601
+
602
+ /* The table scrolls inside its card rather than squeezing the names. */
603
+ .rastro-campaigns__table-wrap {
604
+ margin: 0 -16px;
605
+ padding: 0 16px;
606
+ overflow-x: auto;
607
+ }
608
+ .rastro-campaigns__table {
609
+ width: 100%;
610
+ min-width: 640px;
611
+ border-collapse: collapse;
612
+ font-size: 13px;
613
+ }
614
+ .rastro-campaigns__table[data-mode="full"] {
615
+ min-width: 760px;
616
+ }
617
+ .rastro-campaigns__table th {
618
+ padding: 8px;
619
+ border-bottom: 1px solid var(--rastro-border);
620
+ font-size: 12px;
621
+ font-weight: 500;
622
+ color: var(--rastro-muted-fg);
623
+ text-align: left;
624
+ white-space: nowrap;
625
+ }
626
+ .rastro-campaigns__table th:first-child,
627
+ .rastro-campaigns__table td:first-child {
628
+ padding-left: 4px;
629
+ }
630
+ .rastro-campaigns__table td:not(:first-child) {
631
+ white-space: nowrap;
632
+ }
633
+ .rastro-campaigns__table[data-mode="none"] .rastro-campaigns__bar-cell {
634
+ width: 140px;
635
+ min-width: 120px;
636
+ }
637
+ .rastro-campaigns__table abbr {
638
+ text-decoration: none;
639
+ }
640
+ .rastro-campaigns__table td {
641
+ padding: 8px;
642
+ border-bottom: 1px solid var(--rastro-border);
643
+ vertical-align: middle;
644
+ }
645
+ .rastro-campaigns__table tfoot td {
646
+ border-top: 1px solid var(--rastro-border);
647
+ border-bottom: 0;
648
+ font-weight: 600;
649
+ }
650
+ .rastro-campaigns__table .rastro-campaigns__n {
651
+ text-align: right;
652
+ }
653
+ .rastro-campaigns__row[data-selected="true"] > td {
654
+ background: var(--rastro-muted);
655
+ }
656
+ /* The name takes whatever the figures leave and truncates. */
657
+ .rastro-campaigns__name-cell {
658
+ width: 100%;
659
+ max-width: 0;
660
+ overflow: hidden;
661
+ }
662
+ .rastro-campaigns__name {
663
+ display: flex;
664
+ align-items: center;
665
+ gap: 8px;
666
+ min-width: 0;
667
+ }
668
+ .rastro-campaigns__name-text {
669
+ min-width: 0;
670
+ }
671
+ .rastro-campaigns__name-title {
672
+ overflow: hidden;
673
+ font-weight: 500;
674
+ text-overflow: ellipsis;
675
+ white-space: nowrap;
676
+ }
677
+ .rastro-campaigns__name[data-depth="0"] .rastro-campaigns__name-title {
678
+ font-weight: 600;
679
+ }
680
+ .rastro-campaigns__name-meta {
681
+ display: flex;
682
+ align-items: center;
683
+ gap: 4px;
684
+ overflow: hidden;
685
+ font-size: 12px;
686
+ color: var(--rastro-muted-fg);
687
+ text-overflow: ellipsis;
688
+ white-space: nowrap;
689
+ }
690
+ .rastro-campaigns__toggle,
691
+ .rastro-campaigns__close {
692
+ display: grid;
693
+ flex: none;
694
+ place-items: center;
695
+ width: 24px;
696
+ height: 24px;
697
+ padding: 0;
698
+ border: 0;
699
+ border-radius: 6px;
700
+ background: transparent;
701
+ color: var(--rastro-muted-fg);
702
+ cursor: pointer;
703
+ }
704
+ .rastro-campaigns__toggle:hover,
705
+ .rastro-campaigns__close:hover {
706
+ background: var(--rastro-muted);
707
+ }
708
+ .rastro-campaigns__ad-button {
709
+ display: block;
710
+ max-width: 100%;
711
+ overflow: hidden;
712
+ padding: 0;
713
+ border: 0;
714
+ background: none;
715
+ color: inherit;
716
+ font: inherit;
717
+ font-weight: 500;
718
+ text-align: left;
719
+ text-overflow: ellipsis;
720
+ white-space: nowrap;
721
+ cursor: pointer;
722
+ }
723
+ .rastro-campaigns__ad-button:hover {
724
+ text-decoration: underline;
725
+ }
726
+ .rastro-campaigns button:focus-visible {
727
+ outline: 2px solid var(--rastro-accent);
728
+ outline-offset: 2px;
729
+ }
730
+ .rastro-campaigns__rowbar {
731
+ position: relative;
732
+ display: block;
733
+ height: 8px;
734
+ overflow: hidden;
735
+ border-radius: 999px;
736
+ background: var(--rastro-muted);
737
+ }
738
+ .rastro-campaigns__rowbar i {
739
+ position: absolute;
740
+ inset: 0 auto 0 0;
741
+ border-radius: 999px;
742
+ background: var(--rastro-muted-fg);
743
+ opacity: 0.5;
744
+ }
745
+ .rastro-campaigns__rowbar i + i {
746
+ background: var(--rastro-accent);
747
+ opacity: 1;
748
+ }
749
+ .rastro-campaigns__bar-legend,
750
+ .rastro-campaigns__legend {
751
+ display: flex;
752
+ flex-wrap: wrap;
753
+ align-items: center;
754
+ gap: 4px 6px;
755
+ font-size: 11px;
756
+ font-weight: 400;
757
+ }
758
+ .rastro-campaigns__bar-legend i,
759
+ .rastro-campaigns__legend i {
760
+ display: inline-block;
761
+ width: 8px;
762
+ height: 8px;
763
+ border-radius: 999px;
764
+ }
765
+ .rastro-campaigns__bar-legend i[data-layer="lead"] {
766
+ background: var(--rastro-muted);
767
+ box-shadow: inset 0 0 0 1px var(--rastro-border);
768
+ }
769
+ .rastro-campaigns__bar-legend i[data-layer="qualified"] {
770
+ background: color-mix(in oklab, var(--rastro-muted-fg) 50%, transparent);
771
+ }
772
+ .rastro-campaigns__bar-legend i[data-layer="won"] {
773
+ background: var(--rastro-accent);
774
+ }
775
+ .rastro-campaigns__bands {
776
+ display: flex;
777
+ flex-wrap: wrap;
778
+ align-items: center;
779
+ gap: 8px 16px;
780
+ margin-top: 12px;
781
+ font-size: 12px;
782
+ color: var(--rastro-muted-fg);
783
+ }
784
+ .rastro-campaigns__bands > span {
785
+ display: flex;
786
+ align-items: center;
787
+ gap: 6px;
788
+ }
789
+ .rastro-campaigns__band-key {
790
+ min-width: 0;
791
+ }
792
+ .rastro-campaigns__bands-rule {
793
+ margin-right: auto;
794
+ }
795
+
796
+ /* Thumbnails: the copied creative, or a tinted placeholder. */
797
+ .rastro-campaigns__thumb {
798
+ position: relative;
799
+ display: grid;
800
+ flex: none;
801
+ place-items: center;
802
+ overflow: hidden;
803
+ background: var(--rastro-muted);
804
+ color: #fff;
805
+ }
806
+ .rastro-campaigns__thumb[data-size="row"] {
807
+ width: 34px;
808
+ height: 34px;
809
+ border-radius: 8px;
810
+ }
811
+ .rastro-campaigns__thumb[data-size="hero"] {
812
+ width: 100%;
813
+ height: 128px;
814
+ margin-bottom: 12px;
815
+ border-radius: var(--rastro-radius);
816
+ }
817
+ .rastro-campaigns__thumb img {
818
+ position: absolute;
819
+ inset: 0;
820
+ width: 100%;
821
+ height: 100%;
822
+ object-fit: cover;
823
+ }
824
+ .rastro-campaigns__play {
825
+ position: relative;
826
+ display: grid;
827
+ place-items: center;
828
+ }
829
+ .rastro-campaigns__thumb[data-size="hero"] > .rastro-campaigns__play {
830
+ padding: 10px;
831
+ border-radius: 999px;
832
+ background: rgb(0 0 0 / 22%);
833
+ }
834
+
835
+ /* The drawer of the selected ad. */
836
+ .rastro-campaigns__drawer {
837
+ min-width: 0;
838
+ container: rastro-drawer / inline-size;
839
+ }
840
+ .rastro-campaigns__drawer-head {
841
+ display: flex;
842
+ align-items: center;
843
+ justify-content: space-between;
844
+ gap: 8px;
845
+ margin-bottom: 10px;
846
+ }
847
+ .rastro-campaigns__crumb {
848
+ min-width: 0;
849
+ overflow: hidden;
850
+ font-size: 12px;
851
+ color: var(--rastro-muted-fg);
852
+ text-overflow: ellipsis;
853
+ white-space: nowrap;
854
+ }
855
+ .rastro-campaigns__drawer-title {
856
+ margin: 0;
857
+ overflow-wrap: anywhere;
858
+ font-size: 18px;
859
+ font-weight: 600;
860
+ }
861
+ .rastro-campaigns__drawer-meta {
862
+ display: flex;
863
+ flex-wrap: wrap;
864
+ align-items: center;
865
+ gap: 5px;
866
+ margin: 2px 0 0;
867
+ font-size: 13px;
868
+ color: var(--rastro-muted-fg);
869
+ }
870
+ .rastro-campaigns__minis {
871
+ display: grid;
872
+ grid-template-columns: repeat(3, minmax(0, 1fr));
873
+ gap: 8px;
874
+ margin: 12px 0 0;
875
+ }
876
+ .rastro-campaigns__minis > div {
877
+ min-width: 0;
878
+ container-type: inline-size;
879
+ padding: 8px 10px;
880
+ border-radius: calc(var(--rastro-radius) - 2px);
881
+ background: var(--rastro-muted);
882
+ }
883
+ .rastro-campaigns__minis dt {
884
+ overflow: hidden;
885
+ font-size: 11px;
886
+ color: var(--rastro-muted-fg);
887
+ text-overflow: ellipsis;
888
+ white-space: nowrap;
889
+ }
890
+ .rastro-campaigns__minis dd {
891
+ margin: 0;
892
+ font-size: clamp(12px, 17cqi, 16px);
893
+ font-weight: 600;
894
+ }
895
+ .rastro-campaigns__minis dd[data-long="true"] {
896
+ font-size: clamp(10px, 12.5cqi, 16px);
897
+ }
898
+ .rastro-campaigns__minis > [data-band="strong"] {
899
+ background: var(--rastro-strong-bg);
900
+ color: var(--rastro-strong);
901
+ }
902
+ .rastro-campaigns__minis > [data-band="ok"] {
903
+ background: var(--rastro-ok-bg);
904
+ color: var(--rastro-ok);
905
+ }
906
+ .rastro-campaigns__minis > [data-band="weak"] {
907
+ background: var(--rastro-weak-bg);
908
+ color: var(--rastro-weak);
909
+ }
910
+ .rastro-campaigns__daily {
911
+ margin: 14px 0 0;
912
+ }
913
+ .rastro-campaigns__daily-plot {
914
+ display: flex;
915
+ align-items: flex-end;
916
+ gap: 2px;
917
+ height: 48px;
918
+ }
919
+ .rastro-campaigns__daily-day {
920
+ position: relative;
921
+ flex: 1;
922
+ height: 100%;
923
+ }
924
+ .rastro-campaigns__daily-day i {
925
+ position: absolute;
926
+ inset: auto 0 0;
927
+ border-radius: 2px 2px 0 0;
928
+ }
929
+ .rastro-campaigns__daily i[data-layer="spend"],
930
+ .rastro-campaigns__legend i[data-layer="spend"] {
931
+ background: color-mix(in oklab, var(--rastro-muted-fg) 22%, transparent);
932
+ }
933
+ .rastro-campaigns__daily i[data-layer="won"],
934
+ .rastro-campaigns__legend i[data-layer="won"] {
935
+ background: var(--rastro-strong);
936
+ }
937
+ .rastro-campaigns__daily-day i[data-layer="won"] {
938
+ inset: auto 25% 0;
939
+ }
940
+ .rastro-campaigns__legend {
941
+ margin-top: 6px;
942
+ gap: 4px 14px;
943
+ color: var(--rastro-muted-fg);
944
+ }
945
+ .rastro-campaigns__legend span {
946
+ display: inline-flex;
947
+ align-items: center;
948
+ gap: 5px;
949
+ }
950
+ .rastro-campaigns__section {
951
+ margin-top: 16px;
952
+ }
953
+ .rastro-campaigns__section-title {
954
+ margin: 0 0 8px;
955
+ overflow: hidden;
956
+ font-size: 12px;
957
+ font-weight: 600;
958
+ letter-spacing: 0.04em;
959
+ color: var(--rastro-muted-fg);
960
+ text-overflow: ellipsis;
961
+ text-transform: uppercase;
962
+ white-space: nowrap;
963
+ }
964
+ .rastro-campaigns__leads {
965
+ margin: 0;
966
+ padding: 0;
967
+ list-style: none;
968
+ }
969
+ .rastro-campaigns__lead {
970
+ display: flex;
971
+ align-items: center;
972
+ gap: 10px;
973
+ width: 100%;
974
+ padding: 6px;
975
+ border: 0;
976
+ border-radius: calc(var(--rastro-radius) - 2px);
977
+ background: transparent;
978
+ color: inherit;
979
+ font: inherit;
980
+ text-align: left;
981
+ cursor: pointer;
982
+ }
983
+ .rastro-campaigns__lead:disabled {
984
+ cursor: default;
985
+ }
986
+ .rastro-campaigns__lead:not(:disabled):hover,
987
+ .rastro-campaigns__lead[aria-pressed="true"] {
988
+ background: var(--rastro-muted);
989
+ }
990
+ .rastro-campaigns__avatar {
991
+ display: grid;
992
+ flex: none;
993
+ place-items: center;
994
+ width: 32px;
995
+ height: 32px;
996
+ border-radius: 999px;
997
+ background: var(--rastro-muted);
998
+ font-size: 12px;
999
+ font-weight: 600;
1000
+ }
1001
+ .rastro-campaigns__lead[aria-pressed="true"] .rastro-campaigns__avatar {
1002
+ background: var(--rastro-card);
1003
+ }
1004
+ .rastro-campaigns__lead-text {
1005
+ flex: 1;
1006
+ min-width: 0;
1007
+ }
1008
+ .rastro-campaigns__lead-name {
1009
+ display: block;
1010
+ overflow: hidden;
1011
+ font-size: 13px;
1012
+ font-weight: 500;
1013
+ text-overflow: ellipsis;
1014
+ white-space: nowrap;
1015
+ }
1016
+ .rastro-campaigns__lead-meta {
1017
+ display: flex;
1018
+ align-items: center;
1019
+ gap: 4px;
1020
+ min-width: 0;
1021
+ font-size: 12px;
1022
+ color: var(--rastro-muted-fg);
1023
+ }
1024
+ .rastro-campaigns__clip {
1025
+ min-width: 0;
1026
+ overflow: hidden;
1027
+ text-overflow: ellipsis;
1028
+ white-space: nowrap;
1029
+ }
1030
+ .rastro-campaigns__timeline {
1031
+ display: flex;
1032
+ flex-direction: column;
1033
+ gap: 12px;
1034
+ margin: 0;
1035
+ padding: 0 0 0 14px;
1036
+ border-left: 2px solid var(--rastro-border);
1037
+ list-style: none;
1038
+ }
1039
+ .rastro-campaigns__timeline li {
1040
+ position: relative;
1041
+ display: flex;
1042
+ flex-direction: column;
1043
+ min-width: 0;
1044
+ }
1045
+ .rastro-campaigns__timeline li::before {
1046
+ position: absolute;
1047
+ top: 5px;
1048
+ left: -20px;
1049
+ width: 10px;
1050
+ height: 10px;
1051
+ border-radius: 999px;
1052
+ background: var(--rastro-card);
1053
+ box-shadow: 0 0 0 2px var(--rastro-accent);
1054
+ content: "";
1055
+ }
1056
+ .rastro-campaigns__timeline-title {
1057
+ display: flex;
1058
+ align-items: center;
1059
+ gap: 6px;
1060
+ font-size: 13px;
1061
+ font-weight: 500;
1062
+ }
1063
+ .rastro-campaigns__timeline-detail {
1064
+ font-size: 12px;
1065
+ color: var(--rastro-muted-fg);
1066
+ }
1067
+
1068
+ /* Devolvidas pra Meta, under the tree. */
1069
+ .rastro-campaigns__conversions {
1070
+ margin-top: 18px;
1071
+ padding-top: 16px;
1072
+ border-top: 1px solid var(--rastro-border);
1073
+ }
1074
+ .rastro-campaigns__conversions .rastro-campaigns__card-head {
1075
+ margin-bottom: 8px;
1076
+ }
1077
+ .rastro-campaigns__counts {
1078
+ display: flex;
1079
+ flex-wrap: wrap;
1080
+ gap: 6px;
1081
+ }
1082
+ .rastro-campaigns__conversion-list {
1083
+ margin: 0;
1084
+ padding: 0;
1085
+ list-style: none;
1086
+ }
1087
+ .rastro-campaigns__conversion-list li {
1088
+ display: grid;
1089
+ grid-template-columns: 16px minmax(0, 1fr) auto;
1090
+ align-items: center;
1091
+ gap: 4px 10px;
1092
+ padding: 7px 4px;
1093
+ border-bottom: 1px solid var(--rastro-border);
1094
+ font-size: 13px;
1095
+ }
1096
+ .rastro-campaigns__conversion-list li:last-child {
1097
+ border-bottom: 0;
1098
+ }
1099
+ .rastro-campaigns__conversion-list li[data-status="sent"] > svg {
1100
+ color: var(--rastro-strong);
1101
+ }
1102
+ .rastro-campaigns__conversion-list li[data-status="failed"] > svg {
1103
+ color: var(--rastro-weak);
1104
+ }
1105
+ .rastro-campaigns__conversion-list li[data-status="pending"] > svg {
1106
+ color: var(--rastro-muted-fg);
1107
+ }
1108
+ .rastro-campaigns__conversion-what,
1109
+ .rastro-campaigns__conversion-ad {
1110
+ min-width: 0;
1111
+ overflow: hidden;
1112
+ text-overflow: ellipsis;
1113
+ white-space: nowrap;
1114
+ }
1115
+ .rastro-campaigns__conversion-ad {
1116
+ grid-column: 2;
1117
+ grid-row: 2;
1118
+ font-size: 12px;
1119
+ color: var(--rastro-muted-fg);
1120
+ }
1121
+ .rastro-campaigns__conversion-when {
1122
+ font-size: 12px;
1123
+ color: var(--rastro-muted-fg);
1124
+ }
1125
+ @container rastro-campaigns (min-width: 640px) {
1126
+ .rastro-campaigns__conversion-list li {
1127
+ grid-template-columns: 16px minmax(0, 1.3fr) minmax(0, 1fr) auto;
1128
+ }
1129
+ .rastro-campaigns__conversion-ad {
1130
+ grid-column: auto;
1131
+ grid-row: auto;
1132
+ }
1133
+ }
1134
+
1135
+ .rastro-campaigns__post {
1136
+ display: block;
1137
+ margin-top: 6px;
1138
+ overflow: hidden;
1139
+ font-size: 12px;
1140
+ color: var(--rastro-muted-fg);
1141
+ text-overflow: ellipsis;
1142
+ white-space: nowrap;
1143
+ }
1144
+ .rastro-campaigns__post:hover {
1145
+ color: var(--rastro-fg);
1146
+ }
1147
+
1148
+ /* On a phone the three figures become rows: label left, value right. */
1149
+ @container rastro-drawer (max-width: 300px) {
1150
+ .rastro-campaigns__minis {
1151
+ grid-template-columns: minmax(0, 1fr);
1152
+ gap: 4px;
1153
+ }
1154
+ .rastro-campaigns__minis > div {
1155
+ display: flex;
1156
+ align-items: baseline;
1157
+ justify-content: space-between;
1158
+ gap: 8px;
1159
+ }
1160
+ .rastro-campaigns__minis dt {
1161
+ flex: 1 1 auto;
1162
+ min-width: 0;
1163
+ }
1164
+ .rastro-campaigns__minis dd,
1165
+ .rastro-campaigns__minis dd[data-long="true"] {
1166
+ flex: none;
1167
+ font-size: 14px;
1168
+ }
1169
+ }
1170
+
1171
+ .rastro-campaigns__tree-note {
1172
+ display: flex;
1173
+ align-items: center;
1174
+ gap: 6px;
1175
+ margin: 0 0 10px;
1176
+ font-size: 12px;
1177
+ color: var(--rastro-muted-fg);
1178
+ }
1179
+ .rastro-campaigns__more {
1180
+ margin-top: 4px;
1181
+ padding: 6px;
1182
+ border: 0;
1183
+ border-radius: calc(var(--rastro-radius) - 2px);
1184
+ background: transparent;
1185
+ color: var(--rastro-muted-fg);
1186
+ font: inherit;
1187
+ font-size: 12px;
1188
+ cursor: pointer;
1189
+ }
1190
+ .rastro-campaigns__more:hover {
1191
+ background: var(--rastro-muted);
1192
+ color: var(--rastro-fg);
1193
+ }
1194
+
1195
+ /* src/ui/integrations/integrations.css */
1196
+ /*
1197
+ * IntegrationsView (Integrações). Desktop is the B artboards; under 640px of
1198
+ * its own width (a container query) it turns into the phone layout (M1–M3):
1199
+ * [data-wide] parts hide, [data-narrow] parts show.
1200
+ */
1201
+
1202
+ .rastro-integrations {
1203
+ --rastro-integrations-meta: #0866ff;
1204
+ --rastro-integrations-input: color-mix(
1205
+ in oklab,
1206
+ var(--rastro-border) 80%,
1207
+ var(--rastro-fg) 8%
1208
+ );
1209
+ --rastro-integrations-ring: color-mix(
1210
+ in oklab,
1211
+ var(--rastro-fg) 10%,
1212
+ transparent
1213
+ );
1214
+ --rastro-integrations-danger: oklch(0.58 0.22 27);
1215
+ --rastro-integrations-ok: oklch(0.6 0.13 163);
1216
+ container: rastro-integrations / inline-size;
1217
+ /* The artboards set no line height: text sits on the font's own. */
1218
+ line-height: normal;
1219
+ display: flex;
1220
+ flex-direction: column;
1221
+ gap: 16px;
1222
+ min-width: 0;
1223
+ }
1224
+ .rastro-integrations p,
1225
+ .rastro-integrations h3,
1226
+ .rastro-integrations ul,
1227
+ .rastro-integrations ol {
1228
+ margin: 0;
1229
+ }
1230
+ .rastro-integrations :where(button, input, select) {
1231
+ font: inherit;
1232
+ color: inherit;
1233
+ }
1234
+ .rastro-integrations code,
1235
+ .rastro-integrations__mono,
1236
+ .rastro-integrations__code {
1237
+ font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
1238
+ font-size: 12px;
1239
+ }
1240
+ .rastro-integrations code {
1241
+ background: var(--rastro-muted);
1242
+ padding: 1px 5px;
1243
+ border-radius: 5px;
1244
+ }
1245
+ .rastro-integrations__icon,
1246
+ .rastro-integrations__brand {
1247
+ flex: none;
1248
+ }
1249
+ .rastro-integrations__sr {
1250
+ position: absolute;
1251
+ width: 1px;
1252
+ height: 1px;
1253
+ overflow: hidden;
1254
+ clip: rect(0 0 0 0);
1255
+ white-space: nowrap;
1256
+ }
1257
+ .rastro-integrations__grow {
1258
+ flex: 1;
1259
+ min-width: 0;
1260
+ }
1261
+ .rastro-integrations [data-narrow] {
1262
+ display: none;
1263
+ }
1264
+
1265
+ /* Surfaces */
1266
+ .rastro-integrations__card {
1267
+ background: var(--rastro-card);
1268
+ border-radius: var(--rastro-radius);
1269
+ box-shadow: 0 0 0 1px var(--rastro-integrations-ring);
1270
+ padding: 16px;
1271
+ min-width: 0;
1272
+ }
1273
+ .rastro-integrations__title {
1274
+ font-size: 15px;
1275
+ font-weight: 600;
1276
+ line-height: 1.35;
1277
+ }
1278
+ .rastro-integrations__title[data-size="lg"] {
1279
+ font-size: 18px;
1280
+ }
1281
+ .rastro-integrations__desc {
1282
+ color: var(--rastro-muted-fg);
1283
+ font-size: 13px;
1284
+ line-height: 1.45;
1285
+ margin-top: 2px;
1286
+ }
1287
+ .rastro-integrations__desc b {
1288
+ font-weight: 600;
1289
+ color: var(--rastro-fg);
1290
+ }
1291
+ .rastro-integrations__lede {
1292
+ font-size: 14px;
1293
+ }
1294
+ .rastro-integrations__meta {
1295
+ display: inline-flex;
1296
+ align-items: center;
1297
+ gap: 4px;
1298
+ font-size: 12px;
1299
+ color: var(--rastro-muted-fg);
1300
+ }
1301
+ .rastro-integrations__sec {
1302
+ font-size: 12px;
1303
+ font-weight: 600;
1304
+ color: var(--rastro-muted-fg);
1305
+ text-transform: uppercase;
1306
+ letter-spacing: 0.04em;
1307
+ margin: 0 0 8px;
1308
+ }
1309
+ .rastro-integrations__row-gap {
1310
+ display: flex;
1311
+ align-items: center;
1312
+ gap: 8px;
1313
+ min-width: 0;
1314
+ }
1315
+ .rastro-integrations__row-gap[data-gap="10"] {
1316
+ gap: 10px;
1317
+ }
1318
+ .rastro-integrations__divider {
1319
+ height: 1px;
1320
+ border: 0;
1321
+ background: var(--rastro-border);
1322
+ margin: 4px 0;
1323
+ }
1324
+ .rastro-integrations__tile {
1325
+ width: 44px;
1326
+ height: 44px;
1327
+ border-radius: 12px;
1328
+ background: oklch(0.96 0.02 255);
1329
+ display: grid;
1330
+ place-items: center;
1331
+ flex: none;
1332
+ }
1333
+ .rastro-integrations__tile[data-size="lg"] {
1334
+ width: 52px;
1335
+ height: 52px;
1336
+ border-radius: 14px;
1337
+ }
1338
+ .rastro-integrations__tile[data-size="sm"] {
1339
+ width: 36px;
1340
+ height: 36px;
1341
+ border-radius: 10px;
1342
+ }
1343
+ :where(.dark, .rastro-dark) .rastro-integrations__tile {
1344
+ background: oklch(0.3 0.05 255);
1345
+ }
1346
+
1347
+ /* Pills */
1348
+ .rastro-integrations__pill {
1349
+ display: inline-flex;
1350
+ align-items: center;
1351
+ gap: 6px;
1352
+ height: 22px;
1353
+ padding: 0 9px;
1354
+ border-radius: 999px;
1355
+ font-size: 12px;
1356
+ font-weight: 500;
1357
+ white-space: nowrap;
1358
+ background: var(--rastro-muted);
1359
+ }
1360
+ .rastro-integrations__pill[data-tone="ok"] {
1361
+ background: var(--rastro-strong-bg);
1362
+ color: var(--rastro-strong);
1363
+ }
1364
+ .rastro-integrations__pill[data-tone="ghost"] {
1365
+ background: transparent;
1366
+ box-shadow: inset 0 0 0 1px var(--rastro-border);
1367
+ color: var(--rastro-muted-fg);
1368
+ }
1369
+ .rastro-integrations__pill[data-tone="sync"] {
1370
+ background: oklch(0.95 0.03 250);
1371
+ color: oklch(0.45 0.12 255);
1372
+ }
1373
+ .rastro-integrations__pill[data-tone="bad"] {
1374
+ background: oklch(0.95 0.035 30);
1375
+ color: oklch(0.5 0.16 28);
1376
+ }
1377
+ .rastro-integrations__pill[data-tone="warn"] {
1378
+ background: oklch(0.96 0.045 85);
1379
+ color: oklch(0.45 0.1 70);
1380
+ }
1381
+ :where(.dark, .rastro-dark) .rastro-integrations__pill[data-tone="sync"] {
1382
+ background: oklch(0.35 0.07 255 / 60%);
1383
+ color: oklch(0.85 0.08 255);
1384
+ }
1385
+ :where(.dark, .rastro-dark) .rastro-integrations__pill[data-tone="bad"] {
1386
+ background: var(--rastro-weak-bg);
1387
+ color: var(--rastro-weak);
1388
+ }
1389
+ :where(.dark, .rastro-dark) .rastro-integrations__pill[data-tone="warn"] {
1390
+ background: var(--rastro-ok-bg);
1391
+ color: var(--rastro-ok);
1392
+ }
1393
+ .rastro-integrations__dot {
1394
+ width: 7px;
1395
+ height: 7px;
1396
+ border-radius: 999px;
1397
+ background: var(--rastro-integrations-ok);
1398
+ box-shadow: 0 0 0 3px
1399
+ color-mix(in oklab, var(--rastro-integrations-ok) 20%, transparent);
1400
+ display: inline-block;
1401
+ flex: none;
1402
+ }
1403
+ .rastro-integrations__spin {
1404
+ width: 10px;
1405
+ height: 10px;
1406
+ border-radius: 999px;
1407
+ border: 2px solid currentColor;
1408
+ border-right-color: transparent;
1409
+ display: inline-block;
1410
+ flex: none;
1411
+ animation: rastro-integrations-spin 0.9s linear infinite;
1412
+ }
1413
+ @keyframes rastro-integrations-spin {
1414
+ to {
1415
+ transform: rotate(360deg);
1416
+ }
1417
+ }
1418
+ @media (prefers-reduced-motion: reduce) {
1419
+ .rastro-integrations__spin {
1420
+ animation: none;
1421
+ }
1422
+ }
1423
+
1424
+ /* Avatars: the client's slot in the agency's list. */
1425
+ .rastro-integrations__avatar {
1426
+ --rastro-integrations-hue: 20;
1427
+ width: 32px;
1428
+ height: 32px;
1429
+ border-radius: 999px;
1430
+ display: grid;
1431
+ place-items: center;
1432
+ font-size: 12px;
1433
+ font-weight: 600;
1434
+ flex: none;
1435
+ background: oklch(0.92 0.05 var(--rastro-integrations-hue));
1436
+ color: oklch(0.45 0.12 var(--rastro-integrations-hue));
1437
+ }
1438
+ .rastro-integrations__avatar[data-size="sm"] {
1439
+ width: 26px;
1440
+ height: 26px;
1441
+ font-size: 11px;
1442
+ }
1443
+ .rastro-integrations__avatar[data-size="lg"] {
1444
+ width: 44px;
1445
+ height: 44px;
1446
+ font-size: 15px;
1447
+ }
1448
+ .rastro-integrations__avatar[data-hue="1"] {
1449
+ --rastro-integrations-hue: 225;
1450
+ }
1451
+ .rastro-integrations__avatar[data-hue="2"] {
1452
+ --rastro-integrations-hue: 80;
1453
+ }
1454
+ .rastro-integrations__avatar[data-hue="3"] {
1455
+ --rastro-integrations-hue: 300;
1456
+ }
1457
+ .rastro-integrations__avatar[data-hue="4"] {
1458
+ --rastro-integrations-hue: 160;
1459
+ }
1460
+ .rastro-integrations__avatar[data-hue="5"] {
1461
+ --rastro-integrations-hue: 0;
1462
+ }
1463
+ :where(.dark, .rastro-dark) .rastro-integrations__avatar {
1464
+ background: oklch(0.36 0.07 var(--rastro-integrations-hue));
1465
+ color: oklch(0.88 0.08 var(--rastro-integrations-hue));
1466
+ }
1467
+
1468
+ /* Buttons */
1469
+ .rastro-integrations__btn {
1470
+ display: inline-flex;
1471
+ align-items: center;
1472
+ justify-content: center;
1473
+ gap: 8px;
1474
+ height: 36px;
1475
+ padding: 0 14px;
1476
+ border: 0;
1477
+ border-radius: 8px;
1478
+ font-size: 14px;
1479
+ font-weight: 500;
1480
+ white-space: nowrap;
1481
+ cursor: pointer;
1482
+ background: var(--rastro-accent);
1483
+ color: var(--rastro-accent-fg);
1484
+ }
1485
+ .rastro-integrations .rastro-integrations__btn {
1486
+ color: var(--rastro-accent-fg);
1487
+ }
1488
+ .rastro-integrations__btn[data-variant="outline"] {
1489
+ background: var(--rastro-card);
1490
+ box-shadow: inset 0 0 0 1px var(--rastro-integrations-input);
1491
+ }
1492
+ .rastro-integrations .rastro-integrations__btn[data-variant="outline"],
1493
+ .rastro-integrations .rastro-integrations__btn[data-variant="ghost"] {
1494
+ color: var(--rastro-fg);
1495
+ }
1496
+ .rastro-integrations__btn[data-variant="ghost"] {
1497
+ background: transparent;
1498
+ }
1499
+ .rastro-integrations__btn[data-variant="facebook"] {
1500
+ background: var(--rastro-integrations-meta);
1501
+ }
1502
+ .rastro-integrations .rastro-integrations__btn[data-variant="facebook"],
1503
+ .rastro-integrations .rastro-integrations__btn[data-variant="danger"] {
1504
+ color: #fff;
1505
+ }
1506
+ .rastro-integrations__btn[data-variant="danger"] {
1507
+ background: var(--rastro-integrations-danger);
1508
+ }
1509
+ .rastro-integrations__btn[data-size="sm"] {
1510
+ height: 30px;
1511
+ padding: 0 10px;
1512
+ font-size: 13px;
1513
+ border-radius: 7px;
1514
+ }
1515
+ .rastro-integrations__btn[data-size="lg"] {
1516
+ height: 44px;
1517
+ padding: 0 20px;
1518
+ font-size: 15px;
1519
+ border-radius: 10px;
1520
+ }
1521
+ .rastro-integrations__btn:hover:not(:disabled) {
1522
+ filter: brightness(1.06);
1523
+ }
1524
+ .rastro-integrations__btn[data-variant="outline"]:hover:not(:disabled),
1525
+ .rastro-integrations__btn[data-variant="ghost"]:hover:not(:disabled) {
1526
+ filter: none;
1527
+ background: var(--rastro-muted);
1528
+ }
1529
+ .rastro-integrations__btn:disabled {
1530
+ opacity: 0.45;
1531
+ cursor: not-allowed;
1532
+ }
1533
+ .rastro-integrations__icon-btn {
1534
+ display: inline-grid;
1535
+ place-items: center;
1536
+ width: 30px;
1537
+ height: 30px;
1538
+ border: 0;
1539
+ border-radius: 7px;
1540
+ background: transparent;
1541
+ color: var(--rastro-muted-fg);
1542
+ cursor: pointer;
1543
+ flex: none;
1544
+ }
1545
+ .rastro-integrations__icon-btn:hover:not(:disabled) {
1546
+ background: var(--rastro-muted);
1547
+ color: var(--rastro-fg);
1548
+ }
1549
+ .rastro-integrations__link {
1550
+ border: 0;
1551
+ background: none;
1552
+ padding: 0;
1553
+ cursor: pointer;
1554
+ text-align: left;
1555
+ }
1556
+ .rastro-integrations__link:hover {
1557
+ color: var(--rastro-fg);
1558
+ text-decoration: underline;
1559
+ text-underline-offset: 2px;
1560
+ }
1561
+ .rastro-integrations :focus-visible {
1562
+ outline: 2px solid var(--rastro-accent);
1563
+ outline-offset: 2px;
1564
+ }
1565
+
1566
+ /* Fields */
1567
+ .rastro-integrations__field {
1568
+ display: flex;
1569
+ flex-direction: column;
1570
+ gap: 6px;
1571
+ min-width: 0;
1572
+ }
1573
+ .rastro-integrations__field > label {
1574
+ font-size: 13px;
1575
+ font-weight: 500;
1576
+ }
1577
+ .rastro-integrations__hint {
1578
+ font-size: 12px;
1579
+ color: var(--rastro-muted-fg);
1580
+ line-height: 1.45;
1581
+ }
1582
+ .rastro-integrations__input {
1583
+ display: flex;
1584
+ align-items: center;
1585
+ gap: 8px;
1586
+ width: 100%;
1587
+ height: 36px;
1588
+ padding: 0 12px;
1589
+ border: 1px solid var(--rastro-integrations-input);
1590
+ border-radius: 8px;
1591
+ background: var(--rastro-bg);
1592
+ font-size: 14px;
1593
+ min-width: 0;
1594
+ color: var(--rastro-fg);
1595
+ }
1596
+ .rastro-integrations__input[data-mono] {
1597
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
1598
+ font-size: 13px;
1599
+ }
1600
+ .rastro-integrations__input[data-icon] {
1601
+ color: var(--rastro-muted-fg);
1602
+ }
1603
+ .rastro-integrations__input input {
1604
+ flex: 1;
1605
+ min-width: 0;
1606
+ height: 100%;
1607
+ border: 0;
1608
+ padding: 0;
1609
+ background: transparent;
1610
+ font-size: 14px;
1611
+ color: var(--rastro-fg);
1612
+ outline: none;
1613
+ }
1614
+ .rastro-integrations__input:focus-within,
1615
+ input.rastro-integrations__input:focus {
1616
+ outline: 2px solid var(--rastro-accent);
1617
+ outline-offset: 1px;
1618
+ }
1619
+ .rastro-integrations__input::placeholder,
1620
+ .rastro-integrations__input input::placeholder {
1621
+ color: var(--rastro-muted-fg);
1622
+ opacity: 1;
1623
+ }
1624
+ .rastro-integrations__input[aria-invalid="true"] {
1625
+ border-color: var(--rastro-integrations-danger);
1626
+ }
1627
+
1628
+ /* Selects: a native <select> drawn like the artboards' picker. */
1629
+ .rastro-integrations__select {
1630
+ position: relative;
1631
+ display: flex;
1632
+ align-items: center;
1633
+ height: 36px;
1634
+ min-width: 0;
1635
+ border: 1px solid var(--rastro-integrations-input);
1636
+ border-radius: 8px;
1637
+ background: var(--rastro-card);
1638
+ font-size: 13.5px;
1639
+ }
1640
+ .rastro-integrations__select select {
1641
+ appearance: none;
1642
+ flex: 1;
1643
+ width: 100%;
1644
+ min-width: 0;
1645
+ height: 100%;
1646
+ border: 0;
1647
+ border-radius: inherit;
1648
+ background: transparent;
1649
+ padding: 0 32px 0 12px;
1650
+ font-size: 13.5px;
1651
+ cursor: pointer;
1652
+ text-overflow: ellipsis;
1653
+ }
1654
+ .rastro-integrations__select > .rastro-integrations__icon {
1655
+ position: absolute;
1656
+ right: 10px;
1657
+ pointer-events: none;
1658
+ }
1659
+ .rastro-integrations__select[data-avatar] select {
1660
+ padding-left: 46px;
1661
+ }
1662
+ .rastro-integrations__select[data-avatar] .rastro-integrations__avatar {
1663
+ position: absolute;
1664
+ left: 12px;
1665
+ pointer-events: none;
1666
+ }
1667
+ .rastro-integrations__select[data-tone="none"] {
1668
+ border-style: dashed;
1669
+ color: var(--rastro-muted-fg);
1670
+ }
1671
+ .rastro-integrations__select[data-tone="on"] {
1672
+ border-color: var(--rastro-accent);
1673
+ box-shadow: 0 0 0 1px var(--rastro-accent);
1674
+ font-weight: 600;
1675
+ }
1676
+ .rastro-integrations__select[data-tone="on"] select {
1677
+ font-weight: 600;
1678
+ }
1679
+ .rastro-integrations__select[data-static] {
1680
+ padding: 0 12px;
1681
+ background: var(--rastro-card);
1682
+ }
1683
+ .rastro-integrations__select:focus-within {
1684
+ outline: 2px solid var(--rastro-accent);
1685
+ outline-offset: 1px;
1686
+ }
1687
+ .rastro-integrations__select select:focus-visible {
1688
+ outline: none;
1689
+ }
1690
+ .rastro-integrations__select select:disabled {
1691
+ cursor: default;
1692
+ }
1693
+
1694
+ /* The account picker (a button + listbox popover). */
1695
+ .rastro-integrations__picker {
1696
+ position: relative;
1697
+ min-width: 0;
1698
+ }
1699
+ .rastro-integrations__select-btn {
1700
+ display: flex;
1701
+ align-items: center;
1702
+ gap: 8px;
1703
+ width: 210px;
1704
+ max-width: 100%;
1705
+ height: 36px;
1706
+ padding: 0 10px 0 12px;
1707
+ border: 1px dashed var(--rastro-integrations-input);
1708
+ border-radius: 8px;
1709
+ background: var(--rastro-card);
1710
+ color: var(--rastro-muted-fg);
1711
+ font-size: 13.5px;
1712
+ text-align: left;
1713
+ cursor: pointer;
1714
+ }
1715
+ .rastro-integrations__select-btn .rastro-integrations__grow {
1716
+ white-space: nowrap;
1717
+ overflow: hidden;
1718
+ text-overflow: ellipsis;
1719
+ }
1720
+ .rastro-integrations__select-btn[data-tone="chosen"] {
1721
+ width: 100%;
1722
+ border: 1px solid var(--rastro-accent);
1723
+ box-shadow: 0 0 0 1px var(--rastro-accent);
1724
+ color: var(--rastro-fg);
1725
+ }
1726
+ .rastro-integrations__select-btn b {
1727
+ font-weight: 500;
1728
+ }
1729
+ .rastro-integrations__select-btn .rastro-integrations__mono {
1730
+ color: var(--rastro-muted-fg);
1731
+ }
1732
+ .rastro-integrations__select-btn:disabled {
1733
+ cursor: default;
1734
+ }
1735
+ .rastro-integrations__popover {
1736
+ position: absolute;
1737
+ z-index: 20;
1738
+ top: calc(100% + 8px);
1739
+ left: -8px;
1740
+ width: 340px;
1741
+ max-width: calc(100cqw - 16px);
1742
+ box-shadow:
1743
+ 0 0 0 1px var(--rastro-border),
1744
+ 0 16px 40px -12px rgb(11 20 38 / 30%);
1745
+ }
1746
+ .rastro-integrations__popover .rastro-integrations__sec {
1747
+ margin-bottom: 6px;
1748
+ }
1749
+ .rastro-integrations__options {
1750
+ list-style: none;
1751
+ padding: 0;
1752
+ }
1753
+ .rastro-integrations__option {
1754
+ display: flex;
1755
+ align-items: center;
1756
+ gap: 10px;
1757
+ padding: 8px;
1758
+ border-radius: 8px;
1759
+ cursor: pointer;
1760
+ }
1761
+ .rastro-integrations__option .rastro-integrations__grow {
1762
+ display: flex;
1763
+ flex-direction: column;
1764
+ }
1765
+ .rastro-integrations__option-name {
1766
+ font-weight: 500;
1767
+ font-size: 13px;
1768
+ }
1769
+ .rastro-integrations__option[data-suggested],
1770
+ .rastro-integrations__option[data-active] {
1771
+ background: var(--rastro-muted);
1772
+ }
1773
+ .rastro-integrations__option[aria-disabled="true"] {
1774
+ opacity: 0.45;
1775
+ cursor: not-allowed;
1776
+ background: transparent;
1777
+ }
1778
+ .rastro-integrations__popover > .rastro-integrations__link {
1779
+ padding: 6px 8px 2px;
1780
+ }
1781
+
1782
+ /* Menus */
1783
+ .rastro-integrations__menu-wrap {
1784
+ position: relative;
1785
+ display: inline-flex;
1786
+ }
1787
+ .rastro-integrations__menu {
1788
+ position: absolute;
1789
+ z-index: 20;
1790
+ top: calc(100% + 4px);
1791
+ right: 0;
1792
+ min-width: 220px;
1793
+ padding: 4px;
1794
+ display: flex;
1795
+ flex-direction: column;
1796
+ box-shadow:
1797
+ 0 0 0 1px var(--rastro-border),
1798
+ 0 16px 40px -12px rgb(11 20 38 / 30%);
1799
+ }
1800
+ .rastro-integrations__menu-wrap:has(.rastro-integrations__link)
1801
+ .rastro-integrations__menu {
1802
+ left: 0;
1803
+ right: auto;
1804
+ }
1805
+ .rastro-integrations__menu button {
1806
+ border: 0;
1807
+ background: none;
1808
+ text-align: left;
1809
+ font-size: 13px;
1810
+ padding: 8px 10px;
1811
+ border-radius: 6px;
1812
+ cursor: pointer;
1813
+ white-space: nowrap;
1814
+ }
1815
+ .rastro-integrations__menu button:hover:not(:disabled),
1816
+ .rastro-integrations__menu button:focus-visible {
1817
+ background: var(--rastro-muted);
1818
+ outline: none;
1819
+ }
1820
+ .rastro-integrations__menu button[data-tone="danger"] {
1821
+ color: var(--rastro-integrations-danger);
1822
+ }
1823
+ .rastro-integrations__menu button:disabled {
1824
+ opacity: 0.45;
1825
+ cursor: not-allowed;
1826
+ }
1827
+
1828
+ /* Callouts */
1829
+ /* The pixel's test mode, under the row's sends: the chip, then why. */
1830
+ .rastro-integrations__test-mode {
1831
+ display: flex;
1832
+ flex-wrap: wrap;
1833
+ align-items: center;
1834
+ gap: 4px 6px;
1835
+ margin-top: 6px;
1836
+ max-width: 260px;
1837
+ }
1838
+
1839
+ .rastro-integrations__callout {
1840
+ display: flex;
1841
+ gap: 12px;
1842
+ padding: 12px 14px;
1843
+ border-radius: 12px;
1844
+ font-size: 13px;
1845
+ line-height: 1.45;
1846
+ align-items: flex-start;
1847
+ }
1848
+ .rastro-integrations__callout > .rastro-integrations__icon {
1849
+ margin-top: 2px;
1850
+ }
1851
+ .rastro-integrations__callout b {
1852
+ font-weight: 600;
1853
+ }
1854
+ .rastro-integrations__callout[data-tone="info"] {
1855
+ background: var(--rastro-muted);
1856
+ color: color-mix(in oklab, var(--rastro-fg) 85%, var(--rastro-muted-fg));
1857
+ }
1858
+ .rastro-integrations__callout[data-tone="ok"] {
1859
+ background: var(--rastro-strong-bg);
1860
+ color: var(--rastro-strong);
1861
+ }
1862
+ .rastro-integrations__callout[data-tone="bad"] {
1863
+ background: oklch(0.97 0.022 30);
1864
+ box-shadow: inset 0 0 0 1px oklch(0.88 0.06 30);
1865
+ color: oklch(0.38 0.1 28);
1866
+ }
1867
+ .rastro-integrations__callout[data-tone="warn"] {
1868
+ background: oklch(0.975 0.035 85);
1869
+ box-shadow: inset 0 0 0 1px oklch(0.88 0.07 85);
1870
+ color: oklch(0.38 0.08 70);
1871
+ align-items: center;
1872
+ }
1873
+ :where(.dark, .rastro-dark) .rastro-integrations__callout[data-tone="bad"] {
1874
+ background: var(--rastro-weak-bg);
1875
+ box-shadow: none;
1876
+ color: var(--rastro-weak);
1877
+ }
1878
+ :where(.dark, .rastro-dark) .rastro-integrations__callout[data-tone="warn"] {
1879
+ background: var(--rastro-ok-bg);
1880
+ box-shadow: none;
1881
+ color: var(--rastro-ok);
1882
+ }
1883
+ .rastro-integrations__callout[data-size="lg"] {
1884
+ padding: 14px 16px;
1885
+ }
1886
+ .rastro-integrations__callout[data-size="lg"] > .rastro-integrations__icon {
1887
+ margin-top: 0;
1888
+ }
1889
+ .rastro-integrations__callout[data-stack] {
1890
+ flex-direction: column;
1891
+ gap: 8px;
1892
+ }
1893
+ .rastro-integrations__callout .rastro-integrations__code {
1894
+ font-size: 11.5px;
1895
+ opacity: 0.8;
1896
+ background: none;
1897
+ padding: 0;
1898
+ }
1899
+ .rastro-integrations__callout[data-stack] .rastro-integrations__code {
1900
+ font-size: 11px;
1901
+ opacity: 0.75;
1902
+ }
1903
+ .rastro-integrations__callout p {
1904
+ flex: 1;
1905
+ min-width: 0;
1906
+ }
1907
+
1908
+ /* Business B2: the partner who runs the company's Meta, and its consent. */
1909
+ .rastro-integrations__partner {
1910
+ display: flex;
1911
+ gap: 16px;
1912
+ align-items: flex-start;
1913
+ padding: 20px 22px;
1914
+ box-shadow: 0 0 0 1px
1915
+ color-mix(in oklab, var(--rastro-accent) 35%, var(--rastro-border));
1916
+ }
1917
+ .rastro-integrations__partner .rastro-integrations__desc {
1918
+ margin-top: 4px;
1919
+ max-width: 620px;
1920
+ }
1921
+ .rastro-integrations__tile[data-tone="partner"] {
1922
+ background: color-mix(in oklab, var(--rastro-accent) 12%, var(--rastro-card));
1923
+ color: var(--rastro-accent);
1924
+ }
1925
+ .rastro-integrations__eyebrow {
1926
+ font-size: 11px;
1927
+ font-weight: 600;
1928
+ letter-spacing: 0.08em;
1929
+ text-transform: uppercase;
1930
+ color: var(--rastro-accent);
1931
+ margin: 0 0 2px;
1932
+ }
1933
+ .rastro-integrations__consent {
1934
+ display: flex;
1935
+ gap: 10px;
1936
+ align-items: flex-start;
1937
+ flex: none;
1938
+ max-width: 340px;
1939
+ padding: 12px 14px;
1940
+ border-radius: 10px;
1941
+ background: var(--rastro-muted);
1942
+ font-size: 13px;
1943
+ cursor: pointer;
1944
+ }
1945
+ .rastro-integrations__consent .rastro-integrations__check {
1946
+ margin-top: 2px;
1947
+ }
1948
+ .rastro-integrations__consent .rastro-integrations__grow {
1949
+ display: flex;
1950
+ flex-direction: column;
1951
+ gap: 2px;
1952
+ }
1953
+
1954
+ /* B1: the two ways in */
1955
+ .rastro-integrations__start {
1956
+ display: grid;
1957
+ grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
1958
+ gap: 16px;
1959
+ }
1960
+ /* Business before the company's site exists: the login alone. */
1961
+ .rastro-integrations__start[data-single] {
1962
+ grid-template-columns: minmax(0, 1fr);
1963
+ }
1964
+ .rastro-integrations__connect {
1965
+ padding: 28px;
1966
+ display: flex;
1967
+ flex-direction: column;
1968
+ gap: 16px;
1969
+ }
1970
+ .rastro-integrations__connect .rastro-integrations__desc {
1971
+ max-width: 520px;
1972
+ }
1973
+ .rastro-integrations__perks {
1974
+ list-style: none;
1975
+ padding: 0;
1976
+ display: flex;
1977
+ flex-direction: column;
1978
+ gap: 8px;
1979
+ font-size: 13.5px;
1980
+ }
1981
+ .rastro-integrations__perks li {
1982
+ display: flex;
1983
+ gap: 8px;
1984
+ align-items: center;
1985
+ }
1986
+ .rastro-integrations__connect-action {
1987
+ display: flex;
1988
+ gap: 12px;
1989
+ align-items: center;
1990
+ flex-wrap: wrap;
1991
+ margin-top: 4px;
1992
+ }
1993
+ .rastro-integrations__planb {
1994
+ padding: 22px;
1995
+ display: flex;
1996
+ flex-direction: column;
1997
+ gap: 12px;
1998
+ }
1999
+ .rastro-integrations__planb-form {
2000
+ display: flex;
2001
+ flex-direction: column;
2002
+ gap: 12px;
2003
+ }
2004
+ .rastro-integrations__form-foot {
2005
+ display: flex;
2006
+ justify-content: flex-end;
2007
+ }
2008
+
2009
+ /* B3/B4: the connection */
2010
+ .rastro-integrations__conn {
2011
+ display: flex;
2012
+ align-items: center;
2013
+ gap: 16px;
2014
+ padding: 16px 18px;
2015
+ }
2016
+ .rastro-integrations__conn-body {
2017
+ flex: 1;
2018
+ min-width: 0;
2019
+ }
2020
+ .rastro-integrations__conn-line {
2021
+ display: flex;
2022
+ flex-wrap: wrap;
2023
+ gap: 2px 14px;
2024
+ align-items: center;
2025
+ color: var(--rastro-muted-fg);
2026
+ font-size: 13px;
2027
+ margin-top: 2px;
2028
+ }
2029
+ .rastro-integrations__conn-actions {
2030
+ display: flex;
2031
+ align-items: center;
2032
+ gap: 8px;
2033
+ flex-wrap: wrap;
2034
+ justify-content: flex-end;
2035
+ }
2036
+ .rastro-integrations__conn-phone {
2037
+ display: flex;
2038
+ align-items: center;
2039
+ gap: 10px;
2040
+ padding: 12px 14px;
2041
+ }
2042
+ .rastro-integrations__conn-phone .rastro-integrations__grow {
2043
+ display: flex;
2044
+ flex-direction: column;
2045
+ }
2046
+
2047
+ /* The clients' table */
2048
+ .rastro-integrations__clients {
2049
+ padding: 8px 8px 4px;
2050
+ }
2051
+ .rastro-integrations__clients-head,
2052
+ .rastro-integrations__section-head {
2053
+ display: flex;
2054
+ justify-content: space-between;
2055
+ align-items: flex-start;
2056
+ gap: 12px;
2057
+ }
2058
+ .rastro-integrations__clients-head {
2059
+ padding: 10px 10px 0;
2060
+ margin-bottom: 4px;
2061
+ }
2062
+ .rastro-integrations__section-head {
2063
+ margin-bottom: 12px;
2064
+ }
2065
+ .rastro-integrations__seg {
2066
+ display: inline-flex;
2067
+ background: var(--rastro-muted);
2068
+ border-radius: 9px;
2069
+ padding: 3px;
2070
+ gap: 2px;
2071
+ font-size: 13px;
2072
+ flex: none;
2073
+ }
2074
+ .rastro-integrations__seg button {
2075
+ border: 0;
2076
+ background: none;
2077
+ padding: 4px 10px;
2078
+ border-radius: 7px;
2079
+ color: var(--rastro-muted-fg);
2080
+ white-space: nowrap;
2081
+ cursor: pointer;
2082
+ font-size: 13px;
2083
+ }
2084
+ .rastro-integrations__seg button[aria-pressed="true"] {
2085
+ background: var(--rastro-card);
2086
+ color: var(--rastro-fg);
2087
+ box-shadow: 0 1px 2px rgb(0 0 0 / 8%);
2088
+ }
2089
+ .rastro-integrations__table {
2090
+ width: 100%;
2091
+ border-collapse: collapse;
2092
+ font-size: 13px;
2093
+ }
2094
+ .rastro-integrations__table th {
2095
+ text-align: left;
2096
+ font-weight: 500;
2097
+ color: var(--rastro-muted-fg);
2098
+ font-size: 12px;
2099
+ padding: 8px 10px;
2100
+ border-bottom: 1px solid var(--rastro-border);
2101
+ white-space: nowrap;
2102
+ }
2103
+ .rastro-integrations__table td {
2104
+ padding: 12px 10px;
2105
+ border-bottom: 1px solid var(--rastro-border);
2106
+ vertical-align: middle;
2107
+ }
2108
+ .rastro-integrations__table tbody tr:last-child td {
2109
+ border-bottom: 0;
2110
+ }
2111
+ .rastro-integrations__table tr[data-selected] td {
2112
+ background: var(--rastro-muted);
2113
+ }
2114
+ .rastro-integrations__table [data-col="menu"] {
2115
+ width: 38px;
2116
+ padding-left: 4px;
2117
+ padding-right: 4px;
2118
+ text-align: right;
2119
+ }
2120
+ .rastro-integrations__clients[data-offline] .rastro-integrations__table {
2121
+ opacity: 0.55;
2122
+ }
2123
+ .rastro-integrations__cell-top {
2124
+ font-weight: 500;
2125
+ white-space: nowrap;
2126
+ }
2127
+ .rastro-integrations__table td > .rastro-integrations__meta {
2128
+ display: block;
2129
+ max-width: 180px;
2130
+ overflow: hidden;
2131
+ text-overflow: ellipsis;
2132
+ white-space: nowrap;
2133
+ }
2134
+ .rastro-integrations__table
2135
+ td
2136
+ > .rastro-integrations__meta.rastro-integrations__mono {
2137
+ color: var(--rastro-muted-fg);
2138
+ }
2139
+ .rastro-integrations__table[data-mode="linked"]
2140
+ td[data-col="pixel"]
2141
+ .rastro-integrations__cell-top,
2142
+ .rastro-integrations__table[data-mode="linked"]
2143
+ td[data-col="currency"]
2144
+ .rastro-integrations__cell-top {
2145
+ font-weight: 400;
2146
+ }
2147
+ .rastro-integrations__table[data-mode="stopped"]
2148
+ td:nth-child(4)
2149
+ .rastro-integrations__cell-top {
2150
+ font-weight: 400;
2151
+ }
2152
+ .rastro-integrations__grant {
2153
+ display: block;
2154
+ margin-top: 4px;
2155
+ }
2156
+ .rastro-integrations__pills .rastro-integrations__grant {
2157
+ margin-top: 0;
2158
+ align-self: center;
2159
+ }
2160
+ .rastro-integrations__owner {
2161
+ margin-top: 2px;
2162
+ }
2163
+ .rastro-integrations__client {
2164
+ display: flex;
2165
+ align-items: center;
2166
+ gap: 10px;
2167
+ min-width: 0;
2168
+ }
2169
+ .rastro-integrations__client[data-size="sm"] {
2170
+ gap: 8px;
2171
+ }
2172
+ .rastro-integrations__client-name {
2173
+ display: flex;
2174
+ flex-direction: column;
2175
+ min-width: 0;
2176
+ }
2177
+ /* Long names end in an ellipsis instead of widening the table. */
2178
+ .rastro-integrations__table .rastro-integrations__client-name {
2179
+ max-width: 160px;
2180
+ }
2181
+ .rastro-integrations__table .rastro-integrations__cell-top {
2182
+ max-width: 180px;
2183
+ overflow: hidden;
2184
+ text-overflow: ellipsis;
2185
+ }
2186
+ .rastro-integrations__feed .rastro-integrations__client {
2187
+ max-width: 200px;
2188
+ overflow: hidden;
2189
+ text-overflow: ellipsis;
2190
+ white-space: nowrap;
2191
+ }
2192
+ .rastro-integrations__client-name strong {
2193
+ font-weight: 600;
2194
+ overflow: hidden;
2195
+ text-overflow: ellipsis;
2196
+ white-space: nowrap;
2197
+ }
2198
+ .rastro-integrations__client-name .rastro-integrations__meta {
2199
+ display: block;
2200
+ overflow: hidden;
2201
+ text-overflow: ellipsis;
2202
+ white-space: nowrap;
2203
+ }
2204
+
2205
+ /* The feed of events sent */
2206
+ .rastro-integrations__feed .rastro-integrations__table td {
2207
+ padding: 12px 10px;
2208
+ }
2209
+ .rastro-integrations__feed [data-col="icon"] {
2210
+ width: 36px;
2211
+ color: var(--rastro-muted-fg);
2212
+ }
2213
+ .rastro-integrations__feed [data-col="ad"],
2214
+ .rastro-integrations__feed [data-col="when"] {
2215
+ color: var(--rastro-muted-fg);
2216
+ font-size: 12px;
2217
+ }
2218
+ .rastro-integrations__feed [data-col="when"] {
2219
+ text-align: right;
2220
+ white-space: nowrap;
2221
+ }
2222
+ .rastro-integrations__evt {
2223
+ display: inline-flex;
2224
+ align-items: center;
2225
+ gap: 6px;
2226
+ font-weight: 600;
2227
+ }
2228
+ .rastro-integrations__evt i {
2229
+ font-style: normal;
2230
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
2231
+ font-size: 11px;
2232
+ font-weight: 500;
2233
+ color: var(--rastro-muted-fg);
2234
+ }
2235
+
2236
+ /* B4: what reconnecting brings back */
2237
+ .rastro-integrations__plan .rastro-integrations__title {
2238
+ margin-bottom: 12px;
2239
+ }
2240
+ .rastro-integrations__steps {
2241
+ list-style: none;
2242
+ padding: 0;
2243
+ display: grid;
2244
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2245
+ gap: 16px;
2246
+ }
2247
+ .rastro-integrations__steps li {
2248
+ display: flex;
2249
+ gap: 10px;
2250
+ }
2251
+ .rastro-integrations__steps strong {
2252
+ font-weight: 600;
2253
+ font-size: 13.5px;
2254
+ }
2255
+ .rastro-integrations__step-icon {
2256
+ width: 32px;
2257
+ height: 32px;
2258
+ border-radius: 9px;
2259
+ background: var(--rastro-muted);
2260
+ display: grid;
2261
+ place-items: center;
2262
+ flex: none;
2263
+ }
2264
+
2265
+ /* Header chip ("3 de 4 clientes ligados"), drawn by the host's header. */
2266
+ .rastro-integrations__badge {
2267
+ display: inline-flex;
2268
+ align-items: center;
2269
+ gap: 7px;
2270
+ height: 36px;
2271
+ padding: 0 12px;
2272
+ border-radius: 8px;
2273
+ background: var(--rastro-card);
2274
+ box-shadow: 0 0 0 1px var(--rastro-border);
2275
+ font-size: 13px;
2276
+ white-space: nowrap;
2277
+ color: color-mix(in oklab, var(--rastro-fg) 85%, var(--rastro-muted-fg));
2278
+ }
2279
+ .rastro-integrations__badge[data-tone="bad"] {
2280
+ color: oklch(0.5 0.16 28);
2281
+ }
2282
+ .rastro-integrations__badge .rastro-integrations__dot {
2283
+ background: var(--rastro-integrations-ok, oklch(0.6 0.13 163));
2284
+ }
2285
+
2286
+ /* B2: the waiting chip while Meta's window is open (a manual popover, in
2287
+ the top layer like the dialogs). */
2288
+ .rastro-integrations__waiting {
2289
+ position: fixed;
2290
+ inset: auto auto 24px 24px;
2291
+ margin: 0;
2292
+ border: 0;
2293
+ z-index: 60;
2294
+ font-family: var(--rastro-font);
2295
+ display: inline-flex;
2296
+ align-items: center;
2297
+ gap: 7px;
2298
+ height: 36px;
2299
+ max-width: calc(100vw - 48px);
2300
+ padding: 0 12px;
2301
+ border-radius: 8px;
2302
+ background: var(--rastro-card);
2303
+ box-shadow: 0 0 0 1px var(--rastro-border);
2304
+ font-size: 13px;
2305
+ color: color-mix(in oklab, var(--rastro-fg) 85%, var(--rastro-muted-fg));
2306
+ overflow: hidden;
2307
+ white-space: nowrap;
2308
+ text-overflow: ellipsis;
2309
+ }
2310
+ .rastro-integrations__waiting .rastro-integrations__spin {
2311
+ color: var(--rastro-integrations-meta);
2312
+ }
2313
+
2314
+ /* Overlays: dialogs and the events sheet */
2315
+ /* A native <dialog> in the top layer, drawn as the scrim itself. */
2316
+ .rastro-integrations__scrim {
2317
+ position: fixed;
2318
+ inset: 0;
2319
+ width: 100%;
2320
+ height: 100%;
2321
+ max-width: none;
2322
+ max-height: none;
2323
+ margin: 0;
2324
+ border: 0;
2325
+ color: var(--rastro-fg);
2326
+ font-family: var(--rastro-font);
2327
+ font-size: 14px;
2328
+ line-height: normal;
2329
+ background: rgb(11 20 38 / 42%);
2330
+ padding: 16px;
2331
+ overflow-y: auto;
2332
+ }
2333
+ .rastro-integrations__scrim[open] {
2334
+ display: grid;
2335
+ place-items: center;
2336
+ }
2337
+ .rastro-integrations__scrim::backdrop {
2338
+ background: transparent;
2339
+ }
2340
+ .rastro-integrations__scrim[data-side] {
2341
+ place-items: stretch end;
2342
+ background: rgb(11 20 38 / 32%);
2343
+ padding: 0;
2344
+ overflow: hidden;
2345
+ }
2346
+ .rastro-integrations__dialog {
2347
+ min-width: 0;
2348
+ overflow-wrap: anywhere;
2349
+ background: var(--rastro-card);
2350
+ border-radius: var(--rastro-radius);
2351
+ box-shadow: 0 24px 60px -12px rgb(11 20 38 / 45%);
2352
+ width: min(560px, 100%);
2353
+ padding: 22px;
2354
+ display: flex;
2355
+ flex-direction: column;
2356
+ gap: 14px;
2357
+ outline: none;
2358
+ }
2359
+ .rastro-integrations__dialog-head {
2360
+ display: flex;
2361
+ gap: 12px;
2362
+ align-items: flex-start;
2363
+ }
2364
+ .rastro-integrations__dialog-title {
2365
+ font-size: 18px;
2366
+ font-weight: 600;
2367
+ line-height: 1.3;
2368
+ }
2369
+ .rastro-integrations__dialog-head .rastro-integrations__desc b {
2370
+ font-weight: 600;
2371
+ }
2372
+ .rastro-integrations__danger-tile {
2373
+ width: 40px;
2374
+ height: 40px;
2375
+ border-radius: 10px;
2376
+ background: oklch(0.95 0.035 30);
2377
+ color: oklch(0.5 0.16 28);
2378
+ display: grid;
2379
+ place-items: center;
2380
+ flex: none;
2381
+ }
2382
+ .rastro-integrations__bullets {
2383
+ list-style: disc;
2384
+ padding-left: 22px;
2385
+ line-height: 1.7;
2386
+ }
2387
+ .rastro-integrations__line-skeleton {
2388
+ display: inline-block;
2389
+ width: 70%;
2390
+ height: 12px;
2391
+ vertical-align: middle;
2392
+ }
2393
+ .rastro-integrations__dialog-foot {
2394
+ display: flex;
2395
+ justify-content: flex-end;
2396
+ flex-wrap: wrap;
2397
+ gap: 8px;
2398
+ margin-top: 4px;
2399
+ }
2400
+
2401
+ .rastro-integrations__sheet {
2402
+ container: rastro-integrations-sheet / inline-size;
2403
+ width: min(720px, 100vw);
2404
+ height: 100dvh;
2405
+ max-height: 100dvh;
2406
+ background: var(--rastro-card);
2407
+ display: flex;
2408
+ flex-direction: column;
2409
+ box-shadow: -20px 0 50px -20px rgb(11 20 38 / 40%);
2410
+ outline: none;
2411
+ }
2412
+ .rastro-integrations__sheet-bar {
2413
+ display: none;
2414
+ }
2415
+ .rastro-integrations__sheet-body {
2416
+ flex: 1;
2417
+ min-height: 0;
2418
+ overflow-y: auto;
2419
+ padding: 26px 28px 8px;
2420
+ display: flex;
2421
+ flex-direction: column;
2422
+ gap: 16px;
2423
+ }
2424
+ .rastro-integrations__sheet-head {
2425
+ display: flex;
2426
+ align-items: flex-start;
2427
+ gap: 12px;
2428
+ }
2429
+ .rastro-integrations__sheet-head .rastro-integrations__icon-btn {
2430
+ margin: -4px -6px 0 0;
2431
+ }
2432
+ .rastro-integrations__pixelbar {
2433
+ display: flex;
2434
+ gap: 10px;
2435
+ align-items: center;
2436
+ padding: 10px 12px;
2437
+ border-radius: 10px;
2438
+ background: var(--rastro-muted);
2439
+ font-size: 13px;
2440
+ min-width: 0;
2441
+ }
2442
+ .rastro-integrations__pixelbar b {
2443
+ font-weight: 600;
2444
+ }
2445
+ .rastro-integrations__maprow {
2446
+ display: grid;
2447
+ grid-template-columns: 24px minmax(0, 1fr) 24px minmax(0, 1.35fr) 140px;
2448
+ align-items: center;
2449
+ gap: 12px;
2450
+ padding: 12px 4px;
2451
+ border-bottom: 1px solid var(--rastro-border);
2452
+ }
2453
+ .rastro-integrations__map-group:last-child
2454
+ .rastro-integrations__maprow:last-child {
2455
+ border-bottom: 0;
2456
+ }
2457
+ .rastro-integrations__group {
2458
+ font-size: 12px;
2459
+ font-weight: 600;
2460
+ color: var(--rastro-muted-fg);
2461
+ padding: 14px 4px 4px;
2462
+ border-bottom: 1px solid var(--rastro-border);
2463
+ }
2464
+ .rastro-integrations__stage {
2465
+ display: flex;
2466
+ align-items: center;
2467
+ gap: 10px;
2468
+ font-weight: 500;
2469
+ min-width: 0;
2470
+ }
2471
+ .rastro-integrations__stage-name {
2472
+ overflow: hidden;
2473
+ text-overflow: ellipsis;
2474
+ white-space: nowrap;
2475
+ }
2476
+ .rastro-integrations__stage .rastro-integrations__meta {
2477
+ margin-left: 4px;
2478
+ font-weight: 400;
2479
+ }
2480
+ .rastro-integrations__swatch {
2481
+ width: 10px;
2482
+ height: 10px;
2483
+ border-radius: 3px;
2484
+ flex: none;
2485
+ background: oklch(0.8 0.01 255);
2486
+ }
2487
+ .rastro-integrations__swatch[data-fixed] {
2488
+ background: var(--rastro-integrations-ok);
2489
+ }
2490
+ .rastro-integrations__arrow {
2491
+ display: grid;
2492
+ place-items: center;
2493
+ color: var(--rastro-muted-fg);
2494
+ }
2495
+ .rastro-integrations__map-note {
2496
+ white-space: nowrap;
2497
+ }
2498
+ .rastro-integrations__map-skeleton {
2499
+ height: 220px;
2500
+ margin-top: 8px;
2501
+ }
2502
+ .rastro-integrations__check {
2503
+ position: relative;
2504
+ display: inline-grid;
2505
+ place-items: center;
2506
+ width: 16px;
2507
+ height: 16px;
2508
+ flex: none;
2509
+ }
2510
+ .rastro-integrations__check input {
2511
+ appearance: none;
2512
+ margin: 0;
2513
+ width: 16px;
2514
+ height: 16px;
2515
+ border-radius: 4px;
2516
+ box-shadow: inset 0 0 0 1.5px var(--rastro-integrations-input);
2517
+ background: var(--rastro-card);
2518
+ cursor: pointer;
2519
+ }
2520
+ .rastro-integrations__check input:checked {
2521
+ background: var(--rastro-accent);
2522
+ box-shadow: none;
2523
+ }
2524
+ .rastro-integrations__check input:disabled {
2525
+ cursor: default;
2526
+ }
2527
+ .rastro-integrations__check .rastro-integrations__icon {
2528
+ position: absolute;
2529
+ pointer-events: none;
2530
+ color: var(--rastro-accent-fg);
2531
+ opacity: 0;
2532
+ }
2533
+ .rastro-integrations__check input:checked + .rastro-integrations__icon {
2534
+ opacity: 1;
2535
+ }
2536
+ .rastro-integrations__toggle {
2537
+ display: flex;
2538
+ align-items: center;
2539
+ gap: 10px;
2540
+ padding: 12px;
2541
+ border-radius: 10px;
2542
+ box-shadow: inset 0 0 0 1px var(--rastro-border);
2543
+ cursor: pointer;
2544
+ }
2545
+ .rastro-integrations__toggle .rastro-integrations__grow {
2546
+ display: flex;
2547
+ flex-direction: column;
2548
+ }
2549
+ .rastro-integrations__toggle-title {
2550
+ font-weight: 500;
2551
+ font-size: 13.5px;
2552
+ }
2553
+ .rastro-integrations__received ul {
2554
+ list-style: none;
2555
+ padding: 0;
2556
+ }
2557
+ .rastro-integrations__received li {
2558
+ display: grid;
2559
+ grid-template-columns: 16px minmax(0, 1fr) minmax(0, 1fr) 80px 80px;
2560
+ gap: 10px;
2561
+ align-items: center;
2562
+ padding: 7px 4px;
2563
+ font-size: 13px;
2564
+ border-bottom: 1px solid var(--rastro-border);
2565
+ }
2566
+ .rastro-integrations__received li > .rastro-integrations__icon {
2567
+ color: oklch(0.5 0.12 163);
2568
+ }
2569
+ .rastro-integrations__received
2570
+ li[data-status="failed"]
2571
+ > .rastro-integrations__icon {
2572
+ color: var(--rastro-integrations-danger);
2573
+ }
2574
+ .rastro-integrations__received
2575
+ li[data-status="pending"]
2576
+ > .rastro-integrations__icon {
2577
+ color: oklch(0.55 0.1 70);
2578
+ }
2579
+ .rastro-integrations__received li .rastro-integrations__meta {
2580
+ font-size: 13px;
2581
+ }
2582
+ .rastro-integrations__received li > span:nth-child(3) {
2583
+ font-weight: 500;
2584
+ }
2585
+ .rastro-integrations__received li > b {
2586
+ text-align: right;
2587
+ font-weight: 600;
2588
+ }
2589
+ .rastro-integrations__received li > span:last-child {
2590
+ justify-content: flex-end;
2591
+ }
2592
+ .rastro-integrations__sheet-foot {
2593
+ display: flex;
2594
+ align-items: center;
2595
+ gap: 8px;
2596
+ margin: 0 28px;
2597
+ padding: 14px 0 26px;
2598
+ border-top: 1px solid var(--rastro-border);
2599
+ }
2600
+ .rastro-integrations__foot-actions {
2601
+ margin-left: auto;
2602
+ display: flex;
2603
+ gap: 8px;
2604
+ }
2605
+ /* "Usar o mesmo mapa nos outros clientes": a line of its own above the
2606
+ actions. */
2607
+ .rastro-integrations__sheet-foot:has(.rastro-integrations__copy-map) {
2608
+ flex-wrap: wrap;
2609
+ }
2610
+ .rastro-integrations__copy-map {
2611
+ flex-basis: 100%;
2612
+ display: flex;
2613
+ align-items: center;
2614
+ gap: 10px;
2615
+ font-size: 13.5px;
2616
+ cursor: pointer;
2617
+ }
2618
+
2619
+ /* The phone's footer bar ("Ligar Casa Aurora", "Reconectar"), fixed at the
2620
+ foot of the screen as a manual popover (top layer). */
2621
+ .rastro-integrations__phone-foot {
2622
+ position: fixed;
2623
+ inset: auto 0 0 0;
2624
+ width: auto;
2625
+ height: auto;
2626
+ margin: 0;
2627
+ border: 0;
2628
+ overflow: visible;
2629
+ z-index: 40;
2630
+ padding: 12px 14px calc(16px + env(safe-area-inset-bottom, 0px));
2631
+ border-top: 1px solid var(--rastro-border);
2632
+ background: var(--rastro-card);
2633
+ color: var(--rastro-fg);
2634
+ font-family: var(--rastro-font);
2635
+ }
2636
+ .rastro-integrations__phone-foot .rastro-integrations__btn {
2637
+ width: 100%;
2638
+ height: 44px;
2639
+ }
2640
+
2641
+ /* The phone's client cards */
2642
+ .rastro-integrations__cards {
2643
+ list-style: none;
2644
+ padding: 0;
2645
+ display: flex;
2646
+ flex-direction: column;
2647
+ gap: 10px;
2648
+ }
2649
+ .rastro-integrations__phone-card {
2650
+ padding: 10px 12px;
2651
+ display: flex;
2652
+ flex-direction: column;
2653
+ gap: 6px;
2654
+ }
2655
+ .rastro-integrations__phone-card[data-focus] {
2656
+ gap: 8px;
2657
+ box-shadow: 0 0 0 1.5px var(--rastro-accent);
2658
+ }
2659
+ .rastro-integrations__phone-card .rastro-integrations__client-name {
2660
+ flex: 1;
2661
+ }
2662
+ .rastro-integrations__phone-card .rastro-integrations__client-name strong {
2663
+ font-size: 14px;
2664
+ }
2665
+ .rastro-integrations__pills {
2666
+ display: flex;
2667
+ gap: 6px;
2668
+ flex-wrap: wrap;
2669
+ }
2670
+
2671
+ /* Loading */
2672
+ .rastro-integrations__skeleton {
2673
+ height: 260px;
2674
+ }
2675
+ .rastro-integrations__skeleton[data-size="sm"] {
2676
+ height: 76px;
2677
+ }
2678
+
2679
+ /* Narrower desktops: fewer table columns before the phone layout. */
2680
+ @container rastro-integrations (max-width: 1119px) {
2681
+ .rastro-integrations__table [data-col="currency"] {
2682
+ display: none;
2683
+ }
2684
+ }
2685
+ @container rastro-integrations (max-width: 1039px) {
2686
+ .rastro-integrations__table [data-col="pixel"],
2687
+ .rastro-integrations__feed [data-col="ad"] {
2688
+ display: none;
2689
+ }
2690
+ }
2691
+ @container rastro-integrations (max-width: 900px) {
2692
+ .rastro-integrations__start {
2693
+ grid-template-columns: minmax(0, 1fr);
2694
+ }
2695
+ .rastro-integrations__conn {
2696
+ flex-wrap: wrap;
2697
+ }
2698
+ .rastro-integrations__conn-actions {
2699
+ width: 100%;
2700
+ justify-content: flex-start;
2701
+ }
2702
+ .rastro-integrations__steps {
2703
+ grid-template-columns: minmax(0, 1fr);
2704
+ }
2705
+ .rastro-integrations__clients-head {
2706
+ flex-wrap: wrap;
2707
+ }
2708
+ .rastro-integrations__partner {
2709
+ flex-wrap: wrap;
2710
+ }
2711
+ .rastro-integrations__consent {
2712
+ max-width: none;
2713
+ width: 100%;
2714
+ }
2715
+ }
2716
+
2717
+ /* The phone (M1–M3): cards from a tablet down, where the table cannot fit. */
2718
+ @container rastro-integrations (max-width: 899px) {
2719
+ .rastro-integrations {
2720
+ gap: 10px;
2721
+ }
2722
+ .rastro-integrations [data-wide] {
2723
+ display: none;
2724
+ }
2725
+ .rastro-integrations [data-narrow] {
2726
+ display: block;
2727
+ }
2728
+ /* Room under the last card for the fixed footer. */
2729
+ .rastro-integrations[data-foot] .rastro-integrations__cards {
2730
+ margin-bottom: 84px;
2731
+ }
2732
+ .rastro-integrations__connect {
2733
+ padding: 20px;
2734
+ }
2735
+ .rastro-integrations__planb {
2736
+ padding: 16px;
2737
+ }
2738
+ .rastro-integrations__phone-card .rastro-integrations__title {
2739
+ font-size: 14px;
2740
+ }
2741
+ .rastro-integrations__conn-phone .rastro-integrations__title {
2742
+ font-size: 15px;
2743
+ }
2744
+ }
2745
+
2746
+ /* The events sheet goes full screen on a phone (M2). */
2747
+ @container rastro-integrations-sheet (max-width: 639px) {
2748
+ .rastro-integrations__sheet [data-wide] {
2749
+ display: none;
2750
+ }
2751
+ .rastro-integrations__sheet [data-narrow] {
2752
+ display: inline;
2753
+ }
2754
+ .rastro-integrations__sheet p[data-narrow] {
2755
+ display: flex;
2756
+ gap: 4px;
2757
+ align-items: center;
2758
+ font-size: 12px;
2759
+ line-height: 1.4;
2760
+ }
2761
+ .rastro-integrations__sheet-bar {
2762
+ display: flex;
2763
+ align-items: center;
2764
+ gap: 10px;
2765
+ height: 52px;
2766
+ padding: 0 12px;
2767
+ border-bottom: 1px solid var(--rastro-border);
2768
+ font-size: 16px;
2769
+ flex: none;
2770
+ }
2771
+ .rastro-integrations__sheet-bar .rastro-integrations__icon {
2772
+ transform: rotate(180deg);
2773
+ }
2774
+ .rastro-integrations__sheet-bar .rastro-integrations__icon-btn {
2775
+ color: var(--rastro-fg);
2776
+ }
2777
+ .rastro-integrations__sheet-head {
2778
+ display: none;
2779
+ }
2780
+ .rastro-integrations__sheet-body {
2781
+ padding: 12px 14px 12px;
2782
+ gap: 10px;
2783
+ background: var(--rastro-bg);
2784
+ }
2785
+ .rastro-integrations__pixelbar {
2786
+ padding: 7px 12px;
2787
+ font-size: 12.5px;
2788
+ gap: 8px;
2789
+ }
2790
+ .rastro-integrations__map {
2791
+ background: var(--rastro-card);
2792
+ border-radius: var(--rastro-radius);
2793
+ box-shadow: 0 0 0 1px var(--rastro-integrations-ring);
2794
+ padding: 4px 12px;
2795
+ }
2796
+ .rastro-integrations__map > .rastro-integrations__sec {
2797
+ display: none;
2798
+ }
2799
+ .rastro-integrations__maprow {
2800
+ grid-template-columns: minmax(0, 1fr) auto;
2801
+ gap: 5px;
2802
+ padding: 8px 0;
2803
+ }
2804
+ .rastro-integrations__maprow > .rastro-integrations__check,
2805
+ .rastro-integrations__maprow > .rastro-integrations__arrow {
2806
+ display: none;
2807
+ }
2808
+ .rastro-integrations__maprow > .rastro-integrations__select {
2809
+ grid-column: 1 / -1;
2810
+ grid-row: 2;
2811
+ height: 34px;
2812
+ }
2813
+ .rastro-integrations__maprow .rastro-integrations__stage {
2814
+ font-size: 13.5px;
2815
+ }
2816
+ .rastro-integrations__maprow .rastro-integrations__map-note {
2817
+ grid-column: 2;
2818
+ grid-row: 1;
2819
+ }
2820
+ .rastro-integrations__sheet-foot {
2821
+ margin: 0;
2822
+ padding: 12px 14px 26px;
2823
+ }
2824
+ .rastro-integrations__foot-actions {
2825
+ margin-left: 0;
2826
+ width: 100%;
2827
+ }
2828
+ .rastro-integrations__foot-actions .rastro-integrations__btn {
2829
+ height: 44px;
2830
+ }
2831
+ .rastro-integrations__foot-actions .rastro-integrations__btn:last-child {
2832
+ flex: 1;
2833
+ }
2834
+ }
2835
+
2836
+ /* src/ui/portfolio/portfolio.css */
2837
+ /*
2838
+ * PortfolioView (the agency home). Sizes follow the view's own width through
2839
+ * a container query, so it fits a dashboard column or a partner portal alike.
2840
+ */
2841
+
2842
+ .rastro-portfolio {
2843
+ container: rastro-portfolio / inline-size;
2844
+ display: flex;
2845
+ flex-direction: column;
2846
+ gap: 16px;
2847
+ min-width: 0;
2848
+ }
2849
+
2850
+ .rastro-portfolio h3 {
2851
+ margin: 0;
2852
+ font-size: 15px;
2853
+ font-weight: 600;
2854
+ }
2855
+ .rastro-portfolio p {
2856
+ margin: 0;
2857
+ }
2858
+
2859
+ .rastro-portfolio__warning {
2860
+ padding: 10px 14px;
2861
+ border-radius: var(--rastro-radius);
2862
+ background: var(--rastro-ok-bg);
2863
+ color: var(--rastro-ok);
2864
+ font-size: 13px;
2865
+ }
2866
+
2867
+ /* KPIs */
2868
+ /*
2869
+ * Five KPIs never leave one alone on a row: one column on a phone, then two
2870
+ * with Retorno across both, three with Retorno across two, then all five.
2871
+ */
2872
+ .rastro-portfolio__kpis {
2873
+ display: grid;
2874
+ grid-template-columns: minmax(0, 1fr);
2875
+ gap: 12px;
2876
+ }
2877
+ @container rastro-portfolio (min-width: 380px) {
2878
+ .rastro-portfolio__kpis {
2879
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2880
+ }
2881
+ .rastro-portfolio__kpi[data-highlight] {
2882
+ grid-column: span 2;
2883
+ }
2884
+ }
2885
+ @container rastro-portfolio (min-width: 560px) {
2886
+ .rastro-portfolio__kpis {
2887
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2888
+ }
2889
+ }
2890
+ @container rastro-portfolio (min-width: 920px) {
2891
+ .rastro-portfolio__kpis {
2892
+ grid-template-columns: repeat(5, minmax(0, 1fr));
2893
+ }
2894
+ .rastro-portfolio__kpi[data-highlight] {
2895
+ grid-column: auto;
2896
+ }
2897
+ }
2898
+ .rastro-portfolio__kpi {
2899
+ display: flex;
2900
+ flex-direction: column;
2901
+ gap: 4px;
2902
+ min-width: 0;
2903
+ padding: 14px;
2904
+ }
2905
+ .rastro-portfolio__kpi[data-highlight] {
2906
+ background: var(--rastro-accent);
2907
+ border-color: var(--rastro-accent);
2908
+ color: var(--rastro-accent-fg);
2909
+ }
2910
+ .rastro-portfolio__kpi-label,
2911
+ .rastro-portfolio__kpi-sub {
2912
+ font-size: 12px;
2913
+ color: var(--rastro-muted-fg);
2914
+ }
2915
+ .rastro-portfolio__kpi-label {
2916
+ font-size: 13px;
2917
+ }
2918
+ .rastro-portfolio__kpi[data-highlight] .rastro-portfolio__kpi-label,
2919
+ .rastro-portfolio__kpi[data-highlight] .rastro-portfolio__kpi-sub {
2920
+ color: color-mix(in oklab, var(--rastro-accent-fg) 72%, transparent);
2921
+ }
2922
+ /* The Retorno change on the dark card: colors that read on the accent. */
2923
+ .rastro-portfolio__kpi[data-highlight] .rastro-change[data-trend="good"] {
2924
+ color: var(--rastro-on-accent-good);
2925
+ }
2926
+ .rastro-portfolio__kpi[data-highlight] .rastro-change[data-trend="bad"] {
2927
+ color: var(--rastro-on-accent-bad);
2928
+ }
2929
+ .rastro-portfolio__kpi-value {
2930
+ font-size: 24px;
2931
+ font-weight: 600;
2932
+ letter-spacing: -0.01em;
2933
+ }
2934
+ .rastro-portfolio__kpi-sub {
2935
+ display: flex;
2936
+ flex-wrap: wrap;
2937
+ gap: 2px 6px;
2938
+ overflow-wrap: anywhere;
2939
+ }
2940
+ .rastro-portfolio__kpi-skeleton {
2941
+ height: 96px;
2942
+ }
2943
+
2944
+ /* Client cards */
2945
+ /* Cards go 1, 2 or 4 across, so four clients never end as 3 + 1. */
2946
+ .rastro-portfolio__clients {
2947
+ display: grid;
2948
+ grid-template-columns: minmax(0, 1fr);
2949
+ gap: 16px;
2950
+ }
2951
+ @container rastro-portfolio (min-width: 520px) {
2952
+ .rastro-portfolio__clients {
2953
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2954
+ }
2955
+ }
2956
+ @container rastro-portfolio (min-width: 1080px) {
2957
+ .rastro-portfolio__clients {
2958
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2959
+ }
2960
+ }
2961
+ .rastro-portfolio__client-skeleton {
2962
+ height: 340px;
2963
+ }
2964
+ .rastro-portfolio__client {
2965
+ display: flex;
2966
+ flex-direction: column;
2967
+ gap: 12px;
2968
+ min-width: 0;
2969
+ }
2970
+ .rastro-portfolio__client[data-best] {
2971
+ border-color: var(--rastro-strong);
2972
+ box-shadow: 0 0 0 1px var(--rastro-strong);
2973
+ }
2974
+ .rastro-portfolio__client-head {
2975
+ display: flex;
2976
+ align-items: center;
2977
+ gap: 10px;
2978
+ min-width: 0;
2979
+ }
2980
+ .rastro-portfolio__client-name {
2981
+ display: flex;
2982
+ flex-direction: column;
2983
+ min-width: 0;
2984
+ }
2985
+ .rastro-portfolio__client-name strong {
2986
+ font-size: 15px;
2987
+ font-weight: 600;
2988
+ overflow: hidden;
2989
+ text-overflow: ellipsis;
2990
+ white-space: nowrap;
2991
+ }
2992
+ .rastro-portfolio__client-name span {
2993
+ font-size: 12px;
2994
+ overflow: hidden;
2995
+ text-overflow: ellipsis;
2996
+ white-space: nowrap;
2997
+ }
2998
+ .rastro-portfolio__avatar {
2999
+ flex: none;
3000
+ display: grid;
3001
+ place-items: center;
3002
+ width: 34px;
3003
+ height: 34px;
3004
+ border-radius: 999px;
3005
+ font-size: 12px;
3006
+ font-weight: 600;
3007
+ --rastro-portfolio-hue: 20;
3008
+ background: oklch(0.92 0.05 var(--rastro-portfolio-hue));
3009
+ color: oklch(0.42 0.12 var(--rastro-portfolio-hue));
3010
+ }
3011
+ .rastro-portfolio__avatar[data-hue="1"] {
3012
+ --rastro-portfolio-hue: 230;
3013
+ }
3014
+ .rastro-portfolio__avatar[data-hue="2"] {
3015
+ --rastro-portfolio-hue: 80;
3016
+ }
3017
+ .rastro-portfolio__avatar[data-hue="3"] {
3018
+ --rastro-portfolio-hue: 300;
3019
+ }
3020
+ .rastro-portfolio__avatar[data-hue="4"] {
3021
+ --rastro-portfolio-hue: 160;
3022
+ }
3023
+ .rastro-portfolio__avatar[data-hue="5"] {
3024
+ --rastro-portfolio-hue: 0;
3025
+ }
3026
+ .dark .rastro-portfolio__avatar,
3027
+ .rastro-dark .rastro-portfolio__avatar {
3028
+ background: oklch(0.36 0.07 var(--rastro-portfolio-hue));
3029
+ color: oklch(0.88 0.08 var(--rastro-portfolio-hue));
3030
+ }
3031
+
3032
+ .rastro-portfolio__return {
3033
+ display: flex;
3034
+ align-items: flex-end;
3035
+ justify-content: space-between;
3036
+ gap: 8px;
3037
+ padding: 12px;
3038
+ border-radius: calc(var(--rastro-radius) + 2px);
3039
+ background: var(--rastro-muted);
3040
+ }
3041
+ .rastro-portfolio__return-label {
3042
+ display: block;
3043
+ font-size: 12px;
3044
+ color: var(--rastro-muted-fg);
3045
+ }
3046
+ .rastro-portfolio__return-value {
3047
+ font-size: 32px;
3048
+ font-weight: 600;
3049
+ line-height: 1.1;
3050
+ letter-spacing: -0.02em;
3051
+ }
3052
+ .rastro-portfolio__return-value[data-band="strong"] {
3053
+ color: var(--rastro-strong);
3054
+ }
3055
+ .rastro-portfolio__return-value[data-band="ok"] {
3056
+ color: var(--rastro-ok);
3057
+ }
3058
+ .rastro-portfolio__return-value[data-band="weak"] {
3059
+ color: var(--rastro-weak);
3060
+ }
3061
+ .rastro-portfolio__spark-box {
3062
+ display: flex;
3063
+ flex-direction: column;
3064
+ align-items: flex-end;
3065
+ gap: 2px;
3066
+ min-width: 0;
3067
+ font-size: 11px;
3068
+ }
3069
+ .rastro-portfolio__spark {
3070
+ display: block;
3071
+ overflow: visible;
3072
+ max-width: 100%;
3073
+ }
3074
+ .rastro-portfolio__spark-area {
3075
+ fill: color-mix(in oklab, var(--rastro-fg) 8%, transparent);
3076
+ }
3077
+ .rastro-portfolio__spark-line {
3078
+ fill: none;
3079
+ stroke: var(--rastro-fg);
3080
+ stroke-width: 1.6;
3081
+ stroke-linejoin: round;
3082
+ }
3083
+ .rastro-portfolio__spark-dot {
3084
+ fill: var(--rastro-fg);
3085
+ }
3086
+ .rastro-portfolio__spark-base {
3087
+ stroke: var(--rastro-border);
3088
+ }
3089
+ .rastro-portfolio__spark-stem {
3090
+ stroke: var(--rastro-fg);
3091
+ stroke-width: 1.6;
3092
+ }
3093
+
3094
+ .rastro-portfolio__figures {
3095
+ display: grid;
3096
+ grid-template-columns: 1fr 1fr;
3097
+ gap: 8px 12px;
3098
+ margin: 0;
3099
+ }
3100
+ .rastro-portfolio__figures div {
3101
+ min-width: 0;
3102
+ }
3103
+ .rastro-portfolio__figures dt {
3104
+ font-size: 12px;
3105
+ color: var(--rastro-muted-fg);
3106
+ }
3107
+ .rastro-portfolio__figures dd {
3108
+ margin: 1px 0 0;
3109
+ font-size: 15px;
3110
+ font-weight: 600;
3111
+ }
3112
+
3113
+ .rastro-portfolio__insight {
3114
+ padding: 6px 10px;
3115
+ border-radius: calc(var(--rastro-radius) - 2px);
3116
+ font-size: 12.5px;
3117
+ font-weight: 500;
3118
+ background: var(--rastro-muted);
3119
+ color: var(--rastro-muted-fg);
3120
+ }
3121
+ .rastro-portfolio__insight[data-tone="good"] {
3122
+ background: var(--rastro-strong-bg);
3123
+ color: var(--rastro-strong);
3124
+ }
3125
+ .rastro-portfolio__insight[data-tone="watch"] {
3126
+ background: var(--rastro-ok-bg);
3127
+ color: var(--rastro-ok);
3128
+ }
3129
+ .rastro-portfolio__insight[data-tone="bad"] {
3130
+ background: var(--rastro-weak-bg);
3131
+ color: var(--rastro-weak);
3132
+ }
3133
+
3134
+ .rastro-portfolio__open {
3135
+ display: inline-flex;
3136
+ align-items: center;
3137
+ gap: 6px;
3138
+ align-self: flex-start;
3139
+ padding: 0;
3140
+ border: 0;
3141
+ background: none;
3142
+ font: inherit;
3143
+ font-size: 13px;
3144
+ font-weight: 600;
3145
+ color: var(--rastro-fg);
3146
+ text-align: left;
3147
+ cursor: pointer;
3148
+ }
3149
+ .rastro-portfolio__open span {
3150
+ transition: transform 0.15s;
3151
+ }
3152
+ .rastro-portfolio__open:hover span {
3153
+ transform: translateX(3px);
3154
+ }
3155
+ .rastro-portfolio__open:focus-visible,
3156
+ .rastro-portfolio__toggle button:focus-visible {
3157
+ outline: 2px solid var(--rastro-fg);
3158
+ outline-offset: 2px;
3159
+ border-radius: 4px;
3160
+ }
3161
+ .rastro-portfolio__client .rastro-portfolio__open {
3162
+ align-self: stretch;
3163
+ margin-top: auto;
3164
+ padding-top: 12px;
3165
+ border-top: 1px solid var(--rastro-border);
3166
+ }
3167
+
3168
+ /* Chart and attention */
3169
+ .rastro-portfolio__bottom {
3170
+ display: grid;
3171
+ grid-template-columns: minmax(0, 1fr);
3172
+ gap: 16px;
3173
+ }
3174
+ @container rastro-portfolio (min-width: 960px) {
3175
+ .rastro-portfolio__bottom {
3176
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
3177
+ }
3178
+ }
3179
+ .rastro-portfolio__section-head {
3180
+ display: flex;
3181
+ flex-wrap: wrap;
3182
+ justify-content: space-between;
3183
+ align-items: flex-start;
3184
+ gap: 8px 12px;
3185
+ margin-bottom: 12px;
3186
+ }
3187
+ .rastro-portfolio__section-head > div {
3188
+ min-width: 0;
3189
+ flex: 1 1 220px;
3190
+ }
3191
+ .rastro-portfolio__section-head p {
3192
+ margin-top: 2px;
3193
+ font-size: 13px;
3194
+ }
3195
+ .rastro-portfolio__toggle {
3196
+ display: inline-flex;
3197
+ flex-wrap: wrap;
3198
+ gap: 2px;
3199
+ padding: 3px;
3200
+ border-radius: calc(var(--rastro-radius) - 1px);
3201
+ background: var(--rastro-muted);
3202
+ }
3203
+ .rastro-portfolio__toggle button {
3204
+ padding: 4px 10px;
3205
+ border: 0;
3206
+ border-radius: calc(var(--rastro-radius) - 3px);
3207
+ background: none;
3208
+ font: inherit;
3209
+ font-size: 13px;
3210
+ color: var(--rastro-muted-fg);
3211
+ white-space: nowrap;
3212
+ cursor: pointer;
3213
+ }
3214
+ .rastro-portfolio__toggle button[aria-pressed="true"] {
3215
+ background: var(--rastro-card);
3216
+ color: var(--rastro-fg);
3217
+ box-shadow: 0 1px 2px rgb(0 0 0 / 8%);
3218
+ }
3219
+
3220
+ .rastro-portfolio__chart {
3221
+ width: 100%;
3222
+ min-width: 0;
3223
+ overflow: hidden;
3224
+ }
3225
+ .rastro-portfolio__chart svg {
3226
+ display: block;
3227
+ width: 100%;
3228
+ height: auto;
3229
+ }
3230
+ .rastro-portfolio__zone[data-band="strong"] {
3231
+ fill: var(--rastro-strong-bg);
3232
+ opacity: 0.45;
3233
+ }
3234
+ .rastro-portfolio__zone[data-band="weak"] {
3235
+ fill: var(--rastro-weak-bg);
3236
+ opacity: 0.55;
3237
+ }
3238
+ .rastro-portfolio__zone-label {
3239
+ font-size: 11px;
3240
+ font-weight: 500;
3241
+ }
3242
+ .rastro-portfolio__zone-label[data-band="strong"] {
3243
+ fill: var(--rastro-strong);
3244
+ }
3245
+ .rastro-portfolio__zone-label[data-band="weak"] {
3246
+ fill: var(--rastro-weak);
3247
+ }
3248
+ .rastro-portfolio__grid {
3249
+ stroke: var(--rastro-border);
3250
+ }
3251
+ .rastro-portfolio__axis {
3252
+ font-size: 11px;
3253
+ fill: var(--rastro-muted-fg);
3254
+ }
3255
+ .rastro-portfolio__average {
3256
+ stroke: var(--rastro-fg);
3257
+ stroke-width: 1.2;
3258
+ stroke-dasharray: 4 4;
3259
+ }
3260
+ .rastro-portfolio__average-label {
3261
+ font-size: 11px;
3262
+ font-weight: 600;
3263
+ fill: var(--rastro-fg);
3264
+ }
3265
+ .rastro-portfolio__bubble {
3266
+ fill: color-mix(in oklab, var(--rastro-fg) 45%, transparent);
3267
+ stroke: var(--rastro-card);
3268
+ stroke-width: 2;
3269
+ }
3270
+ .rastro-portfolio__bubble[data-band="strong"] {
3271
+ fill: color-mix(in oklab, var(--rastro-strong) 70%, transparent);
3272
+ }
3273
+ .rastro-portfolio__bubble[data-band="ok"] {
3274
+ fill: color-mix(in oklab, var(--rastro-ok) 65%, transparent);
3275
+ }
3276
+ .rastro-portfolio__bubble[data-band="weak"] {
3277
+ fill: color-mix(in oklab, var(--rastro-weak) 65%, transparent);
3278
+ }
3279
+ .rastro-portfolio__label {
3280
+ font-size: 12.5px;
3281
+ }
3282
+ .rastro-portfolio__label-name {
3283
+ font-weight: 600;
3284
+ fill: var(--rastro-fg);
3285
+ }
3286
+ .rastro-portfolio__label-value {
3287
+ fill: var(--rastro-muted-fg);
3288
+ font-variant-numeric: tabular-nums;
3289
+ }
3290
+
3291
+ .rastro-portfolio__rank {
3292
+ display: flex;
3293
+ flex-wrap: wrap;
3294
+ align-items: center;
3295
+ gap: 6px 16px;
3296
+ margin-top: 8px;
3297
+ padding-top: 12px;
3298
+ border-top: 1px solid var(--rastro-border);
3299
+ font-size: 12.5px;
3300
+ color: var(--rastro-muted-fg);
3301
+ }
3302
+ .rastro-portfolio__rank ol {
3303
+ display: flex;
3304
+ flex-wrap: wrap;
3305
+ gap: 6px 16px;
3306
+ min-width: 0;
3307
+ max-width: 100%;
3308
+ margin: 0;
3309
+ padding: 0;
3310
+ list-style: none;
3311
+ }
3312
+ /* A long client name ellipsizes instead of pushing the list out. */
3313
+ .rastro-portfolio__rank li {
3314
+ display: flex;
3315
+ align-items: center;
3316
+ gap: 6px;
3317
+ min-width: 0;
3318
+ max-width: 100%;
3319
+ }
3320
+ .rastro-portfolio__rank-title {
3321
+ font-weight: 500;
3322
+ }
3323
+ .rastro-portfolio__rank-pos {
3324
+ display: grid;
3325
+ place-items: center;
3326
+ flex: none;
3327
+ width: 18px;
3328
+ height: 18px;
3329
+ border-radius: 999px;
3330
+ background: var(--rastro-muted);
3331
+ font-size: 11px;
3332
+ font-weight: 600;
3333
+ color: var(--rastro-fg);
3334
+ }
3335
+ .rastro-portfolio__rank-name {
3336
+ overflow: hidden;
3337
+ text-overflow: ellipsis;
3338
+ white-space: nowrap;
3339
+ }
3340
+ .rastro-portfolio__rank strong {
3341
+ color: var(--rastro-fg);
3342
+ }
3343
+ .rastro-portfolio__note {
3344
+ margin-top: 8px;
3345
+ font-size: 12px;
3346
+ }
3347
+
3348
+ .rastro-portfolio__count {
3349
+ display: grid;
3350
+ place-items: center;
3351
+ min-width: 24px;
3352
+ height: 24px;
3353
+ padding: 0 6px;
3354
+ border-radius: 999px;
3355
+ background: var(--rastro-muted);
3356
+ font-size: 12px;
3357
+ font-weight: 600;
3358
+ }
3359
+ .rastro-portfolio__alerts {
3360
+ display: flex;
3361
+ flex-direction: column;
3362
+ gap: 10px;
3363
+ margin: 0;
3364
+ padding: 0;
3365
+ list-style: none;
3366
+ }
3367
+ .rastro-portfolio__alert {
3368
+ position: relative;
3369
+ display: flex;
3370
+ flex-direction: column;
3371
+ gap: 4px;
3372
+ padding: 12px 12px 12px 22px;
3373
+ border: 1px solid var(--rastro-border);
3374
+ border-radius: var(--rastro-radius);
3375
+ font-size: 13.5px;
3376
+ line-height: 1.4;
3377
+ overflow-wrap: anywhere;
3378
+ }
3379
+ /* The tone as a colored bar on the alert's left edge. */
3380
+ .rastro-portfolio__alert::before {
3381
+ content: "";
3382
+ position: absolute;
3383
+ inset: 12px auto 12px 10px;
3384
+ width: 4px;
3385
+ border-radius: 999px;
3386
+ background: var(--rastro-muted-fg);
3387
+ }
3388
+ .rastro-portfolio__alert[data-tone="good"]::before {
3389
+ background: var(--rastro-strong);
3390
+ }
3391
+ .rastro-portfolio__alert[data-tone="watch"]::before {
3392
+ background: var(--rastro-ok);
3393
+ }
3394
+ .rastro-portfolio__alert[data-tone="bad"]::before {
3395
+ background: var(--rastro-weak);
3396
+ }
3397
+ .rastro-portfolio__alert .rastro-muted {
3398
+ font-size: 12.5px;
3399
+ }
3400
+ .rastro-portfolio__alert .rastro-portfolio__open {
3401
+ margin-top: 4px;
3402
+ font-size: 12.5px;
3403
+ }
3404
+
3405
+ .rastro-portfolio__more {
3406
+ margin-top: 10px;
3407
+ padding: 2px 10px;
3408
+ border: 1px solid var(--rastro-border);
3409
+ border-radius: 999px;
3410
+ background: none;
3411
+ font: inherit;
3412
+ font-size: 12.5px;
3413
+ font-weight: 600;
3414
+ color: var(--rastro-fg);
3415
+ cursor: pointer;
3416
+ }
3417
+ .rastro-portfolio__more:focus-visible {
3418
+ outline: 2px solid var(--rastro-fg);
3419
+ outline-offset: 2px;
3420
+ }
3421
+ .rastro-portfolio__partial {
3422
+ margin-top: -6px;
3423
+ font-size: 12.5px;
3424
+ }