@getvitops/astro 2.0.0 → 3.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,306 @@
1
1
  # @getvitops/astro
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 6e68ace: **Breaking:** the site config is now a three-section `Config` — `designSystem`,
8
+ `organization`, `site`.
9
+
10
+ The flat `SiteConfig` held the company (`organization`, `contact`, `locations`) and the
11
+ deployment (`analytics`, `environments`, `seo`, `legal`) as peers, so no single noun
12
+ described it, and a second site sharing the same company had no way to say so. The three
13
+ sections split those apart: several sites can now carry one `organization` and differ only
14
+ in `site`.
15
+
16
+ **Migrating.** `designSystem` stays at the root, and the fields already under
17
+ `organization` stay where they are. Everything else moves into one of two sections:
18
+ - → `site`: `defaultLocale`, `locales`, `domains`, `dns`, `cloudflare`, `environments`,
19
+ `abTesting`, `fonts`, `tags`, `postTypes`, `galleries`, `testimonials`, `templates`,
20
+ `navigation`, `seo`, `analytics`, `notifications`, `tracking`, `security`, `legal`,
21
+ `icons`, `favicon`, `deployment`
22
+ - → `organization`: `contact`, `primaryLocation`, `locations`, `services`, `links`
23
+
24
+ You do not have to work this out from the list: `vitops validate` detects a pre-3.0 flat
25
+ config and prints every move by name, rather than reporting a dozen unknown keys.
26
+
27
+ ```jsonc
28
+ {
29
+ "designSystem": {
30
+ "themes": {
31
+ "default": {
32
+ /* … */
33
+ },
34
+ },
35
+ },
36
+ "organization": {
37
+ "name": "Acme",
38
+ "contact": "hq",
39
+ "locations": {
40
+ "hq": {
41
+ /* … */
42
+ },
43
+ },
44
+ },
45
+ "site": {
46
+ "defaultLocale": "en",
47
+ "domains": {
48
+ /* … */
49
+ },
50
+ "analytics": {
51
+ /* … */
52
+ },
53
+ },
54
+ }
55
+ ```
56
+
57
+ **Renamed exports** (`@getvitops/generator`): `SiteConfigSchema` → `ConfigSchema`,
58
+ `SiteConfig` → `Config`, `validateSite` → `validateConfig`, `resolveSiteConfig` →
59
+ `resolveConfig`, `isSiteConfig` → `isConfig`, `siteJsonSchema` → `configJsonSchema`,
60
+ `SITE_SCHEMA_URL` → `CONFIG_SCHEMA_URL`, `SiteValidationResult` →
61
+ `ConfigValidationResult`. `ResolvedInput.site` is now `ResolvedInput.config`. New:
62
+ `OrganizationConfig` and `SiteSection` for the two sections.
63
+
64
+ **Renamed schema file:** `@getvitops/generator/site.schema.json` →
65
+ `@getvitops/generator/config.schema.json`. Update the `$schema` key in your config.
66
+
67
+ Option names are unchanged — `vitops({ site: { input } })`, the Vite plugin's `site`,
68
+ and `generate({ site })` still point at the config file.
69
+
70
+ **The Astro integration is now `vitops()`, not `getvitops()`.** It is a default export,
71
+ so the name is yours and nothing breaks on upgrade, but every example now reads
72
+ `import vitops from '@getvitops/astro'` — matching the Vite plugin, which has always been
73
+ `vitops`. The `@getvitops/*` package scope and the internal `virtual:getvitops/*` module
74
+ ids are unchanged; neither is an import name.
75
+
76
+ **Added:** a generated config authoring reference — `vitops docs config`, `docs/config.md`
77
+ in the OKF bundle, and _Config reference_ on the docs site. It is walked from the published
78
+ JSON Schema by the same helper that renders the `design-system.json` reference, so it
79
+ cannot describe a field validation does not accept.
80
+
81
+ - b115993: Nav shells, a top-layer animation driver, and a pile of fixes to things that never worked
82
+
83
+ ### Breaking
84
+ - **Two custom elements renamed.** `<copy-button>` → `<wc-copy>`, `<multi-field>` →
85
+ `<wc-multifield>`. Update your markup. The Bricks element keys
86
+ (`vitops-copy-button`, `vitops-multi-field`) are **unchanged**, so elements already
87
+ placed on a Bricks page keep working; so are the `--multi-field-*` custom properties
88
+ and the `multi-field-*` events.
89
+ - **`<details>` now animates open and closed** where `prefers-reduced-motion` allows.
90
+ It was previously instant by deliberate choice — the transition used to deadlock the
91
+ disclosure shut. Re-verified on Chrome 149 with a real click; both `block-size` and
92
+ `content-visibility` must stay in the transition list, and dropping the latter
93
+ reproduces the deadlock.
94
+ - **Drawers and dialogs now animate on close.** Both drove their entry with
95
+ `animation:` on `[open]`, which by construction plays once — so the close was
96
+ instant. They now use the top-layer driver and animate both ways.
97
+ - **`.rhythm` gives every non-heading block heading-spacing before a heading.** The
98
+ pairs used to enumerate `p` (later `p, pre, blockquote, table, dl, ul, ol`), so a
99
+ heading after anything else got paragraph spacing. They are now defined by what a
100
+ heading _is_ — `h1`–`h6` plus the `font-display` / `font-title` / `font-heading` type
101
+ roles — and inverted to `:not(<heading>) + <heading>`. Expect slightly more space
102
+ above headings that follow a code block, table, figure-like `<div>` or component.
103
+ - **`popover.css` no longer pins `[popover]:popover-open { opacity: 1 }`.** It never
104
+ animated anything on its own, but it outranked `.transition` and made every
105
+ top-layer fade impossible. Removing it is what lets the driver work.
106
+ - **`nav.css`'s `.drawer-menu` timing** now follows `--animation-duration` /
107
+ `--custom-ease-out` instead of hand-set 0.4s / 0.7s.
108
+
109
+ ### Fixed
110
+ - **`.sitenav--bp-sm` dropdowns could never open.** Its desktop block had drifted onto
111
+ an older markup shape, selecting `.sitenav__disclosure > .sitenav__submenu` where the
112
+ submenu is the disclosure's _sibling_. The four "intentionally parallel" breakpoint
113
+ blocks are now one shared block behind a style query — `md`/`lg`/`xl` were
114
+ byte-identical and only `sm` had rotted, which is exactly the drift the arrangement
115
+ invited. 583 → 361 lines.
116
+ - **Hover dropdowns rendered off-screen.** A closed popover is not in the top layer but
117
+ keeps the UA's `position: fixed`, and `.dropdown--show-on-hover` reset only `inset` —
118
+ so the panel faithfully faded in ~3300px from its trigger. Now anchored to it, and it
119
+ follows on scroll. Affects `.split-link--show-on-hover` too.
120
+ - **Horizontal overflow on narrow screens.** `.centered > *` floors at
121
+ `min-inline-size: 0`; `body` gets `overflow-wrap: break-word`; `patterns/code.css`
122
+ gains the `pre` rules it never had (`max-inline-size: 100%`, `overflow-x: auto`) and
123
+ gives inline `<code>` `overflow-wrap: anywhere`. Note a scroll container does _not_
124
+ zero its min-content contribution in Chrome, which is what made a single `<pre>` hold
125
+ a 390px viewport open at 797px.
126
+ - **`.split-<a>-<b>` now publishes `--_flex-direction: row`.** Only `.flex-*` did, so
127
+ `class="split flex-col md-split-1-2"` left the variable reading `column` at every
128
+ width and a nested `.grouped` collapsed its borders on the wrong axis.
129
+ - **`.toc-layout` uses `minmax(0, 1fr)`** instead of a bare `1fr`, whose automatic
130
+ minimum is min-content.
131
+
132
+ ### Added
133
+ - **`patterns/navshell.css` + `<NavShell>` / `<NavShellToggle>`** — a navigation aside
134
+ beside content at width, collapsing to a toggle and drawer below it. **It nests**: a
135
+ site nav wrapping an on-this-page nav, each promoting at its own breakpoint, via a
136
+ style query on an inherited flag rather than four copied blocks. Its content column
137
+ is a container, so an inner shell measures the space it actually has. The toggle can
138
+ live outside the shell (a site header) with `toggle="external"`.
139
+ - **`patterns/navbar.css`** — `.navbar` extracted from `nav.css`, where it was only
140
+ half of that file's drawer⇄navbar pair, plus `--start` / `--center` / `--end`,
141
+ `__spacer` and `--sticky` (old `.navbar-sticky` aliased).
142
+ - **A top-layer animation driver.** `animation.css` gained the fourth driver alongside
143
+ `animate-view` / `animate-scroll` / `animate-trigger` / `transition`, and every effect
144
+ gained an `open-<fx>` state variant. Overlays now state _where they start_
145
+ (`--translate-x-from`) instead of owning a keyframe: `class="drawer drawer--right
146
+ open-fade-in"` composes slide and fade. Applied at zero specificity with identity
147
+ defaults, so a popover that sets no effect vars is unchanged.
148
+ - **One scrim.** `--scrim` / `--scrim-filter` tokens and `.no-scrim` in `popover.css`,
149
+ replacing 18 `::backdrop` blocks across seven partials. `.drawer--modeless` is aliased.
150
+ - **`<wc-marquee>`** — clones the content enough times to cover the track, so every gap
151
+ matches including the seam. The CSS-only `.marquee` is unchanged and still works
152
+ without it; the element only makes the spacing right. `--marquee-gap` added.
153
+ - **`--width-nav`** joins `--width-measure` / `-breakout` / `-spotlight` as the nav
154
+ column width.
155
+ - **`.skip-link`** in `patterns/anchor-link.css`, using a clip rather than the
156
+ `-100vw` idiom (which overflows in RTL and ignores the scrollbar gutter).
157
+ - **`.table-wrapper`** documented as the scroll wrapper for wide tables.
158
+
159
+ ### Notes
160
+ - `patterns/nav.css` is marked legacy. Its header promised a Lit nav component that was
161
+ never written and is not planned — the house pattern is native. Use `navbar`,
162
+ `sitenav` or `navshell`; removal is a later change.
163
+ - `scroll-target.css`'s `.is-current` no longer claims to be a JS scroll-spy fallback.
164
+ There is no such code; `:target-current` is the only working highlight, which today
165
+ means Chrome.
166
+ - `elements.js` gains one element (`wc-marquee`), so the shared bundle is slightly
167
+ larger for every consumer.
168
+ - A registered custom property's `initial-value` must be computationally independent —
169
+ `16rem` is not, so `@property` silently drops the whole rule. `navshell` uses an
170
+ inline fallback instead.
171
+
172
+ ### Patch Changes
173
+
174
+ - Updated dependencies [6e68ace]
175
+ - Updated dependencies [b115993]
176
+ - @getvitops/generator@3.0.0
177
+ - @getvitops/utils@3.0.0
178
+ - @getvitops/core@3.0.0
179
+ - @getvitops/vite@3.0.0
180
+
181
+ ## 2.1.0
182
+
183
+ ### Minor Changes
184
+
185
+ - 20e518e: Add `vitops indexing` — tell search engines about a deploy, instead of opening Search Console by hand.
186
+
187
+ Configure it in your site config under `seo.indexing`, then run it after deploying:
188
+
189
+ ```jsonc
190
+ "seo": {
191
+ "indexing": {
192
+ "indexNow": { "key": "…" },
193
+ "searchConsole": { "siteUrl": "sc-domain:acme.ca" },
194
+ "priorityUrls": ["https://acme.ca/", "https://acme.ca/services"]
195
+ }
196
+ }
197
+ ```
198
+
199
+ ```
200
+ vitops indexing --dry # print the plan, make no requests
201
+ vitops indexing # submit
202
+ vitops indexing --check # a day or two later: did Google actually index them?
203
+ ```
204
+
205
+ It reads your sitemap, diffs it against the previous run, and submits only what changed —
206
+ pinging **IndexNow** and re-submitting your sitemap through the **Search Console API**.
207
+ `--check` inspects `priorityUrls` and exits non-zero on a page Google hasn't indexed, so a
208
+ scheduled CI job can catch a page that quietly fell out of the index.
209
+
210
+ **Be clear-eyed about what this can do.** Google exposes no API that requests indexing — the
211
+ button in Search Console isn't available anywhere, URL Inspection is read-only, and the sitemap
212
+ ping endpoint was removed in 2023. IndexNow reaches Bing, Yandex, Naver, Seznam and Yep; Google
213
+ doesn't participate. So this automates every sanctioned step and then verifies the outcome; it
214
+ does not make Google re-index on demand, and nothing can. Google's Indexing API is deliberately
215
+ not wired: it's scoped to job postings and livestreams, and using it for ordinary pages violates
216
+ its terms.
217
+
218
+ Also new, and worth wiring at the same time — **`gitLastmod()` for real sitemap dates**:
219
+
220
+ ```js
221
+ import vitops, { gitLastmod } from '@getvitops/astro';
222
+ vitops({ sitemap: { serialize: await gitLastmod() } });
223
+ ```
224
+
225
+ `@astrojs/sitemap` emits no `<lastmod>` by default, which means a crawler is told your pages
226
+ exist but never that one changed — and it's what lets `vitops indexing` submit a handful of URLs instead
227
+ of all of them. `gitLastmod()` derives each date from the source file's last commit, and leaves a
228
+ page alone rather than guessing (dynamic routes, ambiguous slugs, shallow clones): an inaccurate
229
+ `lastmod` is worse than none, because Google stops trusting the field site-wide.
230
+
231
+ Requires `fetch-depth: 0` in CI — the default shallow clone has no history to read, and it warns
232
+ when that's the case.
233
+
234
+ **Credentials.** IndexNow's key is public by design (it's served at `/<key>.txt` as the ownership
235
+ proof), so it lives in your config, and the Astro integration writes the file into `public/` for
236
+ you — `vitops indexing --new-key` generates one, `--write-key <dir>` writes it for non-Astro stacks.
237
+ Search Console needs a service account in `VITOPS_GSC_SERVICE_ACCOUNT` or
238
+ `GOOGLE_APPLICATION_CREDENTIALS`, added as an owner of the property; it's never read from the
239
+ config file.
240
+
241
+ Persist `.vitops/` between runs (a CI cache) — that's the changed-URL state, and without it every
242
+ run submits everything.
243
+
244
+ An environment whose `robots` policy says `noindex` is refused outright, so pointing this at
245
+ staging can't publish it to a search engine.
246
+
247
+ - 9bf975a: Add `vitops media` — encode raw video into web-ready outputs, instead of hand-rolling an ffmpeg
248
+ script per project.
249
+
250
+ Keep unprocessed video in a `raw/` directory and run:
251
+
252
+ ```
253
+ vitops media --raw raw --out src/assets/processed
254
+ ```
255
+
256
+ Each source becomes three files: **VP9/WebM**, an **H.264/MP4** fallback, and a **JPG poster**.
257
+ Import them like any other asset, so your bundler content-hashes them:
258
+
259
+ ```astro
260
+ ---
261
+ import hero from '../assets/processed/hero.webm';
262
+ import poster from '../assets/processed/hero.jpg';
263
+ ---
264
+ <video poster={poster.src} autoplay muted loop playsinline>
265
+ <source src={hero} type="video/webm" />
266
+ </video>
267
+ ```
268
+
269
+ In Astro it's an integration option — `vitops({ css, media: { raw: 'raw', out: 'src/assets/processed' } })`
270
+ — and it runs in the same pass that generates your CSS. `@getvitops/vite` gains a matching `media`
271
+ option, and `@getvitops/utils/media` exports `processMedia()` for anything else.
272
+
273
+ Defaults: capped at 1920px wide, CRF 32, audio dropped (the common case is a muted autoplay loop),
274
+ poster from frame 0. All of them are flags. `--dry` prints exactly what a run would do.
275
+
276
+ **Runs are cached**, on source content plus encode settings, in `.vitops/media-manifest.json` — a
277
+ 24 MB clip that took 88 seconds the first time takes 0.14 seconds the second. A missing output
278
+ re-encodes; a corrupt manifest re-encodes everything. Neither ever reads as "already done", because
279
+ that failure is silent and no rebuild would fix it.
280
+
281
+ **Commit the outputs and the manifest.** A fresh CI clone has neither and would re-encode from
282
+ scratch; committing both means CI never needs ffmpeg. It also keeps your history clean — ffmpeg
283
+ output isn't byte-reproducible across versions, so a CI re-encode would rewrite every video on any
284
+ toolchain bump. Use `--force` when you mean to re-encode.
285
+
286
+ **`ffmpeg` is an external tool, not an npm dependency** — install it yourself (`brew install
287
+ ffmpeg`, `apt install ffmpeg`, `winget install Gyan.FFmpeg`). The command fails without it rather
288
+ than skipping: a page referencing a video that was never encoded is broken, not degraded.
289
+
290
+ Two defaults worth knowing about. The MP4 exists because older iOS and the in-app webviews inside
291
+ social apps still don't decode VP9, and it's written with `+faststart` — without which a browser
292
+ downloads the whole file before showing frame one. And a poster taken from frame 0 is often black
293
+ on a clip that fades in; that's `--poster-time`, not a bug.
294
+
295
+ ### Patch Changes
296
+
297
+ - Updated dependencies [20e518e]
298
+ - Updated dependencies [9bf975a]
299
+ - @getvitops/generator@2.1.0
300
+ - @getvitops/utils@2.1.0
301
+ - @getvitops/vite@2.1.0
302
+ - @getvitops/core@2.1.0
303
+
3
304
  ## 2.0.0
