@getvitops/astro 4.0.0 → 5.0.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,308 @@
1
1
  # @getvitops/astro
2
2
 
3
+ ## 5.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - **Dangling token references are now a build failure.** `validate()` resolves every `var(--…)` a
8
+ config authors — in `patterns.defaults` / `radii` / `groups` / `items.*.{base,overrides,states}`,
9
+ `typography.roles` and `shadows` — against the tokens that config actually emits. A reference to a
10
+ token that does not exist used to validate, generate, minify and ship, then resolve to nothing in
11
+ the browser: one downstream config shipped a `.cta` whose `color` fell back to `inherit` on a brand
12
+ fill (unreadable text on every filled button), and two of its four dead references had been dead for
13
+ several releases with nothing ever reporting them.
14
+
15
+ The check is deliberately anchored to the namespaces the generator owns — `--color-*`, `--shadow-*`,
16
+ `--z-tier-*`, `--surface-glass`, `--overlay` — the same discipline `vitops lint` follows. A pattern
17
+ may legitimately reference a framework token from `@getvitops/core` or a hook of your own, and
18
+ enumerating "every valid token" would make those false positives. A reference carrying a fallback
19
+ (`var(--x, 0.25rem)`) is never flagged: that is you saying what happens when the token is absent.
20
+ Errors name the config path and suggest the nearest token that does exist.
21
+
22
+ Two related diagnostics ship with it:
23
+ - **Pre-1.0 colour-grammar references are reported as one rename table**, not as a dozen separate
24
+ "no such token" errors — the shape the 3.0 flat-config detector uses, applied to the 1.0 colour
25
+ change. It is built from your own role names, and it says to apply the renames _simultaneously_,
26
+ because several of them rotate (`--surface-bg` → `--color-bg-surface-muted`,
27
+ `--surface-bg-bold` → `--color-bg-surface`) and sequential replacement compounds them.
28
+ - **A surface-shaped role declared chromatic now warns.** A bare hue string is shorthand for
29
+ `kind: "chromatic"`, which emits no bare `--color-bg-<role>` and no `.bg-<role>` — so writing
30
+ `"surface": "ink"` silently removed `--color-bg-surface` and the 36 references the framework's own
31
+ CSS makes to it. Relatedly, `--surface-glass`, `--overlay` and `.glass` are no longer emitted when
32
+ `surface` is chromatic: they read `--color-bg-surface`, so emitting them pointed at nothing.
33
+
34
+ **`vitops lint --fix` is now the migration tool.** It reads `var(--…)` out of CSS and `<style>`
35
+ blocks (not just `class` attributes) and rewrites pre-1.0 token references in a **single pass**, so
36
+ the rotating renames cannot compound. Nothing else is rewritten — every other finding it reports is
37
+ a judgement call. Run it after a major bump.
38
+
39
+ **`--help` works on every subcommand.** `vitops lint --help` used to exit non-zero with
40
+ `Unknown option '--help'`; every leaf subcommand parsed its own argv strictly and none declared the
41
+ option. It is now answered before dispatch, so no command can forget it, and a drift guard fails the
42
+ build if a command has no documented options. (`validate`'s options were genuinely undocumented and
43
+ now are.)
44
+
45
+ **The Astro integration reads `site.tracking` and `site.legal.cookieConsent`.** These drive the
46
+ generated cookie notice, while `vitops({ consent, tracking })` drove the runtime — two hand-synced
47
+ declarations of the same fact with nothing comparing them, so a site could ship a notice naming
48
+ categories its banner never offered, or disclosing an `_ac` cookie no capture script ever wrote, and
49
+ the build was clean. The config blocks are now defaults (as `css` / `fonts` / `favicon` / `ads`
50
+ already were) and a genuine contradiction — `true` against `false` on the same fact — **fails the
51
+ build**, naming both sides. An absent option is not a contradiction; it just takes the config's
52
+ value.
53
+
54
+ Also fixed, each from a downstream report:
55
+ - **`@getvitops/astro/tracking`** re-exports `@getvitops/utils/tracking` (plus `TRACKING_ENDPOINT`),
56
+ so the documented conversion flow works with one install. Under strict pnpm app code cannot
57
+ resolve a transitive dependency, and the obvious workaround — importing the same symbols from the
58
+ package index — is the one that drags the integration's Node builtins toward a Worker bundle. This
59
+ entry and `./routes` are both clean.
60
+ - **`createConversionRoute`'s example was broken on every supported Astro.** It read the binding off
61
+ `locals.runtime.env`, removed in Astro v6, while the package peers on `>= 7` — and because the
62
+ throw precedes the response, Astro re-reads the request and reports a misleading "Body has already
63
+ been used". It also called a `toNotifyContext()` helper that does not exist. The example now uses
64
+ `import { env } from 'cloudflare:workers'` and a plain `NotifyContext`.
65
+ - **`/api/track` is exported as `TRACKING_ENDPOINT`**, and the integration warns at build when
66
+ tracking is on and no route answers it. It was a bare literal inside the inlined capture script:
67
+ name the route file anything else and every `tel:` beacon 404s, conversions vanish, and nothing
68
+ errors anywhere.
69
+ - **`describeEvent` no longer reports "from Unknown"** for forms that don't have a field literally
70
+ named `name`. It now falls back through `first_name`/`last_name`, `full_name`, and finally the
71
+ email address.
72
+ - **`sendEmail` takes `timeoutMs` (default 10s).** `binding.send()` had no deadline, so one hung
73
+ attempt hung the request that produced it — indefinitely, in the one module otherwise built on
74
+ always saying why. A timeout is retried, like any other transient failure.
75
+ - **`vitops search notify` warns when the sitemap's URLs aren't on the configured origin.** A 404
76
+ fails loudly; a well-formed sitemap belonging to someone else did not — a route collision served a
77
+ valid document listing another site's pages and the run reported a healthy submission. Surfaces at
78
+ `--dry`.
79
+ - **`require()` warns when the page has no `<wc-consent>`.** The demand can never be granted, so
80
+ whatever waited on it never runs — silently. Hit by rendering `<Tracking />` on pages where
81
+ `<CookieConsent />` wasn't.
82
+ - **`vitops agents` no longer writes a path it guessed.** It used to warn and then write "tokens
83
+ live in `design-system.json`" into a project whose tokens are in `company.json`, with the four
84
+ emitted `vitops generate` commands hard-coded to match — copy-paste-broken in exactly the projects
85
+ that most need the block to be right. It now finds the config by shape, interpolates the resolved
86
+ path into every emitted command, and fails rather than guessing when there is nothing to name.
87
+ - **`vitops search setup --dry` and `vitops ads setup --dry` run without credentials.** A dry run
88
+ that mutates nothing should not demand the token to mutate; with none set it plans from scratch
89
+ and says so. (`--check` still needs them — drift is a comparison against live state.) Both now
90
+ also mention that the Cloudflare token needs `Zone:Read` alongside `Zone:DNS:Edit` — the
91
+ zone-by-name lookup uses it, and its absence read as "the zone isn't in this account".
92
+ - **`vitops legal` names the files it wrote and flags new ones.** Enabling `cookieConsent` silently
93
+ produced a `cookie-notice` document that then needs a page, a route, a link and a `policyUrl`; the
94
+ command said only "3 files". The review reminder is also printed on the stdout path, where it was
95
+ missing entirely.
96
+ - **`vitops init` writes a versioned `$schema`** — `./node_modules/@getvitops/generator/schema.json`,
97
+ following wrangler — instead of an unpinned unpkg URL that resolved to whatever was newest, so an
98
+ editor validated a pinned project against a schema it wasn't built with.
99
+ - **`favicon.backgroundColor` and `favicon.name` are described accurately.** `backgroundColor` is
100
+ not manifest-only: it fills the opaque `apple-touch-icon.png` and `icon-mask.png`, which are
101
+ written whether or not a manifest is. `name` documents that it and `themeColor` **together** are
102
+ what make a site installable. The missing-background warning now also fires for a dark opaque mark,
103
+ not only a transparent source — `apple-touch-icon` insets the logo and fills the surround either
104
+ way.
105
+
106
+ - **The framework now says out loud which patterns are foundational, and reports it when you
107
+ reach past them.** From repeated downstream reports: sites were inventing a `.wrap` class and
108
+ using it everywhere instead of `.centered`, and `.subgrid` — the class for any set of cards —
109
+ was going essentially unused. Neither failure is visible in a build: every class involved is
110
+ real, nothing errors, and the page renders.
111
+
112
+ **`.subgrid` was missing from the generated class reference entirely.** So was `.cluster`, and
113
+ so was `.region`. `vitops docs classes` is the doc an agent is told to fetch for "which class
114
+ do I apply", and the framework's answer for a set of cards was not in it — which is most of why
115
+ it never got used. All three are now documented, along with `grid-auto`, and the reference opens
116
+ with a **Foundations** section that states the six substitutions as
117
+ _temptation → what to write instead_ rather than as a vocabulary list. The same table is now in
118
+ the shipped agent skill and in the `@getvitops/create` template's `AGENTS.md`, because a pointer
119
+ to a doc only helps someone who already suspects there is something to look up. (`css`/`bricks`
120
+ and `tailwind` alike — this is documentation and the `TIERS` manifest, not emitted CSS.)
121
+
122
+ **`vitops lint` gained three reuse rules and a markup pass.** The existing `.centered` rule only
123
+ fired when the hand-written CSS already referenced `--width-measure`, which is precisely the
124
+ author who was never going to hand-roll a container. It now also catches a page-scale
125
+ `max-width` (≥ 48rem, or a `ch` reading measure) with auto margins, and a
126
+ container-shaped class name — `wrap`, `wrapper`, `container`, `inner`, `shell`, … — carrying any
127
+ width cap at all. Reading the cap out of `min()` / `clamp()` too. New rules report a
128
+ hand-written `repeat()` grid as `.subgrid` (or `.grid-auto`), and a new **markup** pass reports a
129
+ repeated card set laid out without either — a loop that renders a card, or three or more cards
130
+ written out. That last one is the only check that can see this drift at all, since a card list
131
+ built from utility classes contains no bad class and no hand-written CSS.
132
+
133
+ All of these are `suggestion` severity, so they do not fail your build unless you pass
134
+ `--strict`. They found five real instances in this repo's own docs site.
135
+
136
+ **`vitops lint [files...]`** now takes explicit paths instead of scanning `--src`, so it can be
137
+ wired into a pre-commit hook — `vp`'s `staged` key appends the staged files to whatever it runs,
138
+ and a command that refused positionals could not be put in the one place the feedback lands at
139
+ the moment the code is written. Unreadable and non-source paths are skipped rather than fatal. The
140
+ `@getvitops/create` emdash template wires it up with `--strict` and adds a `lint:design` script.
141
+
142
+ **Two answers for "the whole card is a link", because one cannot exist.** Reported downstream:
143
+ agents dislike the `<li>` wrapper when a card is a link and write `<li><a class="card">` instead.
144
+ That shape is **wrong in a way that renders fine**, which is why it survives review — the `<li>`
145
+ is the grid item, so the anchor is an ordinary block inside it and the tranches within the anchor
146
+ never reach the parent's shared row lines. The alignment `.subgrid` exists for silently does not
147
+ happen, and the anchor does not fill the cell either. Putting the anchor in the grid's place
148
+ (`<ul><a></ul>`) is invalid HTML, so there was genuinely no correct shape to reach for.
149
+
150
+ There are now two, and they trade against each other because **no CSS-only technique can make a
151
+ whole card clickable and leave its text selectable** — a transparent overlay necessarily receives
152
+ the pointer-drag:
153
+
154
+ | Want | Use |
155
+ | ---------------------------------------- | ------------------------------------------- |
156
+ | zero JS, whole card clickable | `.stretched-link` — **text not selectable** |
157
+ | selectable text **and** a clickable card | `<Cards>` / `<wc-cards>` — needs JS |
158
+
159
+ `.stretched-link` goes on a link inside the card; its `::after` covers the card.
160
+ **`<wc-cards>` is a new tier-2 element** that adds no overlay and instead tells a click apart from
161
+ the end of a drag, so text selection survives. Its fallback is the card's own link, fully usable
162
+ with no JS, and the pointer cursor is applied by the element — so the affordance never appears
163
+ without the behaviour. `<Cards>` emits it for you. They are alternatives, never layered: with an
164
+ overlay present the JS has nothing to do, and `vitops lint` reports the combination. (All formats
165
+ — pattern partials, deliberately not `utilities.css`, which the tailwind format skips on the
166
+ invariant that everything left in it is a name Tailwind ships itself.)
167
+
168
+ ### Breaking
169
+ - **`<Subgrid />` renders its slot verbatim — author the `<li>` items yourself.**
170
+
171
+ ```diff
172
+ <Subgrid>
173
+ - <article class="card">…</article>
174
+ + <li class="card subgrid-card">…</li>
175
+ </Subgrid>
176
+ ```
177
+
178
+ It used to parse the slotted HTML and rebuild each child as an `<li>`, carrying over only
179
+ `class` and `style`. That existed solely because a `<ul>` may contain nothing else, and it cost
180
+ more than it bought: the child's tag was discarded, `id`/`data-*`/`aria-*` were silently
181
+ dropped, and `href` could not survive at all. Nothing is copied now, so nothing is lost. `as`
182
+ picks the container (`ul` by default, `ol`, `div`), and all other props are forwarded — they
183
+ were previously discarded, including `role`.
184
+
185
+ - **`<Subgrid />` and `<Tree />` now emit `role="list"`,** as does the Bricks `sitenav` element.
186
+ `list-style: none` stops Safari + VoiceOver announcing a `<ul>` as a list, so every marker-less
187
+ framework list was silently losing the semantics its `<ul>` was chosen for. If you hand-write
188
+ `.subgrid`, `.list`, `.facet-list`, `.nav-items`, `.collapse-menu` or `.tree` markup, add
189
+ `role="list"` yourself — the framework cannot add it to markup it does not render, and each
190
+ partial now says so at the `list-style` reset.
191
+ - **`<Cards />` no longer adds `class="card"` to slotted children,** because it no longer parses
192
+ them. Write the class on the item. It now emits `<wc-cards>` around a `<Subgrid>`, which is what
193
+ makes the whole card clickable — and like `<Tree />`, **it emits its own element, so do not wrap
194
+ it in `<wc-cards>` yourself.** It also previously passed a `role="list"` that `<Subgrid>` silently
195
+ discarded, so that never took effect.
196
+ - **`.subgrid-card` now sets `position: relative`**, so `stretched-link` inside it needs no extra
197
+ class. If you were absolutely positioning a descendant of a `.subgrid-card` against an ancestor
198
+ _outside_ that card, it will now resolve against the card. Move the positioning context
199
+ explicitly. (`css`/`bricks`/`tailwind` — the pattern partial is inlined into all three.) Not
200
+ reachable by `vitops lint --fix`: the fix depends on which ancestor you meant, which the
201
+ linter cannot know.
202
+
203
+ ### Fixed
204
+ - **`packages/generator/src/docs.ts` contained a literal NUL byte** (`CODE_SLOT`, written as the
205
+ raw character rather than an escape). libmagic classified the file as `data` rather than text, so
206
+ grep and ripgrep treated the largest doc emitter in the repo as **binary and silently skipped
207
+ it** — every search for a string in it returned nothing, with no error. It is now written as the `\u0000` escape.
208
+ Behaviour is identical; the file is searchable.
209
+ - **`.grid-auto` is documented.** It was a real framework class for auto-fit card grids with no
210
+ entry in the class reference, so the honest alternative to `subgrid` was as invisible as
211
+ `subgrid` itself.
212
+ - **`.raised` replaces the advice to use `.relative` above a `stretched-link` overlay**, which
213
+ could not work: a positioned element at `z-index: auto` does not rise above an explicit
214
+ `z-index` regardless of DOM order, so a second link or button in the card stayed underneath and
215
+ unclickable. `.raised` sets both, against the same `--z-tier-raised` token the overlay now uses
216
+ instead of a hard-coded `1`.
217
+
218
+ ### Patch Changes
219
+
220
+ - Updated dependencies
221
+ - Updated dependencies
222
+ - Updated dependencies
223
+ - @getvitops/generator@5.0.0
224
+ - @getvitops/utils@5.0.0
225
+ - @getvitops/core@5.0.0
226
+ - @getvitops/vite@5.0.0
227
+
228
+ ## 4.1.0
229
+
230
+ ### Minor Changes
231
+
232
+ - 2c890c0: Link a site to its ad properties: `site.ads`, `vitops ads`, and `<Ads />`.
233
+
234
+ `vitops search` covers the whole Search Console relationship. Nothing covered the equivalent one
235
+ with ad platforms, and a site's ad accounts had nowhere to live — so a Meta pixel pasted into a
236
+ template was invisible to the rest of the toolchain. It set `_fbp` on a site whose generated cookie
237
+ notice never mentioned it, whose consent gate never cleared it on revoke, and — for LinkedIn and
238
+ Pinterest — whose attribution never captured the click ID at all, so every conversion from those
239
+ platforms arrived indistinguishable from organic traffic.
240
+
241
+ **New `site.ads` block**, keyed by platform (`google`, `meta`, `linkedin`, `reddit`, `tiktok`,
242
+ `microsoft`, `pinterest`, `snapchat`):
243
+
244
+ ```jsonc
245
+ {
246
+ "site": {
247
+ "ads": {
248
+ "meta": { "pixelId": "123456789", "domainVerification": "abc123" },
249
+ "google": {
250
+ "accountId": "123-456-7890",
251
+ "pixelId": "AW-987654321",
252
+ "conversionLabel": "xyz",
253
+ },
254
+ },
255
+ },
256
+ }
257
+ ```
258
+
259
+ **`vitops ads setup`** ensures each platform's domain-verification DNS record. Only four platforms
260
+ verify a domain at all — Meta, TikTok, Pinterest and Snapchat, by apex DNS TXT — and that record is
261
+ the one thing created for you (in Cloudflare, via `CLOUDFLARE_API_TOKEN`; created only, never edited
262
+ or deleted). Google Ads, LinkedIn, Reddit and Microsoft Ads have no domain verification: linking
263
+ there is the tag and the account id, and the run says so rather than skipping in silence. No
264
+ platform Marketing API is called — Meta's needs a system-user token and Google's an approved
265
+ developer token with your own account on the line — so the final "Verify" click is surfaced as a
266
+ reminder. `--dry` prints the plan, `--check` reports drift and exits non-zero.
267
+
268
+ **It asks for what the config is missing.** A verification token does not exist until someone
269
+ fetches it from the platform UI, so a first run prompts for it, naming the exact UI path, folds the
270
+ answer into the plan and writes it to your config. The token is not a secret — it is published in
271
+ DNS, and the platform fetching it back is the ownership proof, exactly like the IndexNow key.
272
+ Prompting requires a TTY: with `--dry`, `--check`, `--no-prompt`, or in CI, you get a named error
273
+ instead and the run never hangs. `--no-write` keeps the answer out of the config.
274
+
275
+ **`vitops ads tags`** prints each pixel as an inert, consent-gated `<script>` — `type="text/plain"`
276
+ with the library URL on `data-src`, so an undecided visitor's page issues no third-party request.
277
+ For Bricks, WordPress, Eleventy: any stack without the Astro integration.
278
+
279
+ **`vitops ads lint`** reports the gaps that are invisible at runtime: a click ID the platform stamps
280
+ that attribution does not capture, a pixel while `site.tracking` is off, a property with no tag id.
281
+
282
+ **`<Ads />` in `@getvitops/astro`**, a sibling of `<Analytics />` rather than part of it — ad
283
+ properties come from the site config, state their own consent category (`marketing` by default,
284
+ rather than being derived), and switch per environment on their own
285
+ (`environments.<env>.ads`, defaulting to `analytics`, then true, so a preview deployment can send
286
+ pageviews without firing conversion pixels). Both components now render through one `<GatedTags />`,
287
+ so the inert markup has a single implementation.
288
+
289
+ **Your cookie notice now discloses every configured pixel** — name, cookies and opt-out — from the
290
+ same table that writes `data-consent-cookies`, so the notice and the revoke cannot disagree. If you
291
+ add `site.ads` to a config whose privacy policy or cookie notice you have already published,
292
+ re-generate and re-read them.
293
+
294
+ `li_fat_id` (LinkedIn) and `epik` (Pinterest) join the click-ID capture vocabulary; a site running
295
+ either platform starts attributing conversions it previously recorded as organic.
296
+
297
+ ### Patch Changes
298
+
299
+ - Updated dependencies [2c890c0]
300
+ - Updated dependencies [e764090]
301
+ - @getvitops/generator@4.1.0
302
+ - @getvitops/utils@4.1.0
303
+ - @getvitops/vite@4.1.0
304
+ - @getvitops/core@4.1.0
305
+
3
306
  ## 4.0.0
