@iann29/rastro 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +9 -1
  2. package/agent/integration.md +23 -1
  3. package/agent/manifest.json +4 -4
  4. package/dist/client/federation.d.ts +114 -9
  5. package/dist/client/federation.d.ts.map +1 -1
  6. package/dist/client/federation.js +54 -2
  7. package/dist/client/federation.js.map +1 -1
  8. package/dist/client/index.d.ts +637 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +385 -9
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +14 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +277 -1
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/_generated/server.d.ts +4 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -1
  19. package/dist/component/_generated/server.js.map +1 -1
  20. package/dist/component/constants.d.ts +5 -0
  21. package/dist/component/constants.d.ts.map +1 -1
  22. package/dist/component/constants.js +10 -0
  23. package/dist/component/constants.js.map +1 -1
  24. package/dist/component/convex.config.d.ts +4 -0
  25. package/dist/component/convex.config.js +9 -0
  26. package/dist/component/convex.config.js.map +1 -1
  27. package/dist/component/errors.d.ts +1 -1
  28. package/dist/component/errors.d.ts.map +1 -1
  29. package/dist/component/errors.js.map +1 -1
  30. package/dist/component/leads.d.ts +69 -3
  31. package/dist/component/leads.d.ts.map +1 -1
  32. package/dist/component/leads.js +419 -16
  33. package/dist/component/leads.js.map +1 -1
  34. package/dist/component/meta.d.ts +352 -0
  35. package/dist/component/meta.d.ts.map +1 -0
  36. package/dist/component/meta.js +1239 -0
  37. package/dist/component/meta.js.map +1 -0
  38. package/dist/component/metaCapi.d.ts +162 -0
  39. package/dist/component/metaCapi.d.ts.map +1 -0
  40. package/dist/component/metaCapi.js +754 -0
  41. package/dist/component/metaCapi.js.map +1 -0
  42. package/dist/component/metaFake.d.ts +5 -0
  43. package/dist/component/metaFake.d.ts.map +1 -0
  44. package/dist/component/metaFake.js +225 -0
  45. package/dist/component/metaFake.js.map +1 -0
  46. package/dist/component/metaGraph.d.ts +165 -0
  47. package/dist/component/metaGraph.d.ts.map +1 -0
  48. package/dist/component/metaGraph.js +507 -0
  49. package/dist/component/metaGraph.js.map +1 -0
  50. package/dist/component/metaSync.d.ts +186 -0
  51. package/dist/component/metaSync.d.ts.map +1 -0
  52. package/dist/component/metaSync.js +961 -0
  53. package/dist/component/metaSync.js.map +1 -0
  54. package/dist/component/pipeline.d.ts +98 -0
  55. package/dist/component/pipeline.d.ts.map +1 -0
  56. package/dist/component/pipeline.js +324 -0
  57. package/dist/component/pipeline.js.map +1 -0
  58. package/dist/component/schema.d.ts +404 -2
  59. package/dist/component/schema.d.ts.map +1 -1
  60. package/dist/component/schema.js +168 -2
  61. package/dist/component/schema.js.map +1 -1
  62. package/dist/component/secrets.d.ts +15 -0
  63. package/dist/component/secrets.d.ts.map +1 -0
  64. package/dist/component/secrets.js +67 -0
  65. package/dist/component/secrets.js.map +1 -0
  66. package/dist/component/validators.d.ts +1052 -15
  67. package/dist/component/validators.d.ts.map +1 -1
  68. package/dist/component/validators.js +307 -3
  69. package/dist/component/validators.js.map +1 -1
  70. package/dist/tracker/generated.d.ts +1 -1
  71. package/dist/tracker/generated.d.ts.map +1 -1
  72. package/dist/tracker/generated.js +1 -1
  73. package/dist/tracker/generated.js.map +1 -1
  74. package/dist/ui/campaigns/CampaignsView.d.ts +48 -0
  75. package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -0
  76. package/dist/ui/campaigns/CampaignsView.js +47 -0
  77. package/dist/ui/campaigns/CampaignsView.js.map +1 -0
  78. package/dist/ui/campaigns/Conversions.d.ts +16 -0
  79. package/dist/ui/campaigns/Conversions.d.ts.map +1 -0
  80. package/dist/ui/campaigns/Conversions.js +40 -0
  81. package/dist/ui/campaigns/Conversions.js.map +1 -0
  82. package/dist/ui/campaigns/Drawer.d.ts +24 -0
  83. package/dist/ui/campaigns/Drawer.d.ts.map +1 -0
  84. package/dist/ui/campaigns/Drawer.js +120 -0
  85. package/dist/ui/campaigns/Drawer.js.map +1 -0
  86. package/dist/ui/campaigns/Icons.d.ts +35 -0
  87. package/dist/ui/campaigns/Icons.d.ts.map +1 -0
  88. package/dist/ui/campaigns/Icons.js +41 -0
  89. package/dist/ui/campaigns/Icons.js.map +1 -0
  90. package/dist/ui/campaigns/Summary.d.ts +21 -0
  91. package/dist/ui/campaigns/Summary.d.ts.map +1 -0
  92. package/dist/ui/campaigns/Summary.js +56 -0
  93. package/dist/ui/campaigns/Summary.js.map +1 -0
  94. package/dist/ui/campaigns/Thumbnail.d.ts +11 -0
  95. package/dist/ui/campaigns/Thumbnail.d.ts.map +1 -0
  96. package/dist/ui/campaigns/Thumbnail.js +23 -0
  97. package/dist/ui/campaigns/Thumbnail.js.map +1 -0
  98. package/dist/ui/campaigns/Tree.d.ts +12 -0
  99. package/dist/ui/campaigns/Tree.d.ts.map +1 -0
  100. package/dist/ui/campaigns/Tree.js +105 -0
  101. package/dist/ui/campaigns/Tree.js.map +1 -0
  102. package/dist/ui/campaigns/glyphs.d.ts +20 -0
  103. package/dist/ui/campaigns/glyphs.d.ts.map +1 -0
  104. package/dist/ui/campaigns/glyphs.js +19 -0
  105. package/dist/ui/campaigns/glyphs.js.map +1 -0
  106. package/dist/ui/campaigns/index.d.ts +4 -0
  107. package/dist/ui/campaigns/index.d.ts.map +1 -0
  108. package/dist/ui/campaigns/index.js +3 -0
  109. package/dist/ui/campaigns/index.js.map +1 -0
  110. package/dist/ui/campaigns/labels.d.ts +53 -0
  111. package/dist/ui/campaigns/labels.d.ts.map +1 -0
  112. package/dist/ui/campaigns/labels.js +169 -0
  113. package/dist/ui/campaigns/labels.js.map +1 -0
  114. package/dist/ui/campaigns/model.d.ts +99 -0
  115. package/dist/ui/campaigns/model.d.ts.map +1 -0
  116. package/dist/ui/campaigns/model.js +230 -0
  117. package/dist/ui/campaigns/model.js.map +1 -0
  118. package/dist/ui/campaigns/modes.d.ts +18 -0
  119. package/dist/ui/campaigns/modes.d.ts.map +1 -0
  120. package/dist/ui/campaigns/modes.js +7 -0
  121. package/dist/ui/campaigns/modes.js.map +1 -0
  122. package/dist/ui/index.d.ts +21 -0
  123. package/dist/ui/index.d.ts.map +1 -0
  124. package/dist/ui/index.js +19 -0
  125. package/dist/ui/index.js.map +1 -0
  126. package/dist/ui/integrations/AccountPicker.d.ts +26 -0
  127. package/dist/ui/integrations/AccountPicker.d.ts.map +1 -0
  128. package/dist/ui/integrations/AccountPicker.js +97 -0
  129. package/dist/ui/integrations/AccountPicker.js.map +1 -0
  130. package/dist/ui/integrations/ClientCards.d.ts +17 -0
  131. package/dist/ui/integrations/ClientCards.d.ts.map +1 -0
  132. package/dist/ui/integrations/ClientCards.js +38 -0
  133. package/dist/ui/integrations/ClientCards.js.map +1 -0
  134. package/dist/ui/integrations/ClientsTable.d.ts +36 -0
  135. package/dist/ui/integrations/ClientsTable.d.ts.map +1 -0
  136. package/dist/ui/integrations/ClientsTable.js +127 -0
  137. package/dist/ui/integrations/ClientsTable.js.map +1 -0
  138. package/dist/ui/integrations/Connect.d.ts +29 -0
  139. package/dist/ui/integrations/Connect.d.ts.map +1 -0
  140. package/dist/ui/integrations/Connect.js +49 -0
  141. package/dist/ui/integrations/Connect.js.map +1 -0
  142. package/dist/ui/integrations/Connection.d.ts +37 -0
  143. package/dist/ui/integrations/Connection.d.ts.map +1 -0
  144. package/dist/ui/integrations/Connection.js +94 -0
  145. package/dist/ui/integrations/Connection.js.map +1 -0
  146. package/dist/ui/integrations/Dialogs.d.ts +18 -0
  147. package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
  148. package/dist/ui/integrations/Dialogs.js +25 -0
  149. package/dist/ui/integrations/Dialogs.js.map +1 -0
  150. package/dist/ui/integrations/EventsFeed.d.ts +15 -0
  151. package/dist/ui/integrations/EventsFeed.d.ts.map +1 -0
  152. package/dist/ui/integrations/EventsFeed.js +57 -0
  153. package/dist/ui/integrations/EventsFeed.js.map +1 -0
  154. package/dist/ui/integrations/EventsSheet.d.ts +28 -0
  155. package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
  156. package/dist/ui/integrations/EventsSheet.js +121 -0
  157. package/dist/ui/integrations/EventsSheet.js.map +1 -0
  158. package/dist/ui/integrations/Icons.d.ts +36 -0
  159. package/dist/ui/integrations/Icons.d.ts.map +1 -0
  160. package/dist/ui/integrations/Icons.js +38 -0
  161. package/dist/ui/integrations/Icons.js.map +1 -0
  162. package/dist/ui/integrations/IntegrationsView.d.ts +14 -0
  163. package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
  164. package/dist/ui/integrations/IntegrationsView.js +113 -0
  165. package/dist/ui/integrations/IntegrationsView.js.map +1 -0
  166. package/dist/ui/integrations/Overlay.d.ts +18 -0
  167. package/dist/ui/integrations/Overlay.d.ts.map +1 -0
  168. package/dist/ui/integrations/Overlay.js +36 -0
  169. package/dist/ui/integrations/Overlay.js.map +1 -0
  170. package/dist/ui/integrations/RowMenu.d.ts +15 -0
  171. package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
  172. package/dist/ui/integrations/RowMenu.js +47 -0
  173. package/dist/ui/integrations/RowMenu.js.map +1 -0
  174. package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
  175. package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
  176. package/dist/ui/integrations/UnlinkDialog.js +29 -0
  177. package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
  178. package/dist/ui/integrations/format.d.ts +28 -0
  179. package/dist/ui/integrations/format.d.ts.map +1 -0
  180. package/dist/ui/integrations/format.js +101 -0
  181. package/dist/ui/integrations/format.js.map +1 -0
  182. package/dist/ui/integrations/index.d.ts +5 -0
  183. package/dist/ui/integrations/index.d.ts.map +1 -0
  184. package/dist/ui/integrations/index.js +3 -0
  185. package/dist/ui/integrations/index.js.map +1 -0
  186. package/dist/ui/integrations/model.d.ts +84 -0
  187. package/dist/ui/integrations/model.d.ts.map +1 -0
  188. package/dist/ui/integrations/model.js +131 -0
  189. package/dist/ui/integrations/model.js.map +1 -0
  190. package/dist/ui/integrations/overlay.d.ts +10 -0
  191. package/dist/ui/integrations/overlay.d.ts.map +1 -0
  192. package/dist/ui/integrations/overlay.js +77 -0
  193. package/dist/ui/integrations/overlay.js.map +1 -0
  194. package/dist/ui/integrations/parts.d.ts +36 -0
  195. package/dist/ui/integrations/parts.d.ts.map +1 -0
  196. package/dist/ui/integrations/parts.js +85 -0
  197. package/dist/ui/integrations/parts.js.map +1 -0
  198. package/dist/ui/integrations/types.d.ts +96 -0
  199. package/dist/ui/integrations/types.d.ts.map +1 -0
  200. package/dist/ui/integrations/types.js +2 -0
  201. package/dist/ui/integrations/types.js.map +1 -0
  202. package/dist/ui/metrics.d.ts +106 -0
  203. package/dist/ui/metrics.d.ts.map +1 -0
  204. package/dist/ui/metrics.js +166 -0
  205. package/dist/ui/metrics.js.map +1 -0
  206. package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
  207. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
  208. package/dist/ui/portfolio/PortfolioView.js +216 -0
  209. package/dist/ui/portfolio/PortfolioView.js.map +1 -0
  210. package/dist/ui/portfolio/SpendChart.d.ts +10 -0
  211. package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
  212. package/dist/ui/portfolio/SpendChart.js +196 -0
  213. package/dist/ui/portfolio/SpendChart.js.map +1 -0
  214. package/dist/ui/portfolio/alerts.d.ts +74 -0
  215. package/dist/ui/portfolio/alerts.d.ts.map +1 -0
  216. package/dist/ui/portfolio/alerts.js +291 -0
  217. package/dist/ui/portfolio/alerts.js.map +1 -0
  218. package/dist/ui/portfolio/figures.d.ts +79 -0
  219. package/dist/ui/portfolio/figures.d.ts.map +1 -0
  220. package/dist/ui/portfolio/figures.js +103 -0
  221. package/dist/ui/portfolio/figures.js.map +1 -0
  222. package/dist/ui/portfolio/format.d.ts +8 -0
  223. package/dist/ui/portfolio/format.d.ts.map +1 -0
  224. package/dist/ui/portfolio/format.js +28 -0
  225. package/dist/ui/portfolio/format.js.map +1 -0
  226. package/dist/ui/sample.d.ts +474 -0
  227. package/dist/ui/sample.d.ts.map +1 -0
  228. package/dist/ui/sample.js +553 -0
  229. package/dist/ui/sample.js.map +1 -0
  230. package/dist/ui/seed.d.ts +188 -0
  231. package/dist/ui/seed.d.ts.map +1 -0
  232. package/dist/ui/seed.js +563 -0
  233. package/dist/ui/seed.js.map +1 -0
  234. package/dist/ui/ui.css +3356 -0
  235. package/docs/federation.md +46 -1
  236. package/docs/meta-ads.md +746 -0
  237. package/docs/upgrading.md +95 -0
  238. package/llms.txt +3 -0
  239. package/package.json +15 -3
  240. package/src/component/_generated/api.ts +14 -0
  241. package/src/component/_generated/component.ts +323 -1
  242. package/src/component/_generated/server.ts +4 -0
  243. package/src/component/constants.ts +10 -0
  244. package/src/component/convex.config.ts +9 -0
  245. package/src/component/errors.ts +5 -1
  246. package/src/component/leads.ts +517 -17
  247. package/src/component/meta.ts +1461 -0
  248. package/src/component/metaCapi.ts +921 -0
  249. package/src/component/metaFake.ts +277 -0
  250. package/src/component/metaGraph.ts +722 -0
  251. package/src/component/metaSync.ts +1164 -0
  252. package/src/component/pipeline.ts +392 -0
  253. package/src/component/schema.ts +197 -1
  254. package/src/component/secrets.ts +98 -0
  255. package/src/component/validators.ts +376 -3
  256. package/src/tracker/generated.ts +1 -1
  257. package/src/ui/seed.ts +755 -0