4
305
 
5
306
  ### Minor Changes
package/README.md CHANGED
@@ -57,6 +57,7 @@ Astro's module graph and Astro emits that link itself.
57
57
  | `css.inject` | `true` | inject the stylesheet into every SSR page |
58
58
  | `webComponents` | `true` | copy + link the web-component bundles |
59
59
  | `favicon` | off unless given | `source`, `lowResSource`, `name`, `themeColor`, `backgroundColor` |
60
+ | `media` | off unless given | encode raw video to WebM + MP4 + poster (needs `css`, `ffmpeg`) |
60
61
  | `sitemap` | off unless given | generate `sitemap-index.xml` via `@astrojs/sitemap` |
61
62
  | `seo` | off unless given | site-level defaults for `<Seo />` |
62
63
  | `analytics` | off unless given | providers for `<Analytics />` (GA4, Clarity, Matomo, Plausible) |
@@ -71,6 +72,55 @@ Set `css.inject: false` when another integration adds routes that must not inher
71
72
  (e.g. EmDash's `/_emdash/admin`) — then import the generated file (`<out>/tailwind.css` or
72
73
  `<out>/styles.css`) from your own layout, so only your pages are styled.
73
74
 
75
+ ## Video
76
+
77
+ `media` encodes everything in a `raw/` directory into VP9/WebM, an H.264/MP4 fallback, and a JPG
78
+ poster frame:
79
+
80
+ ```js
81
+ vitops({
82
+ css: { format: 'css' },
83
+ media: { raw: 'raw', out: 'src/assets/processed' },
84
+ });
85
+ ```
86
+
87
+ Import the results like any other asset, so Vite content-hashes them:
88
+
89
+ ```astro
90
+ ---
91
+ import hero from '../assets/processed/hero.webm';
92
+ import poster from '../assets/processed/hero.jpg';
93
+ ---
94
+ <video poster={poster.src} autoplay muted loop playsinline>
95
+ <source src={hero} type="video/webm" />
96
+ </video>
97
+ ```
98
+
99
+ Outputs go under `src/` for that hashing; the raw sources stay outside anything Vite scans.
100
+
101
+ **`ffmpeg` is an external tool — install it yourself:** `brew install ffmpeg`,
102
+ `apt install ffmpeg`, `winget install Gyan.FFmpeg`. Without it the build fails with a message
103
+ telling you so, rather than quietly shipping a page that points at a video nobody encoded.
104
+
105
+ Four things are deliberate:
106
+
107
+ - **Commit the outputs and `.vitops/media-manifest.json`.** Encoding is cached on source content
108
+ plus settings, so a rebuild costs a hash per file — but a fresh CI clone has neither and would
109
+ re-encode everything. Committing both means CI never runs ffmpeg. It also keeps history clean:
110
+ ffmpeg output isn't reproducible across versions, so a CI re-encode rewrites every video on any
111
+ toolchain bump.
112
+ - **The raw directory isn't watched.** It runs on build and on a config change, not on a file
113
+ appearing mid-`astro dev` — a multi-minute encode stalling your dev server is a worse trade than
114
+ a restart. Drop a video in and restart, or run `npx vitops media`.
115
+ - **An MP4 sits beside the WebM on purpose.** Older iOS and the in-app webviews inside social apps
116
+ still don't decode VP9. The MP4 is written with `+faststart`, without which the browser
117
+ downloads the whole file before showing frame one.
118
+ - **Audio is dropped by default.** The common case is a muted autoplay loop, where the audio track
119
+ is bytes nobody will ever hear. `media: { audio: true }` keeps it.
120
+
121
+ Needs `css`, since the encoding runs in the Vite plugin `css` registers — it warns if you set one
122
+ without the other. For any other stack, `npx vitops media` does the same job with no integration.
123
+
74
124
  ## Sitemap