4
307
 
5
308
  ### Major Changes
package/README.md CHANGED
@@ -45,6 +45,28 @@ import Head from '@getvitops/astro/Head.astro';
45
45
  priority. It does **not** emit a stylesheet `<link>` — the integration imports the generated CSS into
46
46
  Astro's module graph and Astro emits that link itself.
47
47
 
48
+ ## Rendering mode
49
+
50
+ **Prefer `output: 'static'`** (Astro's default). Nothing this integration produces needs a server:
51
+ the CSS, favicons and web-component bundles are all build-time artifacts, and the components
52
+ progressively enhance markup that is already complete in the HTML. A static build also gives the
53
+ sitemap every route, since `@astrojs/sitemap` lists prerendered routes only.
54
+
55
+ Opt individual routes out with `export const prerender = false` where a page genuinely needs
56
+ per-request work — a form `POST` handler, an auth-gated page, per-visitor content. That needs an
57
+ adapter, but leaves the rest of the site static.
58
+
59
+ ```astro
60
+ ---
61
+ // src/pages/account.astro — server-rendered; every other page stays static
62
+ export const prerender = false;
63
+ ---
64
+ ```
65
+
66
+ **EmDash sites invert this**, because the CMS admin and API need a server: they run
67
+ `output: 'server'` and opt _into_ prerendering per route. See
68
+ [`@getvitops/emdash`](../emdash/README.md#rendering-mode).
69
+
48
70
  ## Options
49
71
 
50
72
  | option | default | does |
@@ -0,0 +1,3 @@
1
+ import { a as TRACKING_ENDPOINT } from "../tracking-DdEKExlE.mjs";
2
+ export * from "@getvitops/utils/tracking";
3
+ export { TRACKING_ENDPOINT };
@@ -0,0 +1,5 @@
1
+ import { n as TRACKING_ENDPOINT } from "../tracking-CmSfxWC3.mjs";
2
+
3
+ export * from "@getvitops/utils/tracking"
4
+
5
+ export { TRACKING_ENDPOINT };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,7 @@
1
+ import { i as TRACKING_COOKIE, n as ResolveTrackingContext, o as TrackingCategory, r as ResolvedTracking, s as resolveTracking, t as GetvitopsTrackingOptions } from "./tracking-DdEKExlE.mjs";
1
2
  import { LegalOutput, SiteFont, StylesheetFormat } from "@getvitops/generator";
2
3
  import { generateIconInclude } from "@getvitops/utils";
4
+ import { AdProvider } from "@getvitops/utils/ads";
3
5
  import { OutputKind } from "@getvitops/utils/media";
4
6
  import { AstroIntegration } from "astro";
5
7
  export * from "@getvitops/utils";
@@ -102,9 +104,22 @@ interface GetvitopsConsentOptions {
102
104
  /** Link the banner to the cookie notice (`vitops legal` renders one). */
103
105
  policyUrl?: string;
104
106
  }
105
- /** One tag, fully resolved. */
106
- interface ResolvedTag {
107
- key: 'googleAnalytics' | 'clarity' | 'matomo' | 'plausible';
107
+ /**
108
+ * A third-party tag, fully resolved — everything `<GatedTags />` needs to render
109
+ * one, with nothing left to decide.
110
+ *
111
+ * Shared by `<Analytics />` and `<Ads />` on purpose: the inert-markup rule
112
+ * (`type="text/plain"`, the URL on `data-src`, never a live `src`) is the whole
113
+ * consent gate, and it must have exactly one implementation. What differs between
114
+ * the two is where the tag comes from and who decides its category, which is why
115
+ * they have separate resolvers over one shape rather than one resolver over two
116
+ * vocabularies.
117
+ *
118
+ * `key` is left to each resolver: analytics keys are its four providers, ads keys
119
+ * are `AdProvider`. Widening it into one union here would let a provider from
120
+ * either side satisfy a check meant for the other.
121
+ */
122
+ interface GatedTag {
108
123
  /** The provider as a reader would recognise it — used in warnings. */
109
124
  provider: string;
110
125
  category: ConsentCategory;
@@ -123,6 +138,10 @@ interface ResolvedTag {
123
138
  src: string | null;
124
139
  attrs: Record<string, string>;
125
140
  }
141
+ /** One analytics tag. */
142
+ interface ResolvedTag extends GatedTag {
143
+ key: 'googleAnalytics' | 'clarity' | 'matomo' | 'plausible';
144
+ }
126
145
  interface ResolvedAnalytics {
127
146
  tags: ResolvedTag[];
128
147
  /** Does anything here need `@getvitops/core/consent` loaded? */
@@ -143,7 +162,7 @@ interface ResolveAnalyticsContext {
143
162
  */
144
163
  declare function resolveAnalytics(opts: GetvitopsAnalyticsOptions | undefined, ctx?: ResolveAnalyticsContext): ResolvedAnalytics;
145
164
  /** Which optional categories a set of tags actually needs a visitor to decide. */
146
- declare function consentCategories(tags: ResolvedTag[]): OptionalConsentCategory[];
165
+ declare function consentCategories(tags: GatedTag[]): OptionalConsentCategory[];
147
166
  //#endregion
148
167
  //#region src/seo.d.ts
149
168
  /**
@@ -324,57 +343,6 @@ interface SeoContext {
324
343
  */
325
344
  declare function resolveSeo(defaults: GetvitopsSeoOptions, props: SeoProps, ctx: SeoContext): ResolvedSeo;
326
345
  //#endregion
327
- //#region src/tracking.d.ts
328
- /**
329
- * The `<Tracking />` resolution layer — tracking config in, what to emit out.
330
- *
331
- * Separate from `Tracking.astro` for the same reason `analytics.ts` is separate
332
- * from `Analytics.astro`: everything decidable is a pure function asserted in
333
- * `tracking.test.ts`, and the component only renders what this returns.
334
- *
335
- * The one decision here is **which consent category the `_ac` cookie waits on**,
336
- * and it is stated rather than inferred. `_ac` is a 90-day identifier tying a
337
- * visitor to the ad that brought them, so `marketing` is the default — but a site
338
- * using click IDs purely for its own campaign reporting may reasonably file it
339
- * under `analytics`, and that is the consumer's call to make, not ours to guess.
340
- */
341
- /** Which consent category the attribution cookie waits on. */
342
- type TrackingCategory = 'marketing' | 'analytics';
343
- interface GetvitopsTrackingOptions {
344
- /** Capture ad click IDs and UTMs into `_ac`. */
345
- enabled?: boolean;
346
- /** Default `marketing`. */
347
- category?: TrackingCategory;
348
- /** Informational; capture recognises every known click-ID parameter regardless. */
349
- platforms?: string[];
350
- }
351
- /** The cookie the capture script writes. Mirrors `TRACKING_COOKIE` in utils. */
352
- declare const TRACKING_COOKIE = "_ac";
353
- interface ResolvedTracking {
354
- enabled: boolean;
355
- category: TrackingCategory;
356
- /** Cookie names to clear on revoke — rides on `data-consent-cookies`. */
357
- cookies: string[];
358
- /** Configuration problems, as prose. The integration logs these. */
359
- warnings: string[];
360
- }
361
- interface ResolveTrackingContext {
362
- /** Is the consent gate enabled on this site (`vitops({ consent })`)? */
363
- consent?: boolean;
364
- /** Categories the banner offers, so we can catch a demand with no row. */
365
- consentCategories?: readonly string[];
366
- }
367
- /**
368
- * Resolve the tracking config into what the component emits.
369
- *
370
- * Two warnings, both about the same failure — a persistent identifier written
371
- * with no way for the visitor to decline, or a permission asked for with no way
372
- * to answer. Returned as data rather than logged here so the check is a test
373
- * rather than a line someone might scroll past, exactly as `resolveAnalytics`
374
- * does.
375
- */
376
- declare function resolveTracking(opts: GetvitopsTrackingOptions | undefined, ctx?: ResolveTrackingContext): ResolvedTracking;
377
- //#endregion
378
346
  //#region src/integration.d.ts
379
347
  interface GetvitopsFaviconOptions {
380
348
  /** Source SVG or PNG. */
@@ -784,6 +752,48 @@ interface GetvitopsIconsOptions {
784
752
  }
785
753
  declare function vitops(opts?: GetvitopsOptions): AstroIntegration;
786
754
  //#endregion
755
+ //#region src/ads.d.ts
756
+ /**
757
+ * One ad property, mirroring a `site.ads` entry field for field.
758
+ *
759
+ * Structural rather than `SiteAdProperty` imported from the generator, matching
760
+ * how `GetvitopsSeoOptions` and `GetvitopsTrackingOptions` already work: the
761
+ * component surface must stay usable by a consumer who passes a plain object.
762
+ */
763
+ interface GetvitopsAdProperty {
764
+ accountId?: string;
765
+ pixelId?: string;
766
+ conversionLabel?: string;
767
+ /** Default `marketing`. `analytics` for a property used purely for measurement. */
768
+ category?: 'marketing' | 'analytics';
769
+ /** False keeps the property on record without emitting its tag. */
770
+ enabled?: boolean;
771
+ }
772
+ type GetvitopsAdsOptions = Partial<Record<AdProvider, GetvitopsAdProperty>>;
773
+ /** One ad tag. `key` is the platform, so a caller can find one without matching prose. */
774
+ interface ResolvedAdTag extends GatedTag {
775
+ key: AdProvider;
776
+ }
777
+ interface ResolvedAds {
778
+ tags: ResolvedAdTag[];
779
+ /** Does anything here need `@getvitops/core/consent` loaded? */
780
+ needsRuntime: boolean;
781
+ /** Configuration problems, as prose. The integration logs these. */
782
+ warnings: string[];
783
+ }
784
+ interface ResolveAdsContext {
785
+ /** Is the consent gate enabled on this site (`vitops({ consent })`)? */
786
+ consent?: boolean;
787
+ /** Categories the banner offers, so we can catch a demand with no row. */
788
+ consentCategories?: readonly string[];
789
+ /** `environments.<env>.ads` — false switches every tag off for this build. */
790
+ enabled?: boolean;
791
+ /** When the tags load. Default `idle`: a pixel is never worth the critical path. */
792
+ strategy?: AnalyticsStrategy;
793
+ }
794
+ /** Resolve the configured ad properties into the tags `<Ads />` emits. */
795
+ declare function resolveAds(ads: GetvitopsAdsOptions | undefined, ctx?: ResolveAdsContext): ResolvedAds;
796
+ //#endregion
787
797
  //#region src/lastmod.d.ts
788
798
  interface GitLastmodOptions {
789
799
  /** Directories to read history from (default `src/pages`, `src/content`, `src/data`). */
@@ -813,5 +823,5 @@ declare function slugFromContent(file: string): string | undefined;
813
823
  */
814
824
  declare function gitLastmod(options?: GitLastmodOptions): Promise<(item: GetvitopsSitemapEntry) => GetvitopsSitemapEntry>;
815
825
  //#endregion
816
- export { type AnalyticsStrategy, type ClarityOptions, type ConsentCategory, type GetvitopsAnalyticsOptions, type GetvitopsConsentOptions, type GetvitopsCssOptions, type GetvitopsFaviconOptions, type GetvitopsMediaOptions, type GetvitopsOptions, type GetvitopsSeoOptions, type GetvitopsSitemapChangeFreq, type GetvitopsSitemapEntry, type GetvitopsSitemapOptions, type GetvitopsTrackingOptions, type GitLastmodOptions, type GoogleAnalyticsOptions, type MatomoOptions, type OptionalConsentCategory, type PlausibleOptions, type ResolveAnalyticsContext, type ResolveTrackingContext, type ResolvedAnalytics, type ResolvedSeo, type ResolvedTag, type ResolvedTracking, type SeoContext, type SeoNameTag, type SeoOgType, type SeoPropertyTag, type SeoProps, type SeoTwitterCard, TRACKING_COOKIE, type TrackingCategory, consentCategories, vitops as default, gitLastmod, resolveAnalytics, resolveSeo, resolveTracking, routeFromPage, slugFromContent };
826
+ export { type AnalyticsStrategy, type ClarityOptions, type ConsentCategory, type GatedTag, type GetvitopsAdProperty, type GetvitopsAdsOptions, type GetvitopsAnalyticsOptions, type GetvitopsConsentOptions, type GetvitopsCssOptions, type GetvitopsFaviconOptions, type GetvitopsMediaOptions, type GetvitopsOptions, type GetvitopsSeoOptions, type GetvitopsSitemapChangeFreq, type GetvitopsSitemapEntry, type GetvitopsSitemapOptions, type GetvitopsTrackingOptions, type GitLastmodOptions, type GoogleAnalyticsOptions, type MatomoOptions, type OptionalConsentCategory, type PlausibleOptions, type ResolveAdsContext, type ResolveAnalyticsContext, type ResolveTrackingContext, type ResolvedAdTag, type ResolvedAds, type ResolvedAnalytics, type ResolvedSeo, type ResolvedTag, type ResolvedTracking, type SeoContext, type SeoNameTag, type SeoOgType, type SeoPropertyTag, type SeoProps, type SeoTwitterCard, TRACKING_COOKIE, type TrackingCategory, consentCategories, vitops as default, gitLastmod, resolveAds, resolveAnalytics, resolveSeo, resolveTracking, routeFromPage, slugFromContent };
817
827
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/analytics.ts","../src/seo.ts","../src/tracking.ts","../src/integration.ts","../src/lastmod.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/analytics.ts","../src/seo.ts","../src/integration.ts","../src/ads.ts","../src/lastmod.ts"],"mappings":"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"}