package/dist/ui/ui.css ADDED
@@ -0,0 +1,3356 @@
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
+ /* B1: the two ways in */
1909
+ .rastro-integrations__start {
1910
+ display: grid;
1911
+ grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
1912
+ gap: 16px;
1913
+ }
1914
+ .rastro-integrations__connect {
1915
+ padding: 28px;
1916
+ display: flex;
1917
+ flex-direction: column;
1918
+ gap: 16px;
1919
+ }
1920
+ .rastro-integrations__connect .rastro-integrations__desc {
1921
+ max-width: 520px;
1922
+ }
1923
+ .rastro-integrations__perks {
1924
+ list-style: none;
1925
+ padding: 0;
1926
+ display: flex;
1927
+ flex-direction: column;
1928
+ gap: 8px;
1929
+ font-size: 13.5px;
1930
+ }
1931
+ .rastro-integrations__perks li {
1932
+ display: flex;
1933
+ gap: 8px;
1934
+ align-items: center;
1935
+ }
1936
+ .rastro-integrations__connect-action {
1937
+ display: flex;
1938
+ gap: 12px;
1939
+ align-items: center;
1940
+ flex-wrap: wrap;
1941
+ margin-top: 4px;
1942
+ }
1943
+ .rastro-integrations__planb {
1944
+ padding: 22px;
1945
+ display: flex;
1946
+ flex-direction: column;
1947
+ gap: 12px;
1948
+ }
1949
+ .rastro-integrations__planb-form {
1950
+ display: flex;
1951
+ flex-direction: column;
1952
+ gap: 12px;
1953
+ }
1954
+ .rastro-integrations__form-foot {
1955
+ display: flex;
1956
+ justify-content: flex-end;
1957
+ }
1958
+
1959
+ /* B3/B4: the connection */
1960
+ .rastro-integrations__conn {
1961
+ display: flex;
1962
+ align-items: center;
1963
+ gap: 16px;
1964
+ padding: 16px 18px;
1965
+ }
1966
+ .rastro-integrations__conn-body {
1967
+ flex: 1;
1968
+ min-width: 0;
1969
+ }
1970
+ .rastro-integrations__conn-line {
1971
+ display: flex;
1972
+ flex-wrap: wrap;
1973
+ gap: 2px 14px;
1974
+ align-items: center;
1975
+ color: var(--rastro-muted-fg);
1976
+ font-size: 13px;
1977
+ margin-top: 2px;
1978
+ }
1979
+ .rastro-integrations__conn-actions {
1980
+ display: flex;
1981
+ align-items: center;
1982
+ gap: 8px;
1983
+ flex-wrap: wrap;
1984
+ justify-content: flex-end;
1985
+ }
1986
+ .rastro-integrations__conn-phone {
1987
+ display: flex;
1988
+ align-items: center;
1989
+ gap: 10px;
1990
+ padding: 12px 14px;
1991
+ }
1992
+ .rastro-integrations__conn-phone .rastro-integrations__grow {
1993
+ display: flex;
1994
+ flex-direction: column;
1995
+ }
1996
+
1997
+ /* The clients' table */
1998
+ .rastro-integrations__clients {
1999
+ padding: 8px 8px 4px;
2000
+ }
2001
+ .rastro-integrations__clients-head,
2002
+ .rastro-integrations__section-head {
2003
+ display: flex;
2004
+ justify-content: space-between;
2005
+ align-items: flex-start;
2006
+ gap: 12px;
2007
+ }
2008
+ .rastro-integrations__clients-head {
2009
+ padding: 10px 10px 0;
2010
+ margin-bottom: 4px;
2011
+ }
2012
+ .rastro-integrations__section-head {
2013
+ margin-bottom: 12px;
2014
+ }
2015
+ .rastro-integrations__seg {
2016
+ display: inline-flex;
2017
+ background: var(--rastro-muted);
2018
+ border-radius: 9px;
2019
+ padding: 3px;
2020
+ gap: 2px;
2021
+ font-size: 13px;
2022
+ flex: none;
2023
+ }
2024
+ .rastro-integrations__seg button {
2025
+ border: 0;
2026
+ background: none;
2027
+ padding: 4px 10px;
2028
+ border-radius: 7px;
2029
+ color: var(--rastro-muted-fg);
2030
+ white-space: nowrap;
2031
+ cursor: pointer;
2032
+ font-size: 13px;
2033
+ }
2034
+ .rastro-integrations__seg button[aria-pressed="true"] {
2035
+ background: var(--rastro-card);
2036
+ color: var(--rastro-fg);
2037
+ box-shadow: 0 1px 2px rgb(0 0 0 / 8%);
2038
+ }
2039
+ .rastro-integrations__table {
2040
+ width: 100%;
2041
+ border-collapse: collapse;
2042
+ font-size: 13px;
2043
+ }
2044
+ .rastro-integrations__table th {
2045
+ text-align: left;
2046
+ font-weight: 500;
2047
+ color: var(--rastro-muted-fg);
2048
+ font-size: 12px;
2049
+ padding: 8px 10px;
2050
+ border-bottom: 1px solid var(--rastro-border);
2051
+ white-space: nowrap;
2052
+ }
2053
+ .rastro-integrations__table td {
2054
+ padding: 12px 10px;
2055
+ border-bottom: 1px solid var(--rastro-border);
2056
+ vertical-align: middle;
2057
+ }
2058
+ .rastro-integrations__table tbody tr:last-child td {
2059
+ border-bottom: 0;
2060
+ }
2061
+ .rastro-integrations__table tr[data-selected] td {
2062
+ background: var(--rastro-muted);
2063
+ }
2064
+ .rastro-integrations__table [data-col="menu"] {
2065
+ width: 38px;
2066
+ padding-left: 4px;
2067
+ padding-right: 4px;
2068
+ text-align: right;
2069
+ }
2070
+ .rastro-integrations__clients[data-offline] .rastro-integrations__table {
2071
+ opacity: 0.55;
2072
+ }
2073
+ .rastro-integrations__cell-top {
2074
+ font-weight: 500;
2075
+ white-space: nowrap;
2076
+ }
2077
+ .rastro-integrations__table td > .rastro-integrations__meta {
2078
+ display: block;
2079
+ max-width: 180px;
2080
+ overflow: hidden;
2081
+ text-overflow: ellipsis;
2082
+ white-space: nowrap;
2083
+ }
2084
+ .rastro-integrations__table
2085
+ td
2086
+ > .rastro-integrations__meta.rastro-integrations__mono {
2087
+ color: var(--rastro-muted-fg);
2088
+ }
2089
+ .rastro-integrations__table[data-mode="linked"]
2090
+ td:nth-child(3)
2091
+ .rastro-integrations__cell-top {
2092
+ font-weight: 400;
2093
+ }
2094
+ .rastro-integrations__table[data-mode="linked"]
2095
+ td:nth-child(4)
2096
+ .rastro-integrations__cell-top {
2097
+ font-weight: 400;
2098
+ }
2099
+ .rastro-integrations__table[data-mode="stopped"]
2100
+ td:nth-child(4)
2101
+ .rastro-integrations__cell-top {
2102
+ font-weight: 400;
2103
+ }
2104
+ .rastro-integrations__grant {
2105
+ display: block;
2106
+ margin-top: 4px;
2107
+ }
2108
+ .rastro-integrations__pills .rastro-integrations__grant {
2109
+ margin-top: 0;
2110
+ align-self: center;
2111
+ }
2112
+ .rastro-integrations__owner {
2113
+ margin-top: 2px;
2114
+ }
2115
+ .rastro-integrations__client {
2116
+ display: flex;
2117
+ align-items: center;
2118
+ gap: 10px;
2119
+ min-width: 0;
2120
+ }
2121
+ .rastro-integrations__client[data-size="sm"] {
2122
+ gap: 8px;
2123
+ }
2124
+ .rastro-integrations__client-name {
2125
+ display: flex;
2126
+ flex-direction: column;
2127
+ min-width: 0;
2128
+ }
2129
+ /* Long names end in an ellipsis instead of widening the table. */
2130
+ .rastro-integrations__table .rastro-integrations__client-name {
2131
+ max-width: 160px;
2132
+ }
2133
+ .rastro-integrations__table .rastro-integrations__cell-top {
2134
+ max-width: 180px;
2135
+ overflow: hidden;
2136
+ text-overflow: ellipsis;
2137
+ }
2138
+ .rastro-integrations__feed .rastro-integrations__client {
2139
+ max-width: 200px;
2140
+ overflow: hidden;
2141
+ text-overflow: ellipsis;
2142
+ white-space: nowrap;
2143
+ }
2144
+ .rastro-integrations__client-name strong {
2145
+ font-weight: 600;
2146
+ overflow: hidden;
2147
+ text-overflow: ellipsis;
2148
+ white-space: nowrap;
2149
+ }
2150
+ .rastro-integrations__client-name .rastro-integrations__meta {
2151
+ display: block;
2152
+ overflow: hidden;
2153
+ text-overflow: ellipsis;
2154
+ white-space: nowrap;
2155
+ }
2156
+
2157
+ /* The feed of events sent */
2158
+ .rastro-integrations__feed .rastro-integrations__table td {
2159
+ padding: 12px 10px;
2160
+ }
2161
+ .rastro-integrations__feed [data-col="icon"] {
2162
+ width: 36px;
2163
+ color: var(--rastro-muted-fg);
2164
+ }
2165
+ .rastro-integrations__feed [data-col="ad"],
2166
+ .rastro-integrations__feed [data-col="when"] {
2167
+ color: var(--rastro-muted-fg);
2168
+ font-size: 12px;
2169
+ }
2170
+ .rastro-integrations__feed [data-col="when"] {
2171
+ text-align: right;
2172
+ white-space: nowrap;
2173
+ }
2174
+ .rastro-integrations__evt {
2175
+ display: inline-flex;
2176
+ align-items: center;
2177
+ gap: 6px;
2178
+ font-weight: 600;
2179
+ }
2180
+ .rastro-integrations__evt i {
2181
+ font-style: normal;
2182
+ font-family: "IBM Plex Mono", ui-monospace, monospace;
2183
+ font-size: 11px;
2184
+ font-weight: 500;
2185
+ color: var(--rastro-muted-fg);
2186
+ }
2187
+
2188
+ /* B4: what reconnecting brings back */
2189
+ .rastro-integrations__plan .rastro-integrations__title {
2190
+ margin-bottom: 12px;
2191
+ }
2192
+ .rastro-integrations__steps {
2193
+ list-style: none;
2194
+ padding: 0;
2195
+ display: grid;
2196
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2197
+ gap: 16px;
2198
+ }
2199
+ .rastro-integrations__steps li {
2200
+ display: flex;
2201
+ gap: 10px;
2202
+ }
2203
+ .rastro-integrations__steps strong {
2204
+ font-weight: 600;
2205
+ font-size: 13.5px;
2206
+ }
2207
+ .rastro-integrations__step-icon {
2208
+ width: 32px;
2209
+ height: 32px;
2210
+ border-radius: 9px;
2211
+ background: var(--rastro-muted);
2212
+ display: grid;
2213
+ place-items: center;
2214
+ flex: none;
2215
+ }
2216
+
2217
+ /* Header chip ("3 de 4 clientes ligados"), drawn by the host's header. */
2218
+ .rastro-integrations__badge {
2219
+ display: inline-flex;
2220
+ align-items: center;
2221
+ gap: 7px;
2222
+ height: 36px;
2223
+ padding: 0 12px;
2224
+ border-radius: 8px;
2225
+ background: var(--rastro-card);
2226
+ box-shadow: 0 0 0 1px var(--rastro-border);
2227
+ font-size: 13px;
2228
+ white-space: nowrap;
2229
+ color: color-mix(in oklab, var(--rastro-fg) 85%, var(--rastro-muted-fg));
2230
+ }
2231
+ .rastro-integrations__badge[data-tone="bad"] {
2232
+ color: oklch(0.5 0.16 28);
2233
+ }
2234
+ .rastro-integrations__badge .rastro-integrations__dot {
2235
+ background: var(--rastro-integrations-ok, oklch(0.6 0.13 163));
2236
+ }
2237
+
2238
+ /* B2: the waiting chip while Meta's window is open (a manual popover, in
2239
+ the top layer like the dialogs). */
2240
+ .rastro-integrations__waiting {
2241
+ position: fixed;
2242
+ inset: auto auto 24px 24px;
2243
+ margin: 0;
2244
+ border: 0;
2245
+ z-index: 60;
2246
+ font-family: var(--rastro-font);
2247
+ display: inline-flex;
2248
+ align-items: center;
2249
+ gap: 7px;
2250
+ height: 36px;
2251
+ max-width: calc(100vw - 48px);
2252
+ padding: 0 12px;
2253
+ border-radius: 8px;
2254
+ background: var(--rastro-card);
2255
+ box-shadow: 0 0 0 1px var(--rastro-border);
2256
+ font-size: 13px;
2257
+ color: color-mix(in oklab, var(--rastro-fg) 85%, var(--rastro-muted-fg));
2258
+ overflow: hidden;
2259
+ white-space: nowrap;
2260
+ text-overflow: ellipsis;
2261
+ }
2262
+ .rastro-integrations__waiting .rastro-integrations__spin {
2263
+ color: var(--rastro-integrations-meta);
2264
+ }
2265
+
2266
+ /* Overlays: dialogs and the events sheet */
2267
+ /* A native <dialog> in the top layer, drawn as the scrim itself. */
2268
+ .rastro-integrations__scrim {
2269
+ position: fixed;
2270
+ inset: 0;
2271
+ width: 100%;
2272
+ height: 100%;
2273
+ max-width: none;
2274
+ max-height: none;
2275
+ margin: 0;
2276
+ border: 0;
2277
+ color: var(--rastro-fg);
2278
+ font-family: var(--rastro-font);
2279
+ font-size: 14px;
2280
+ line-height: normal;
2281
+ background: rgb(11 20 38 / 42%);
2282
+ padding: 16px;
2283
+ overflow-y: auto;
2284
+ }
2285
+ .rastro-integrations__scrim[open] {
2286
+ display: grid;
2287
+ place-items: center;
2288
+ }
2289
+ .rastro-integrations__scrim::backdrop {
2290
+ background: transparent;
2291
+ }
2292
+ .rastro-integrations__scrim[data-side] {
2293
+ place-items: stretch end;
2294
+ background: rgb(11 20 38 / 32%);
2295
+ padding: 0;
2296
+ overflow: hidden;
2297
+ }
2298
+ .rastro-integrations__dialog {
2299
+ min-width: 0;
2300
+ overflow-wrap: anywhere;
2301
+ background: var(--rastro-card);
2302
+ border-radius: var(--rastro-radius);
2303
+ box-shadow: 0 24px 60px -12px rgb(11 20 38 / 45%);
2304
+ width: min(560px, 100%);
2305
+ padding: 22px;
2306
+ display: flex;
2307
+ flex-direction: column;
2308
+ gap: 14px;
2309
+ outline: none;
2310
+ }
2311
+ .rastro-integrations__dialog-head {
2312
+ display: flex;
2313
+ gap: 12px;
2314
+ align-items: flex-start;
2315
+ }
2316
+ .rastro-integrations__dialog-title {
2317
+ font-size: 18px;
2318
+ font-weight: 600;
2319
+ line-height: 1.3;
2320
+ }
2321
+ .rastro-integrations__dialog-head .rastro-integrations__desc b {
2322
+ font-weight: 600;
2323
+ }
2324
+ .rastro-integrations__danger-tile {
2325
+ width: 40px;
2326
+ height: 40px;
2327
+ border-radius: 10px;
2328
+ background: oklch(0.95 0.035 30);
2329
+ color: oklch(0.5 0.16 28);
2330
+ display: grid;
2331
+ place-items: center;
2332
+ flex: none;
2333
+ }
2334
+ .rastro-integrations__bullets {
2335
+ list-style: disc;
2336
+ padding-left: 22px;
2337
+ line-height: 1.7;
2338
+ }
2339
+ .rastro-integrations__line-skeleton {
2340
+ display: inline-block;
2341
+ width: 70%;
2342
+ height: 12px;
2343
+ vertical-align: middle;
2344
+ }
2345
+ .rastro-integrations__dialog-foot {
2346
+ display: flex;
2347
+ justify-content: flex-end;
2348
+ flex-wrap: wrap;
2349
+ gap: 8px;
2350
+ margin-top: 4px;
2351
+ }
2352
+
2353
+ .rastro-integrations__sheet {
2354
+ container: rastro-integrations-sheet / inline-size;
2355
+ width: min(720px, 100vw);
2356
+ height: 100dvh;
2357
+ max-height: 100dvh;
2358
+ background: var(--rastro-card);
2359
+ display: flex;
2360
+ flex-direction: column;
2361
+ box-shadow: -20px 0 50px -20px rgb(11 20 38 / 40%);
2362
+ outline: none;
2363
+ }
2364
+ .rastro-integrations__sheet-bar {
2365
+ display: none;
2366
+ }
2367
+ .rastro-integrations__sheet-body {
2368
+ flex: 1;
2369
+ min-height: 0;
2370
+ overflow-y: auto;
2371
+ padding: 26px 28px 8px;
2372
+ display: flex;
2373
+ flex-direction: column;
2374
+ gap: 16px;
2375
+ }
2376
+ .rastro-integrations__sheet-head {
2377
+ display: flex;
2378
+ align-items: flex-start;
2379
+ gap: 12px;
2380
+ }
2381
+ .rastro-integrations__sheet-head .rastro-integrations__icon-btn {
2382
+ margin: -4px -6px 0 0;
2383
+ }
2384
+ .rastro-integrations__pixelbar {
2385
+ display: flex;
2386
+ gap: 10px;
2387
+ align-items: center;
2388
+ padding: 10px 12px;
2389
+ border-radius: 10px;
2390
+ background: var(--rastro-muted);
2391
+ font-size: 13px;
2392
+ min-width: 0;
2393
+ }
2394
+ .rastro-integrations__pixelbar b {
2395
+ font-weight: 600;
2396
+ }
2397
+ .rastro-integrations__maprow {
2398
+ display: grid;
2399
+ grid-template-columns: 24px minmax(0, 1fr) 24px minmax(0, 1.35fr) 140px;
2400
+ align-items: center;
2401
+ gap: 12px;
2402
+ padding: 12px 4px;
2403
+ border-bottom: 1px solid var(--rastro-border);
2404
+ }
2405
+ .rastro-integrations__map-group:last-child
2406
+ .rastro-integrations__maprow:last-child {
2407
+ border-bottom: 0;
2408
+ }
2409
+ .rastro-integrations__group {
2410
+ font-size: 12px;
2411
+ font-weight: 600;
2412
+ color: var(--rastro-muted-fg);
2413
+ padding: 14px 4px 4px;
2414
+ border-bottom: 1px solid var(--rastro-border);
2415
+ }
2416
+ .rastro-integrations__stage {
2417
+ display: flex;
2418
+ align-items: center;
2419
+ gap: 10px;
2420
+ font-weight: 500;
2421
+ min-width: 0;
2422
+ }
2423
+ .rastro-integrations__stage-name {
2424
+ overflow: hidden;
2425
+ text-overflow: ellipsis;
2426
+ white-space: nowrap;
2427
+ }
2428
+ .rastro-integrations__stage .rastro-integrations__meta {
2429
+ margin-left: 4px;
2430
+ font-weight: 400;
2431
+ }
2432
+ .rastro-integrations__swatch {
2433
+ width: 10px;
2434
+ height: 10px;
2435
+ border-radius: 3px;
2436
+ flex: none;
2437
+ background: oklch(0.8 0.01 255);
2438
+ }
2439
+ .rastro-integrations__swatch[data-fixed] {
2440
+ background: var(--rastro-integrations-ok);
2441
+ }
2442
+ .rastro-integrations__arrow {
2443
+ display: grid;
2444
+ place-items: center;
2445
+ color: var(--rastro-muted-fg);
2446
+ }
2447
+ .rastro-integrations__map-note {
2448
+ white-space: nowrap;
2449
+ }
2450
+ .rastro-integrations__map-skeleton {
2451
+ height: 220px;
2452
+ margin-top: 8px;
2453
+ }
2454
+ .rastro-integrations__check {
2455
+ position: relative;
2456
+ display: inline-grid;
2457
+ place-items: center;
2458
+ width: 16px;
2459
+ height: 16px;
2460
+ flex: none;
2461
+ }
2462
+ .rastro-integrations__check input {
2463
+ appearance: none;
2464
+ margin: 0;
2465
+ width: 16px;
2466
+ height: 16px;
2467
+ border-radius: 4px;
2468
+ box-shadow: inset 0 0 0 1.5px var(--rastro-integrations-input);
2469
+ background: var(--rastro-card);
2470
+ cursor: pointer;
2471
+ }
2472
+ .rastro-integrations__check input:checked {
2473
+ background: var(--rastro-accent);
2474
+ box-shadow: none;
2475
+ }
2476
+ .rastro-integrations__check input:disabled {
2477
+ cursor: default;
2478
+ }
2479
+ .rastro-integrations__check .rastro-integrations__icon {
2480
+ position: absolute;
2481
+ pointer-events: none;
2482
+ color: var(--rastro-accent-fg);
2483
+ opacity: 0;
2484
+ }
2485
+ .rastro-integrations__check input:checked + .rastro-integrations__icon {
2486
+ opacity: 1;
2487
+ }
2488
+ .rastro-integrations__toggle {
2489
+ display: flex;
2490
+ align-items: center;
2491
+ gap: 10px;
2492
+ padding: 12px;
2493
+ border-radius: 10px;
2494
+ box-shadow: inset 0 0 0 1px var(--rastro-border);
2495
+ cursor: pointer;
2496
+ }
2497
+ .rastro-integrations__toggle .rastro-integrations__grow {
2498
+ display: flex;
2499
+ flex-direction: column;
2500
+ }
2501
+ .rastro-integrations__toggle-title {
2502
+ font-weight: 500;
2503
+ font-size: 13.5px;
2504
+ }
2505
+ .rastro-integrations__received ul {
2506
+ list-style: none;
2507
+ padding: 0;
2508
+ }
2509
+ .rastro-integrations__received li {
2510
+ display: grid;
2511
+ grid-template-columns: 16px minmax(0, 1fr) minmax(0, 1fr) 80px 80px;
2512
+ gap: 10px;
2513
+ align-items: center;
2514
+ padding: 7px 4px;
2515
+ font-size: 13px;
2516
+ border-bottom: 1px solid var(--rastro-border);
2517
+ }
2518
+ .rastro-integrations__received li > .rastro-integrations__icon {
2519
+ color: oklch(0.5 0.12 163);
2520
+ }
2521
+ .rastro-integrations__received
2522
+ li[data-status="failed"]
2523
+ > .rastro-integrations__icon {
2524
+ color: var(--rastro-integrations-danger);
2525
+ }
2526
+ .rastro-integrations__received
2527
+ li[data-status="pending"]
2528
+ > .rastro-integrations__icon {
2529
+ color: oklch(0.55 0.1 70);
2530
+ }
2531
+ .rastro-integrations__received li .rastro-integrations__meta {
2532
+ font-size: 13px;
2533
+ }
2534
+ .rastro-integrations__received li > span:nth-child(3) {
2535
+ font-weight: 500;
2536
+ }
2537
+ .rastro-integrations__received li > b {
2538
+ text-align: right;
2539
+ font-weight: 600;
2540
+ }
2541
+ .rastro-integrations__received li > span:last-child {
2542
+ justify-content: flex-end;
2543
+ }
2544
+ .rastro-integrations__sheet-foot {
2545
+ display: flex;
2546
+ align-items: center;
2547
+ gap: 8px;
2548
+ margin: 0 28px;
2549
+ padding: 14px 0 26px;
2550
+ border-top: 1px solid var(--rastro-border);
2551
+ }
2552
+ .rastro-integrations__foot-actions {
2553
+ margin-left: auto;
2554
+ display: flex;
2555
+ gap: 8px;
2556
+ }
2557
+
2558
+ /* The phone's footer bar ("Ligar Casa Aurora", "Reconectar"), fixed at the
2559
+ foot of the screen as a manual popover (top layer). */
2560
+ .rastro-integrations__phone-foot {
2561
+ position: fixed;
2562
+ inset: auto 0 0 0;
2563
+ width: auto;
2564
+ height: auto;
2565
+ margin: 0;
2566
+ border: 0;
2567
+ overflow: visible;
2568
+ z-index: 40;
2569
+ padding: 12px 14px calc(16px + env(safe-area-inset-bottom, 0px));
2570
+ border-top: 1px solid var(--rastro-border);
2571
+ background: var(--rastro-card);
2572
+ color: var(--rastro-fg);
2573
+ font-family: var(--rastro-font);
2574
+ }
2575
+ .rastro-integrations__phone-foot .rastro-integrations__btn {
2576
+ width: 100%;
2577
+ height: 44px;
2578
+ }
2579
+
2580
+ /* The phone's client cards */
2581
+ .rastro-integrations__cards {
2582
+ list-style: none;
2583
+ padding: 0;
2584
+ display: flex;
2585
+ flex-direction: column;
2586
+ gap: 10px;
2587
+ }
2588
+ .rastro-integrations__phone-card {
2589
+ padding: 10px 12px;
2590
+ display: flex;
2591
+ flex-direction: column;
2592
+ gap: 6px;
2593
+ }
2594
+ .rastro-integrations__phone-card[data-focus] {
2595
+ gap: 8px;
2596
+ box-shadow: 0 0 0 1.5px var(--rastro-accent);
2597
+ }
2598
+ .rastro-integrations__phone-card .rastro-integrations__client-name {
2599
+ flex: 1;
2600
+ }
2601
+ .rastro-integrations__phone-card .rastro-integrations__client-name strong {
2602
+ font-size: 14px;
2603
+ }
2604
+ .rastro-integrations__pills {
2605
+ display: flex;
2606
+ gap: 6px;
2607
+ flex-wrap: wrap;
2608
+ }
2609
+
2610
+ /* Loading */
2611
+ .rastro-integrations__skeleton {
2612
+ height: 260px;
2613
+ }
2614
+ .rastro-integrations__skeleton[data-size="sm"] {
2615
+ height: 76px;
2616
+ }
2617
+
2618
+ /* Narrower desktops: fewer table columns before the phone layout. */
2619
+ @container rastro-integrations (max-width: 1119px) {
2620
+ .rastro-integrations__table [data-col="currency"] {
2621
+ display: none;
2622
+ }
2623
+ }
2624
+ @container rastro-integrations (max-width: 1039px) {
2625
+ .rastro-integrations__table [data-col="pixel"],
2626
+ .rastro-integrations__feed [data-col="ad"] {
2627
+ display: none;
2628
+ }
2629
+ }
2630
+ @container rastro-integrations (max-width: 900px) {
2631
+ .rastro-integrations__start {
2632
+ grid-template-columns: minmax(0, 1fr);
2633
+ }
2634
+ .rastro-integrations__conn {
2635
+ flex-wrap: wrap;
2636
+ }
2637
+ .rastro-integrations__conn-actions {
2638
+ width: 100%;
2639
+ justify-content: flex-start;
2640
+ }
2641
+ .rastro-integrations__steps {
2642
+ grid-template-columns: minmax(0, 1fr);
2643
+ }
2644
+ .rastro-integrations__clients-head {
2645
+ flex-wrap: wrap;
2646
+ }
2647
+ }
2648
+
2649
+ /* The phone (M1–M3): cards from a tablet down, where the table cannot fit. */
2650
+ @container rastro-integrations (max-width: 899px) {
2651
+ .rastro-integrations {
2652
+ gap: 10px;
2653
+ }
2654
+ .rastro-integrations [data-wide] {
2655
+ display: none;
2656
+ }
2657
+ .rastro-integrations [data-narrow] {
2658
+ display: block;
2659
+ }
2660
+ /* Room under the last card for the fixed footer. */
2661
+ .rastro-integrations[data-foot] .rastro-integrations__cards {
2662
+ margin-bottom: 84px;
2663
+ }
2664
+ .rastro-integrations__connect {
2665
+ padding: 20px;
2666
+ }
2667
+ .rastro-integrations__planb {
2668
+ padding: 16px;
2669
+ }
2670
+ .rastro-integrations__phone-card .rastro-integrations__title {
2671
+ font-size: 14px;
2672
+ }
2673
+ .rastro-integrations__conn-phone .rastro-integrations__title {
2674
+ font-size: 15px;
2675
+ }
2676
+ }
2677
+
2678
+ /* The events sheet goes full screen on a phone (M2). */
2679
+ @container rastro-integrations-sheet (max-width: 639px) {
2680
+ .rastro-integrations__sheet [data-wide] {
2681
+ display: none;
2682
+ }
2683
+ .rastro-integrations__sheet [data-narrow] {
2684
+ display: inline;
2685
+ }
2686
+ .rastro-integrations__sheet p[data-narrow] {
2687
+ display: flex;
2688
+ gap: 4px;
2689
+ align-items: center;
2690
+ font-size: 12px;
2691
+ line-height: 1.4;
2692
+ }
2693
+ .rastro-integrations__sheet-bar {
2694
+ display: flex;
2695
+ align-items: center;
2696
+ gap: 10px;
2697
+ height: 52px;
2698
+ padding: 0 12px;
2699
+ border-bottom: 1px solid var(--rastro-border);
2700
+ font-size: 16px;
2701
+ flex: none;
2702
+ }
2703
+ .rastro-integrations__sheet-bar .rastro-integrations__icon {
2704
+ transform: rotate(180deg);
2705
+ }
2706
+ .rastro-integrations__sheet-bar .rastro-integrations__icon-btn {
2707
+ color: var(--rastro-fg);
2708
+ }
2709
+ .rastro-integrations__sheet-head {
2710
+ display: none;
2711
+ }
2712
+ .rastro-integrations__sheet-body {
2713
+ padding: 12px 14px 12px;
2714
+ gap: 10px;
2715
+ background: var(--rastro-bg);
2716
+ }
2717
+ .rastro-integrations__pixelbar {
2718
+ padding: 7px 12px;
2719
+ font-size: 12.5px;
2720
+ gap: 8px;
2721
+ }
2722
+ .rastro-integrations__map {
2723
+ background: var(--rastro-card);
2724
+ border-radius: var(--rastro-radius);
2725
+ box-shadow: 0 0 0 1px var(--rastro-integrations-ring);
2726
+ padding: 4px 12px;
2727
+ }
2728
+ .rastro-integrations__map > .rastro-integrations__sec {
2729
+ display: none;
2730
+ }
2731
+ .rastro-integrations__maprow {
2732
+ grid-template-columns: minmax(0, 1fr) auto;
2733
+ gap: 5px;
2734
+ padding: 8px 0;
2735
+ }
2736
+ .rastro-integrations__maprow > .rastro-integrations__check,
2737
+ .rastro-integrations__maprow > .rastro-integrations__arrow {
2738
+ display: none;
2739
+ }
2740
+ .rastro-integrations__maprow > .rastro-integrations__select {
2741
+ grid-column: 1 / -1;
2742
+ grid-row: 2;
2743
+ height: 34px;
2744
+ }
2745
+ .rastro-integrations__maprow .rastro-integrations__stage {
2746
+ font-size: 13.5px;
2747
+ }
2748
+ .rastro-integrations__maprow .rastro-integrations__map-note {
2749
+ grid-column: 2;
2750
+ grid-row: 1;
2751
+ }
2752
+ .rastro-integrations__sheet-foot {
2753
+ margin: 0;
2754
+ padding: 12px 14px 26px;
2755
+ }
2756
+ .rastro-integrations__foot-actions {
2757
+ margin-left: 0;
2758
+ width: 100%;
2759
+ }
2760
+ .rastro-integrations__foot-actions .rastro-integrations__btn {
2761
+ height: 44px;
2762
+ }
2763
+ .rastro-integrations__foot-actions .rastro-integrations__btn:last-child {
2764
+ flex: 1;
2765
+ }
2766
+ }
2767
+
2768
+ /* src/ui/portfolio/portfolio.css */
2769
+ /*
2770
+ * PortfolioView (the agency home). Sizes follow the view's own width through
2771
+ * a container query, so it fits a dashboard column or a partner portal alike.
2772
+ */
2773
+
2774
+ .rastro-portfolio {
2775
+ container: rastro-portfolio / inline-size;
2776
+ display: flex;
2777
+ flex-direction: column;
2778
+ gap: 16px;
2779
+ min-width: 0;
2780
+ }
2781
+
2782
+ .rastro-portfolio h3 {
2783
+ margin: 0;
2784
+ font-size: 15px;
2785
+ font-weight: 600;
2786
+ }
2787
+ .rastro-portfolio p {
2788
+ margin: 0;
2789
+ }
2790
+
2791
+ .rastro-portfolio__warning {
2792
+ padding: 10px 14px;
2793
+ border-radius: var(--rastro-radius);
2794
+ background: var(--rastro-ok-bg);
2795
+ color: var(--rastro-ok);
2796
+ font-size: 13px;
2797
+ }
2798
+
2799
+ /* KPIs */
2800
+ /*
2801
+ * Five KPIs never leave one alone on a row: one column on a phone, then two
2802
+ * with Retorno across both, three with Retorno across two, then all five.
2803
+ */
2804
+ .rastro-portfolio__kpis {
2805
+ display: grid;
2806
+ grid-template-columns: minmax(0, 1fr);
2807
+ gap: 12px;
2808
+ }
2809
+ @container rastro-portfolio (min-width: 380px) {
2810
+ .rastro-portfolio__kpis {
2811
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2812
+ }
2813
+ .rastro-portfolio__kpi[data-highlight] {
2814
+ grid-column: span 2;
2815
+ }
2816
+ }
2817
+ @container rastro-portfolio (min-width: 560px) {
2818
+ .rastro-portfolio__kpis {
2819
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2820
+ }
2821
+ }
2822
+ @container rastro-portfolio (min-width: 920px) {
2823
+ .rastro-portfolio__kpis {
2824
+ grid-template-columns: repeat(5, minmax(0, 1fr));
2825
+ }
2826
+ .rastro-portfolio__kpi[data-highlight] {
2827
+ grid-column: auto;
2828
+ }
2829
+ }
2830
+ .rastro-portfolio__kpi {
2831
+ display: flex;
2832
+ flex-direction: column;
2833
+ gap: 4px;
2834
+ min-width: 0;
2835
+ padding: 14px;
2836
+ }
2837
+ .rastro-portfolio__kpi[data-highlight] {
2838
+ background: var(--rastro-accent);
2839
+ border-color: var(--rastro-accent);
2840
+ color: var(--rastro-accent-fg);
2841
+ }
2842
+ .rastro-portfolio__kpi-label,
2843
+ .rastro-portfolio__kpi-sub {
2844
+ font-size: 12px;
2845
+ color: var(--rastro-muted-fg);
2846
+ }
2847
+ .rastro-portfolio__kpi-label {
2848
+ font-size: 13px;
2849
+ }
2850
+ .rastro-portfolio__kpi[data-highlight] .rastro-portfolio__kpi-label,
2851
+ .rastro-portfolio__kpi[data-highlight] .rastro-portfolio__kpi-sub {
2852
+ color: color-mix(in oklab, var(--rastro-accent-fg) 72%, transparent);
2853
+ }
2854
+ /* The Retorno change on the dark card: colors that read on the accent. */
2855
+ .rastro-portfolio__kpi[data-highlight] .rastro-change[data-trend="good"] {
2856
+ color: var(--rastro-on-accent-good);
2857
+ }
2858
+ .rastro-portfolio__kpi[data-highlight] .rastro-change[data-trend="bad"] {
2859
+ color: var(--rastro-on-accent-bad);
2860
+ }
2861
+ .rastro-portfolio__kpi-value {
2862
+ font-size: 24px;
2863
+ font-weight: 600;
2864
+ letter-spacing: -0.01em;
2865
+ }
2866
+ .rastro-portfolio__kpi-sub {
2867
+ display: flex;
2868
+ flex-wrap: wrap;
2869
+ gap: 2px 6px;
2870
+ overflow-wrap: anywhere;
2871
+ }
2872
+ .rastro-portfolio__kpi-skeleton {
2873
+ height: 96px;
2874
+ }
2875
+
2876
+ /* Client cards */
2877
+ /* Cards go 1, 2 or 4 across, so four clients never end as 3 + 1. */
2878
+ .rastro-portfolio__clients {
2879
+ display: grid;
2880
+ grid-template-columns: minmax(0, 1fr);
2881
+ gap: 16px;
2882
+ }
2883
+ @container rastro-portfolio (min-width: 520px) {
2884
+ .rastro-portfolio__clients {
2885
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2886
+ }
2887
+ }
2888
+ @container rastro-portfolio (min-width: 1080px) {
2889
+ .rastro-portfolio__clients {
2890
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2891
+ }
2892
+ }
2893
+ .rastro-portfolio__client-skeleton {
2894
+ height: 340px;
2895
+ }
2896
+ .rastro-portfolio__client {
2897
+ display: flex;
2898
+ flex-direction: column;
2899
+ gap: 12px;
2900
+ min-width: 0;
2901
+ }
2902
+ .rastro-portfolio__client[data-best] {
2903
+ border-color: var(--rastro-strong);
2904
+ box-shadow: 0 0 0 1px var(--rastro-strong);
2905
+ }
2906
+ .rastro-portfolio__client-head {
2907
+ display: flex;
2908
+ align-items: center;
2909
+ gap: 10px;
2910
+ min-width: 0;
2911
+ }
2912
+ .rastro-portfolio__client-name {
2913
+ display: flex;
2914
+ flex-direction: column;
2915
+ min-width: 0;
2916
+ }
2917
+ .rastro-portfolio__client-name strong {
2918
+ font-size: 15px;
2919
+ font-weight: 600;
2920
+ overflow: hidden;
2921
+ text-overflow: ellipsis;
2922
+ white-space: nowrap;
2923
+ }
2924
+ .rastro-portfolio__client-name span {
2925
+ font-size: 12px;
2926
+ overflow: hidden;
2927
+ text-overflow: ellipsis;
2928
+ white-space: nowrap;
2929
+ }
2930
+ .rastro-portfolio__avatar {
2931
+ flex: none;
2932
+ display: grid;
2933
+ place-items: center;
2934
+ width: 34px;
2935
+ height: 34px;
2936
+ border-radius: 999px;
2937
+ font-size: 12px;
2938
+ font-weight: 600;
2939
+ --rastro-portfolio-hue: 20;
2940
+ background: oklch(0.92 0.05 var(--rastro-portfolio-hue));
2941
+ color: oklch(0.42 0.12 var(--rastro-portfolio-hue));
2942
+ }
2943
+ .rastro-portfolio__avatar[data-hue="1"] {
2944
+ --rastro-portfolio-hue: 230;
2945
+ }
2946
+ .rastro-portfolio__avatar[data-hue="2"] {
2947
+ --rastro-portfolio-hue: 80;
2948
+ }
2949
+ .rastro-portfolio__avatar[data-hue="3"] {
2950
+ --rastro-portfolio-hue: 300;
2951
+ }
2952
+ .rastro-portfolio__avatar[data-hue="4"] {
2953
+ --rastro-portfolio-hue: 160;
2954
+ }
2955
+ .rastro-portfolio__avatar[data-hue="5"] {
2956
+ --rastro-portfolio-hue: 0;
2957
+ }
2958
+ .dark .rastro-portfolio__avatar,
2959
+ .rastro-dark .rastro-portfolio__avatar {
2960
+ background: oklch(0.36 0.07 var(--rastro-portfolio-hue));
2961
+ color: oklch(0.88 0.08 var(--rastro-portfolio-hue));
2962
+ }
2963
+
2964
+ .rastro-portfolio__return {
2965
+ display: flex;
2966
+ align-items: flex-end;
2967
+ justify-content: space-between;
2968
+ gap: 8px;
2969
+ padding: 12px;
2970
+ border-radius: calc(var(--rastro-radius) + 2px);
2971
+ background: var(--rastro-muted);
2972
+ }
2973
+ .rastro-portfolio__return-label {
2974
+ display: block;
2975
+ font-size: 12px;
2976
+ color: var(--rastro-muted-fg);
2977
+ }
2978
+ .rastro-portfolio__return-value {
2979
+ font-size: 32px;
2980
+ font-weight: 600;
2981
+ line-height: 1.1;
2982
+ letter-spacing: -0.02em;
2983
+ }
2984
+ .rastro-portfolio__return-value[data-band="strong"] {
2985
+ color: var(--rastro-strong);
2986
+ }
2987
+ .rastro-portfolio__return-value[data-band="ok"] {
2988
+ color: var(--rastro-ok);
2989
+ }
2990
+ .rastro-portfolio__return-value[data-band="weak"] {
2991
+ color: var(--rastro-weak);
2992
+ }
2993
+ .rastro-portfolio__spark-box {
2994
+ display: flex;
2995
+ flex-direction: column;
2996
+ align-items: flex-end;
2997
+ gap: 2px;
2998
+ min-width: 0;
2999
+ font-size: 11px;
3000
+ }
3001
+ .rastro-portfolio__spark {
3002
+ display: block;
3003
+ overflow: visible;
3004
+ max-width: 100%;
3005
+ }
3006
+ .rastro-portfolio__spark-area {
3007
+ fill: color-mix(in oklab, var(--rastro-fg) 8%, transparent);
3008
+ }
3009
+ .rastro-portfolio__spark-line {
3010
+ fill: none;
3011
+ stroke: var(--rastro-fg);
3012
+ stroke-width: 1.6;
3013
+ stroke-linejoin: round;
3014
+ }
3015
+ .rastro-portfolio__spark-dot {
3016
+ fill: var(--rastro-fg);
3017
+ }
3018
+ .rastro-portfolio__spark-base {
3019
+ stroke: var(--rastro-border);
3020
+ }
3021
+ .rastro-portfolio__spark-stem {
3022
+ stroke: var(--rastro-fg);
3023
+ stroke-width: 1.6;
3024
+ }
3025
+
3026
+ .rastro-portfolio__figures {
3027
+ display: grid;
3028
+ grid-template-columns: 1fr 1fr;
3029
+ gap: 8px 12px;
3030
+ margin: 0;
3031
+ }
3032
+ .rastro-portfolio__figures div {
3033
+ min-width: 0;
3034
+ }
3035
+ .rastro-portfolio__figures dt {
3036
+ font-size: 12px;
3037
+ color: var(--rastro-muted-fg);
3038
+ }
3039
+ .rastro-portfolio__figures dd {
3040
+ margin: 1px 0 0;
3041
+ font-size: 15px;
3042
+ font-weight: 600;
3043
+ }
3044
+
3045
+ .rastro-portfolio__insight {
3046
+ padding: 6px 10px;
3047
+ border-radius: calc(var(--rastro-radius) - 2px);
3048
+ font-size: 12.5px;
3049
+ font-weight: 500;
3050
+ background: var(--rastro-muted);
3051
+ color: var(--rastro-muted-fg);
3052
+ }
3053
+ .rastro-portfolio__insight[data-tone="good"] {
3054
+ background: var(--rastro-strong-bg);
3055
+ color: var(--rastro-strong);
3056
+ }
3057
+ .rastro-portfolio__insight[data-tone="watch"] {
3058
+ background: var(--rastro-ok-bg);
3059
+ color: var(--rastro-ok);
3060
+ }
3061
+ .rastro-portfolio__insight[data-tone="bad"] {
3062
+ background: var(--rastro-weak-bg);
3063
+ color: var(--rastro-weak);
3064
+ }
3065
+
3066
+ .rastro-portfolio__open {
3067
+ display: inline-flex;
3068
+ align-items: center;
3069
+ gap: 6px;
3070
+ align-self: flex-start;
3071
+ padding: 0;
3072
+ border: 0;
3073
+ background: none;
3074
+ font: inherit;
3075
+ font-size: 13px;
3076
+ font-weight: 600;
3077
+ color: var(--rastro-fg);
3078
+ text-align: left;
3079
+ cursor: pointer;
3080
+ }
3081
+ .rastro-portfolio__open span {
3082
+ transition: transform 0.15s;
3083
+ }
3084
+ .rastro-portfolio__open:hover span {
3085
+ transform: translateX(3px);
3086
+ }
3087
+ .rastro-portfolio__open:focus-visible,
3088
+ .rastro-portfolio__toggle button:focus-visible {
3089
+ outline: 2px solid var(--rastro-fg);
3090
+ outline-offset: 2px;
3091
+ border-radius: 4px;
3092
+ }
3093
+ .rastro-portfolio__client .rastro-portfolio__open {
3094
+ align-self: stretch;
3095
+ margin-top: auto;
3096
+ padding-top: 12px;
3097
+ border-top: 1px solid var(--rastro-border);
3098
+ }
3099
+
3100
+ /* Chart and attention */
3101
+ .rastro-portfolio__bottom {
3102
+ display: grid;
3103
+ grid-template-columns: minmax(0, 1fr);
3104
+ gap: 16px;
3105
+ }
3106
+ @container rastro-portfolio (min-width: 960px) {
3107
+ .rastro-portfolio__bottom {
3108
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
3109
+ }
3110
+ }
3111
+ .rastro-portfolio__section-head {
3112
+ display: flex;
3113
+ flex-wrap: wrap;
3114
+ justify-content: space-between;
3115
+ align-items: flex-start;
3116
+ gap: 8px 12px;
3117
+ margin-bottom: 12px;
3118
+ }
3119
+ .rastro-portfolio__section-head > div {
3120
+ min-width: 0;
3121
+ flex: 1 1 220px;
3122
+ }
3123
+ .rastro-portfolio__section-head p {
3124
+ margin-top: 2px;
3125
+ font-size: 13px;
3126
+ }
3127
+ .rastro-portfolio__toggle {
3128
+ display: inline-flex;
3129
+ flex-wrap: wrap;
3130
+ gap: 2px;
3131
+ padding: 3px;
3132
+ border-radius: calc(var(--rastro-radius) - 1px);
3133
+ background: var(--rastro-muted);
3134
+ }
3135
+ .rastro-portfolio__toggle button {
3136
+ padding: 4px 10px;
3137
+ border: 0;
3138
+ border-radius: calc(var(--rastro-radius) - 3px);
3139
+ background: none;
3140
+ font: inherit;
3141
+ font-size: 13px;
3142
+ color: var(--rastro-muted-fg);
3143
+ white-space: nowrap;
3144
+ cursor: pointer;
3145
+ }
3146
+ .rastro-portfolio__toggle button[aria-pressed="true"] {
3147
+ background: var(--rastro-card);
3148
+ color: var(--rastro-fg);
3149
+ box-shadow: 0 1px 2px rgb(0 0 0 / 8%);
3150
+ }
3151
+
3152
+ .rastro-portfolio__chart {
3153
+ width: 100%;
3154
+ min-width: 0;
3155
+ overflow: hidden;
3156
+ }
3157
+ .rastro-portfolio__chart svg {
3158
+ display: block;
3159
+ width: 100%;
3160
+ height: auto;
3161
+ }
3162
+ .rastro-portfolio__zone[data-band="strong"] {
3163
+ fill: var(--rastro-strong-bg);
3164
+ opacity: 0.45;
3165
+ }
3166
+ .rastro-portfolio__zone[data-band="weak"] {
3167
+ fill: var(--rastro-weak-bg);
3168
+ opacity: 0.55;
3169
+ }
3170
+ .rastro-portfolio__zone-label {
3171
+ font-size: 11px;
3172
+ font-weight: 500;
3173
+ }
3174
+ .rastro-portfolio__zone-label[data-band="strong"] {
3175
+ fill: var(--rastro-strong);
3176
+ }
3177
+ .rastro-portfolio__zone-label[data-band="weak"] {
3178
+ fill: var(--rastro-weak);
3179
+ }
3180
+ .rastro-portfolio__grid {
3181
+ stroke: var(--rastro-border);
3182
+ }
3183
+ .rastro-portfolio__axis {
3184
+ font-size: 11px;
3185
+ fill: var(--rastro-muted-fg);
3186
+ }
3187
+ .rastro-portfolio__average {
3188
+ stroke: var(--rastro-fg);
3189
+ stroke-width: 1.2;
3190
+ stroke-dasharray: 4 4;
3191
+ }
3192
+ .rastro-portfolio__average-label {
3193
+ font-size: 11px;
3194
+ font-weight: 600;
3195
+ fill: var(--rastro-fg);
3196
+ }
3197
+ .rastro-portfolio__bubble {
3198
+ fill: color-mix(in oklab, var(--rastro-fg) 45%, transparent);
3199
+ stroke: var(--rastro-card);
3200
+ stroke-width: 2;
3201
+ }
3202
+ .rastro-portfolio__bubble[data-band="strong"] {
3203
+ fill: color-mix(in oklab, var(--rastro-strong) 70%, transparent);
3204
+ }
3205
+ .rastro-portfolio__bubble[data-band="ok"] {
3206
+ fill: color-mix(in oklab, var(--rastro-ok) 65%, transparent);
3207
+ }
3208
+ .rastro-portfolio__bubble[data-band="weak"] {
3209
+ fill: color-mix(in oklab, var(--rastro-weak) 65%, transparent);
3210
+ }
3211
+ .rastro-portfolio__label {
3212
+ font-size: 12.5px;
3213
+ }
3214
+ .rastro-portfolio__label-name {
3215
+ font-weight: 600;
3216
+ fill: var(--rastro-fg);
3217
+ }
3218
+ .rastro-portfolio__label-value {
3219
+ fill: var(--rastro-muted-fg);
3220
+ font-variant-numeric: tabular-nums;
3221
+ }
3222
+
3223
+ .rastro-portfolio__rank {
3224
+ display: flex;
3225
+ flex-wrap: wrap;
3226
+ align-items: center;
3227
+ gap: 6px 16px;
3228
+ margin-top: 8px;
3229
+ padding-top: 12px;
3230
+ border-top: 1px solid var(--rastro-border);
3231
+ font-size: 12.5px;
3232
+ color: var(--rastro-muted-fg);
3233
+ }
3234
+ .rastro-portfolio__rank ol {
3235
+ display: flex;
3236
+ flex-wrap: wrap;
3237
+ gap: 6px 16px;
3238
+ min-width: 0;
3239
+ max-width: 100%;
3240
+ margin: 0;
3241
+ padding: 0;
3242
+ list-style: none;
3243
+ }
3244
+ /* A long client name ellipsizes instead of pushing the list out. */
3245
+ .rastro-portfolio__rank li {
3246
+ display: flex;
3247
+ align-items: center;
3248
+ gap: 6px;
3249
+ min-width: 0;
3250
+ max-width: 100%;
3251
+ }
3252
+ .rastro-portfolio__rank-title {
3253
+ font-weight: 500;
3254
+ }
3255
+ .rastro-portfolio__rank-pos {
3256
+ display: grid;
3257
+ place-items: center;
3258
+ flex: none;
3259
+ width: 18px;
3260
+ height: 18px;
3261
+ border-radius: 999px;
3262
+ background: var(--rastro-muted);
3263
+ font-size: 11px;
3264
+ font-weight: 600;
3265
+ color: var(--rastro-fg);
3266
+ }
3267
+ .rastro-portfolio__rank-name {
3268
+ overflow: hidden;
3269
+ text-overflow: ellipsis;
3270
+ white-space: nowrap;
3271
+ }
3272
+ .rastro-portfolio__rank strong {
3273
+ color: var(--rastro-fg);
3274
+ }
3275
+ .rastro-portfolio__note {
3276
+ margin-top: 8px;
3277
+ font-size: 12px;
3278
+ }
3279
+
3280
+ .rastro-portfolio__count {
3281
+ display: grid;
3282
+ place-items: center;
3283
+ min-width: 24px;
3284
+ height: 24px;
3285
+ padding: 0 6px;
3286
+ border-radius: 999px;
3287
+ background: var(--rastro-muted);
3288
+ font-size: 12px;
3289
+ font-weight: 600;
3290
+ }
3291
+ .rastro-portfolio__alerts {
3292
+ display: flex;
3293
+ flex-direction: column;
3294
+ gap: 10px;
3295
+ margin: 0;
3296
+ padding: 0;
3297
+ list-style: none;
3298
+ }
3299
+ .rastro-portfolio__alert {
3300
+ position: relative;
3301
+ display: flex;
3302
+ flex-direction: column;
3303
+ gap: 4px;
3304
+ padding: 12px 12px 12px 22px;
3305
+ border: 1px solid var(--rastro-border);
3306
+ border-radius: var(--rastro-radius);
3307
+ font-size: 13.5px;
3308
+ line-height: 1.4;
3309
+ overflow-wrap: anywhere;
3310
+ }
3311
+ /* The tone as a colored bar on the alert's left edge. */
3312
+ .rastro-portfolio__alert::before {
3313
+ content: "";
3314
+ position: absolute;
3315
+ inset: 12px auto 12px 10px;
3316
+ width: 4px;
3317
+ border-radius: 999px;
3318
+ background: var(--rastro-muted-fg);
3319
+ }
3320
+ .rastro-portfolio__alert[data-tone="good"]::before {
3321
+ background: var(--rastro-strong);
3322
+ }
3323
+ .rastro-portfolio__alert[data-tone="watch"]::before {
3324
+ background: var(--rastro-ok);
3325
+ }
3326
+ .rastro-portfolio__alert[data-tone="bad"]::before {
3327
+ background: var(--rastro-weak);
3328
+ }
3329
+ .rastro-portfolio__alert .rastro-muted {
3330
+ font-size: 12.5px;
3331
+ }
3332
+ .rastro-portfolio__alert .rastro-portfolio__open {
3333
+ margin-top: 4px;
3334
+ font-size: 12.5px;
3335
+ }
3336
+
3337
+ .rastro-portfolio__more {
3338
+ margin-top: 10px;
3339
+ padding: 2px 10px;
3340
+ border: 1px solid var(--rastro-border);
3341
+ border-radius: 999px;
3342
+ background: none;
3343
+ font: inherit;
3344
+ font-size: 12.5px;
3345
+ font-weight: 600;
3346
+ color: var(--rastro-fg);
3347
+ cursor: pointer;
3348
+ }
3349
+ .rastro-portfolio__more:focus-visible {
3350
+ outline: 2px solid var(--rastro-fg);
3351
+ outline-offset: 2px;
3352
+ }
3353
+ .rastro-portfolio__partial {
3354
+ margin-top: -6px;
3355
+ font-size: 12.5px;
3356
+ }