75
125
 
76
126
  `sitemap: true` registers the official [`@astrojs/sitemap`](https://docs.astro.build/en/guides/integrations-guide/sitemap/)
@@ -97,6 +147,33 @@ content _and_ hand-authored `.astro` pages), add `sitemap()` to your own `integr
97
147
  vitops detects that too and leaves yours in charge, which is also how you reach the handful of
98
148
  `@astrojs/sitemap` options this integration doesn't mirror.
99
149
 
150
+ ### Real `<lastmod>` dates
151
+
152
+ A sitemap without `<lastmod>` tells a crawler a page exists but never that it changed. `gitLastmod()`
153
+ stamps each entry from its source file's last commit:
154
+
155
+ ```js
156
+ import vitops, { gitLastmod } from '@getvitops/astro';
157
+
158
+ export default defineConfig({
159
+ site: 'https://acme.ca',
160
+ integrations: [vitops({ sitemap: { serialize: await gitLastmod() } })],
161
+ });
162
+ ```
163
+
164
+ It maps file-based routes exactly (`src/pages/about.astro` → `/about`) and content entries by unique
165
+ slug. Three deliberate refusals, all of the same kind — **no date beats a wrong one**, because Google
166
+ weighs `lastmod` only while it stays consistent with what actually changed:
167
+
168
+ - **Dynamic routes get nothing.** One `[slug].astro` backs many URLs; its commit date describes the
169
+ template, not any page.
170
+ - **An ambiguous slug gets nothing** rather than a coin flip presented as a fact.
171
+ - **A shallow clone gets nothing, loudly.** It shells out to `git`, so `fetch-depth: 1` (the
172
+ actions/checkout default) yields no history — it warns and emits no dates. Set `fetch-depth: 0`.
173
+
174
+ This is also what makes `vitops indexing` able to submit only what changed, rather than everything on
175
+ every deploy.
176
+
100
177
  ## `<Seo />`
101
178
 
102
179
  Page metadata: `<title>`, description, canonical, Open Graph, Twitter cards, robots, `article:*`,
@@ -286,7 +363,7 @@ Behaviour worth knowing:
286
363
  ### Keep it in step with your cookie notice
287
364
 
288
365
  `vitops legal` derives the privacy policy and cookie notice from your **site config**, and
289
- `getvitops({ analytics })` is a separate surface. Declare each provider in both:
366
+ `vitops({ analytics })` is a separate surface. Declare each provider in both:
290
367
 
291
368
  ```jsonc
292
369
  // site config — what the documents disclose
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { LegalOutput, SiteFont, StylesheetFormat } from "@getvitops/generator";
2
2
  import { generateIconInclude } from "@getvitops/utils";
3
+ import { OutputKind } from "@getvitops/utils/media";
3
4
  import { AstroIntegration } from "astro";
4
5
  export * from "@getvitops/utils";
5
6
 
@@ -130,7 +131,7 @@ interface ResolvedAnalytics {
130
131
  warnings: string[];
131
132
  }
132
133
  interface ResolveAnalyticsContext {
133
- /** Is the consent gate enabled on this site (`getvitops({ consent })`)? */
134
+ /** Is the consent gate enabled on this site (`vitops({ consent })`)? */
134
135
  consent?: boolean;
135
136
  }
136
137
  /**
@@ -161,11 +162,11 @@ type SeoTwitterCard = 'summary' | 'summary_large_image' | 'app' | 'player';
161
162
  /** Open Graph object types this component knows how to describe. */
162
163
  type SeoOgType = 'website' | 'article' | 'profile';
163
164
  /**
164
- * Site-level SEO defaults, passed to `getvitops({ seo })` and baked into the
165
+ * Site-level SEO defaults, passed to `vitops({ seo })` and baked into the
165
166
  * `virtual:getvitops/head` module. Per-page `<Seo />` props override these.
166
167
  *
167
168
  * The vocabulary mirrors the site-config schema's `seo` block
168
- * (`@getvitops/generator`, `src/site.ts`) so a `SiteConfig` → these adapter would
169
+ * (`@getvitops/generator`, `src/config.ts`) so a `Config` → these adapter would
169
170
  * be a flat field map — but it is not imported from there. This is the
170
171
  * integration's own option surface, and it must stay JSON-serialisable: it is
171
172
  * `JSON.stringify`d into the virtual module, so no functions, no `URL`s, no dates.
@@ -334,6 +335,32 @@ interface GetvitopsFaviconOptions {
334
335
  themeColor?: string;
335
336
  backgroundColor?: string;
336
337
  }
338
+ /**
339
+ * Video encoding. A sibling of `favicon`, not a widening of `css`.
340
+ *
341
+ * Mirrors `VitopsMediaOptions` in `@getvitops/vite`, which is where it runs — see
342
+ * the `media` field on `GetvitopsOptions` for why.
343
+ */
344
+ interface GetvitopsMediaOptions {
345
+ /** Directory of unprocessed video, walked recursively. Default: `'raw'`. */
346
+ raw?: string;
347
+ /** Where encoded outputs go. Default: `'src/assets/processed'`. */
348
+ out?: string;
349
+ /** Cap the output width, keeping aspect ratio. Default 1920; 0 disables. */
350
+ maxWidth?: number;
351
+ /** Quality on VP9's CRF scale (0–63, lower is better). Default 32. */
352
+ crf?: number;
353
+ /** Optional bitrate ceiling, e.g. `'2M'`. Absent means constant quality. */
354
+ maxBitrate?: string;
355
+ /** Keep the audio track. Default false — the common case is a muted loop. */
356
+ audio?: boolean;
357
+ /** Timestamp (seconds) the poster frame comes from. Default 0. */
358
+ posterTime?: number;
359
+ /** Which outputs to produce. Default: webm, mp4 and a poster. */
360
+ outputs?: OutputKind[];
361
+ /** Cache file. Default `.vitops/media-manifest.json`. */
362
+ manifest?: string;
363
+ }
337
364
  interface GetvitopsCssOptions {
338
365
  /**
339
366
  * Path to the config (default `'design-system.json'`).
@@ -379,7 +406,7 @@ interface GetvitopsCssOptions {
379
406
  *
380
407
  * The site config's `designSystem.defaultColorScheme: "system"` says the same thing and is the
381
408
  * better home for it when you have one — this option wins if both are set, and
382
- * exists because requiring a whole `SiteConfig` to set one boolean would be out
409
+ * exists because requiring a whole `Config` to set one boolean would be out
383
410
  * of proportion.
384
411
  */
385
412
  systemColorScheme?: boolean;
@@ -471,7 +498,7 @@ interface GetvitopsOptions {
471
498
  /**
472
499
  * Your site config — the one place to name it.
473
500
  *
474
- * A `SiteConfig` records site-level facts, several of which other options here
501
+ * A `Config` records site-level facts, several of which other options here
475
502
  * need: `designSystem.defaultColorScheme` decides whether the generated colour layer
476
503
  * carries a `prefers-color-scheme` block, `fonts` can supply the webfont
477
504
  * declarations, and `legal` renders from it. Set this and each of those reads
@@ -482,6 +509,30 @@ interface GetvitopsOptions {
482
509
  */
483
510
  site?: GetvitopsSiteOptions;
484
511
  favicon?: GetvitopsFaviconOptions;
512
+ /**
513
+ * Encode raw video into WebM + an MP4 fallback + a poster frame.
514
+ *
515
+ * Import the results like any other asset, so Vite content-hashes them:
516
+ *
517
+ * ```astro
518
+ * import hero from '../assets/processed/hero.webm';
519
+ * import poster from '../assets/processed/hero.jpg';
520
+ * <video poster={poster.src} autoplay muted loop playsinline>
521
+ * <source src={hero} type="video/webm" />
522
+ * </video>
523
+ * ```
524
+ *
525
+ * Cached on source content and encode settings, so a rebuild costs a hash per
526
+ * file rather than an encode. **Commit the outputs and
527
+ * `.vitops/media-manifest.json`** — ffmpeg output is not reproducible across
528
+ * versions, so re-encoding in CI churns the diff on every toolchain bump.
529
+ *
530
+ * Needs `ffmpeg` on PATH, and fails the build without it rather than skipping:
531
+ * a page referencing a video that was never encoded is broken, not degraded.
532
+ *
533
+ * Needs `css`, since it runs in the Vite plugin `css` registers.
534
+ */
535
+ media?: GetvitopsMediaOptions;
485
536
  /** Copy + link the web-component bundles (default true). */
486
537
  webComponents?: boolean;
487
538
  /** Generate + auto-inject the design-system CSS. Off unless provided. */
@@ -519,7 +570,7 @@ interface GetvitopsOptions {
519
570
  * `cssVariable` rather than at a literal stack the browser has no file for:
520
571
  *
521
572
  * ```js
522
- * getvitops({ fonts: [{ name: 'League Spartan', provider: 'fontsource',
573
+ * vitops({ fonts: [{ name: 'League Spartan', provider: 'fontsource',
523
574
  * cssVariable: '--font-league-spartan',
524
575
  * weights: ['100 900'], subsets: ['latin'], preload: true }] })
525
576
  * ```
@@ -665,7 +716,36 @@ interface GetvitopsIconsOptions {
665
716
  /** Aliases applied before the semantic map — legacy names, or values stored in CMS content. */
666
717
  overrides?: Record<string, string>;
667
718
  }
668
- declare function getvitops(opts?: GetvitopsOptions): AstroIntegration;
719
+ declare function vitops(opts?: GetvitopsOptions): AstroIntegration;
720
+ //#endregion
721
+ //#region src/lastmod.d.ts
722
+ interface GitLastmodOptions {
723
+ /** Directories to read history from (default `src/pages`, `src/content`, `src/data`). */
724
+ dirs?: string[];
725
+ /** Repository root (default `process.cwd()`). */
726
+ cwd?: string;
727
+ /** Called with a human-readable reason when no dates could be derived. */
728
+ onWarn?: (message: string) => void;
729
+ }
730
+ /**
731
+ * `src/pages/blog/index.astro` → `/blog`; `src/pages/index.astro` → `/`.
732
+ *
733
+ * Dynamic routes return `undefined`: one source file backs many URLs, and its
734
+ * commit date describes the template rather than any of them. Stamping every
735
+ * generated page with the template's date is exactly the "wrong date" case above.
736
+ */
737
+ declare function routeFromPage(file: string): string | undefined;
738
+ /** The slug a content entry is most likely published under. */
739
+ declare function slugFromContent(file: string): string | undefined;
740
+ /**
741
+ * Build a `serialize` function that stamps `lastmod` from git history.
742
+ *
743
+ * Resolution order per URL: an exact file-based route first, then a unique
744
+ * content slug. "Unique" is doing real work — a slug appearing in two collections
745
+ * is dropped rather than guessed at, since picking either one would be a coin
746
+ * flip presented as a fact.
747
+ */
748
+ declare function gitLastmod(options?: GitLastmodOptions): Promise<(item: GetvitopsSitemapEntry) => GetvitopsSitemapEntry>;
669
749
  //#endregion
670
- export { type AnalyticsStrategy, type ClarityOptions, type ConsentCategory, type GetvitopsAnalyticsOptions, type GetvitopsConsentOptions, type GetvitopsCssOptions, type GetvitopsFaviconOptions, type GetvitopsOptions, type GetvitopsSeoOptions, type GetvitopsSitemapChangeFreq, type GetvitopsSitemapEntry, type GetvitopsSitemapOptions, type GoogleAnalyticsOptions, type MatomoOptions, type OptionalConsentCategory, type PlausibleOptions, type ResolveAnalyticsContext, type ResolvedAnalytics, type ResolvedSeo, type ResolvedTag, type SeoContext, type SeoNameTag, type SeoOgType, type SeoPropertyTag, type SeoProps, type SeoTwitterCard, consentCategories, getvitops as default, resolveAnalytics, resolveSeo };
750
+ 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 GitLastmodOptions, type GoogleAnalyticsOptions, type MatomoOptions, type OptionalConsentCategory, type PlausibleOptions, type ResolveAnalyticsContext, type ResolvedAnalytics, type ResolvedSeo, type ResolvedTag, type SeoContext, type SeoNameTag, type SeoOgType, type SeoPropertyTag, type SeoProps, type SeoTwitterCard, consentCategories, vitops as default, gitLastmod, resolveAnalytics, resolveSeo, routeFromPage, slugFromContent };
671
751
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/analytics.ts","../src/seo.ts","../src/integration.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/lastmod.ts"],"mappings":"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"}