@nuxt/scripts 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/devtools-client/200.html +1 -1
  2. package/dist/devtools-client/404.html +1 -1
  3. package/dist/devtools-client/_nuxt/{CpUjVpvL.js → BTXw0v4h.js} +1 -1
  4. package/dist/devtools-client/_nuxt/{d96VI30H.js → Bf6N2ObH.js} +1 -1
  5. package/dist/devtools-client/_nuxt/C5Bq9Qgz.js +1 -0
  6. package/dist/devtools-client/_nuxt/{CpodaK4k.js → CSw0kWhI.js} +1 -1
  7. package/dist/devtools-client/_nuxt/DWvCkA0U.js +195 -0
  8. package/dist/devtools-client/_nuxt/{CZLtBO2f.js → TPgAGQc8.js} +1 -1
  9. package/dist/devtools-client/_nuxt/builds/latest.json +1 -1
  10. package/dist/devtools-client/_nuxt/builds/meta/32b705e4-fcb6-4eea-92d5-dbdced5169df.json +1 -0
  11. package/dist/devtools-client/_nuxt/{DkOU4Aaf.js → dvDf1_6X.js} +1 -1
  12. package/dist/devtools-client/_nuxt/entry.VwiedW44.css +1 -0
  13. package/dist/devtools-client/_nuxt/error-404.DBJH6QEN.css +1 -0
  14. package/dist/devtools-client/_nuxt/error-500.BIIPjeaA.css +1 -0
  15. package/dist/devtools-client/docs/index.html +1 -1
  16. package/dist/devtools-client/first-party/index.html +1 -1
  17. package/dist/devtools-client/index.html +1 -1
  18. package/dist/devtools-client/registry/index.html +1 -1
  19. package/dist/module.json +1 -1
  20. package/dist/module.mjs +37 -3
  21. package/dist/registry.mjs +16 -3
  22. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsHeatmapLayer.d.vue.ts +18 -1
  23. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsHeatmapLayer.vue +7 -1
  24. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsHeatmapLayer.vue.d.ts +18 -1
  25. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.d.vue.ts +9 -0
  26. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.vue +6 -5
  27. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.vue.d.ts +9 -0
  28. package/dist/runtime/components/ScriptGravatar.vue +2 -0
  29. package/dist/runtime/components/ScriptLoadingIndicator.vue +1 -1
  30. package/dist/runtime/components/ScriptVimeoPlayer.vue +27 -4
  31. package/dist/runtime/components/ScriptYouTubePlayer.vue +25 -4
  32. package/dist/runtime/composables/useScript.js +4 -3
  33. package/dist/runtime/registry/schemas.d.ts +76 -0
  34. package/dist/runtime/registry/schemas.js +82 -2
  35. package/dist/runtime/registry/speedcurve.d.ts +21 -0
  36. package/dist/runtime/registry/speedcurve.js +95 -0
  37. package/dist/runtime/registry/stripe.js +1 -1
  38. package/dist/runtime/server/instagram-embed.js +37 -10
  39. package/dist/runtime/server/proxy-handler.d.ts +1 -0
  40. package/dist/runtime/server/proxy-handler.js +16 -0
  41. package/dist/runtime/server/utils/instagram-embed.d.ts +1 -0
  42. package/dist/runtime/server/utils/instagram-embed.js +5 -0
  43. package/dist/runtime/types.d.ts +3 -1
  44. package/dist/runtime/utils/after-next-paint.d.ts +1 -0
  45. package/dist/runtime/utils/after-next-paint.js +3 -0
  46. package/dist/stats.d.mts +1 -1
  47. package/dist/stats.d.ts +1 -1
  48. package/dist/stats.mjs +5 -0
  49. package/dist/types-source.mjs +109 -3
  50. package/package.json +9 -4
  51. package/dist/devtools-client/_nuxt/B-0LGYiZ.js +0 -188
  52. package/dist/devtools-client/_nuxt/BHdEFiuu.js +0 -1
  53. package/dist/devtools-client/_nuxt/builds/meta/7cf30d77-8399-4375-9a20-302132331b02.json +0 -1
  54. package/dist/devtools-client/_nuxt/entry.DFx-MLUa.css +0 -1
  55. package/dist/devtools-client/_nuxt/error-404.aORtIbIE.css +0 -1
  56. package/dist/devtools-client/_nuxt/error-500.FkAdJQFV.css +0 -1
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16"
6
6
  },
7
- "version": "1.1.1",
7
+ "version": "1.2.1",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -1184,6 +1184,9 @@ declare module '#app' {
1184
1184
  }
1185
1185
  interface RuntimeNuxtHooks {
1186
1186
  'scripts:updated': (ctx: { scripts: Record<string, import('#nuxt-scripts/types').NuxtDevToolsScriptInstance> }) => void | Promise<void>
1187
+ // Index signature (not a literal-key Record) so listeners can both \`delete globals[key]\`
1188
+ // and mutate \`globals[key].src\` without TS2790 / possibly-undefined errors.
1189
+ 'scripts:globals': (globals: Record<string, Record<string, any>>) => void | Promise<void>
1187
1190
  }
1188
1191
  }
1189
1192
  ${globalsKeys.length ? `declare module '@nuxt/schema' {
@@ -1261,6 +1264,8 @@ function templatePlugin(config, registry) {
1261
1264
  }
1262
1265
  const imports = [];
1263
1266
  const inits = [];
1267
+ const globalMapEntries = [];
1268
+ const globalInits = [];
1264
1269
  const resolvedRegistryKeys = [];
1265
1270
  let needsIdleTimeoutImport = false;
1266
1271
  let needsInteractionImport = false;
@@ -1343,7 +1348,8 @@ function templatePlugin(config, registry) {
1343
1348
  }
1344
1349
  const useFn = `use: () => ({ ${k}: window.${k} })`;
1345
1350
  const optionsArg = optionsJson ? `{ ...${optionsJson}, ${useFn} }` : `{ ${useFn} }`;
1346
- inits.push(`const ${k} = useScript(${inputExpr}, ${optionsArg})`);
1351
+ globalMapEntries.push(`${JSON.stringify(k)}: ${inputExpr}`);
1352
+ globalInits.push(`const ${k} = __registerGlobal(__globals[${JSON.stringify(k)}], ${optionsArg})`);
1347
1353
  }
1348
1354
  const triggerImports = [];
1349
1355
  if (needsIdleTimeoutImport) {
@@ -1356,8 +1362,15 @@ function templatePlugin(config, registry) {
1356
1362
  triggerImports.push(`import { useScriptTriggerServiceWorker } from '#nuxt-scripts/composables/useScriptTriggerServiceWorker'`);
1357
1363
  }
1358
1364
  const setupBody = [];
1359
- if (hasGlobals)
1365
+ if (hasGlobals) {
1360
1366
  setupBody.push(` const __scriptsGlobals = useRuntimeConfig().public.scriptsGlobals || {}`);
1367
+ setupBody.push(` const __registerGlobal = (input, options) => { if (!input) return undefined; const { enabled, ...rest } = input; return (enabled === false || rest.src === '' || rest.src === null) ? undefined : useScript(rest, options) }`);
1368
+ setupBody.push(` const __globals = {`);
1369
+ setupBody.push(...globalMapEntries.map((e) => ` ${e},`));
1370
+ setupBody.push(` }`);
1371
+ setupBody.push(` await nuxtApp.hooks.callHook('scripts:globals', __globals)`);
1372
+ setupBody.push(...globalInits.map((i) => ` ${i}`));
1373
+ }
1361
1374
  setupBody.push(...inits.map((i) => ` ${i}`));
1362
1375
  setupBody.push(` return { provide: { scripts: { ${[...Object.keys(config.globals || {}), ...resolvedRegistryKeys].join(", ")} } } }`);
1363
1376
  return [
@@ -1370,7 +1383,7 @@ function templatePlugin(config, registry) {
1370
1383
  ` name: "scripts:init",`,
1371
1384
  ` env: { islands: false },`,
1372
1385
  ` parallel: true,`,
1373
- ` setup() {`,
1386
+ ` ${hasGlobals ? "async setup(nuxtApp) {" : "setup() {"}`,
1374
1387
  ...setupBody,
1375
1388
  ` }`,
1376
1389
  `})`
@@ -1840,6 +1853,27 @@ const module$1 = defineNuxtModule({
1840
1853
  return templateTriggerResolver(config.defaultScriptOptions);
1841
1854
  }
1842
1855
  });
1856
+ const snippets = {
1857
+ async speedcurveLuxSnippet() {
1858
+ if (!config.registry?.speedcurve)
1859
+ return "";
1860
+ const snippetPath = await resolvePath("@speedcurve/lux/dist/lux-snippet.js");
1861
+ if (!existsSync(snippetPath)) {
1862
+ throw new Error("[nuxt-scripts] useScriptSpeedCurve requires the @speedcurve/lux package. Install it with: npm i -D @speedcurve/lux");
1863
+ }
1864
+ return readFileSync(snippetPath, "utf-8");
1865
+ }
1866
+ };
1867
+ addTemplate({
1868
+ filename: "nuxt-scripts-snippets.mjs",
1869
+ async getContents() {
1870
+ const exports = await Promise.all(
1871
+ Object.entries(snippets).map(async ([name2, getSource]) => `export const ${name2} = ${JSON.stringify(await getSource())}
1872
+ `)
1873
+ );
1874
+ return exports.join("");
1875
+ }
1876
+ });
1843
1877
  logger.debug("[nuxt-scripts] Proxy prefix:", proxyPrefix);
1844
1878
  for (const script of scripts) {
1845
1879
  if (script.import?.name) {
package/dist/registry.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { joinURL, withQuery, withBase } from 'ufo';
2
- import { AhrefsAnalyticsOptions, CloudflareWebAnalyticsOptions, VercelAnalyticsOptions, PostHogOptions, FathomAnalyticsOptions, MatomoAnalyticsOptions, RybbitAnalyticsOptions, DatabuddyAnalyticsOptions, SegmentOptions, MixpanelAnalyticsOptions, BingUetOptions, MetaPixelOptions, XPixelOptions, TikTokPixelOptions, SnapTrPixelOptions, RedditPixelOptions, LinkedInInsightOptions, GoogleAdsenseOptions, IntercomOptions, HotjarOptions, ClarityOptions, StripeOptions, GoogleMapsOptions, BlueskyEmbedOptions, InstagramEmbedOptions, XEmbedOptions, CrispOptions, NpmOptions, CalendlyOptions, GoogleRecaptchaOptions, GoogleSignInOptions, GoogleTagManagerOptions, GoogleAnalyticsOptions, UmamiAnalyticsOptions, UsercentricsOptions, GravatarOptions } from '../dist/runtime/registry/schemas.js';
2
+ import { AhrefsAnalyticsOptions, CloudflareWebAnalyticsOptions, VercelAnalyticsOptions, PostHogOptions, FathomAnalyticsOptions, MatomoAnalyticsOptions, RybbitAnalyticsOptions, DatabuddyAnalyticsOptions, SegmentOptions, MixpanelAnalyticsOptions, BingUetOptions, MetaPixelOptions, XPixelOptions, TikTokPixelOptions, SnapTrPixelOptions, RedditPixelOptions, LinkedInInsightOptions, GoogleAdsenseOptions, IntercomOptions, HotjarOptions, ClarityOptions, StripeOptions, GoogleMapsOptions, BlueskyEmbedOptions, InstagramEmbedOptions, XEmbedOptions, CrispOptions, NpmOptions, CalendlyOptions, GoogleRecaptchaOptions, GoogleSignInOptions, GoogleTagManagerOptions, GoogleAnalyticsOptions, UmamiAnalyticsOptions, UsercentricsOptions, GravatarOptions, SpeedCurveOptions } from '../dist/runtime/registry/schemas.js';
3
3
 
4
4
  const LOGOS = {
5
5
  ahrefsAnalytics: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#FF6A00" d="M9.6 4h4.8a4.8 4.8 0 0 1 4.8 4.8v4.8H9.6A4.8 4.8 0 0 1 4.8 8.8 4.8 4.8 0 0 1 9.6 4Zm14.4 24h-4.8a4.8 4.8 0 0 1-4.8-4.8v-9.6h4.8A4.8 4.8 0 0 1 24 18.4Z"/></svg>`,
@@ -61,7 +61,11 @@ const LOGOS = {
61
61
  gravatar: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 27 27"><path fill="#1d4fc4" d="M10.8 2.699v9.45a2.699 2.699 0 005.398 0V5.862a8.101 8.101 0 11-8.423 1.913 2.702 2.702 0 00-3.821-3.821A13.5 13.5 0 1013.499 0 2.699 2.699 0 0010.8 2.699z"/></svg>`,
62
62
  usercentrics: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><circle cx="16" cy="16" r="16" fill="#1976d2"/><path fill="#fff" d="M16 7.5a4.25 4.25 0 1 0 0 8.5a4.25 4.25 0 0 0 0-8.5m-7 17a7 7 0 0 1 14 0v.5H9z"/></svg>`,
63
63
  bingUet: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 256 256"><path fill="#F25022" d="M0 0h121.5v121.5H0z"/><path fill="#7FBA00" d="M134.5 0H256v121.5H134.5z"/><path fill="#00A4EF" d="M0 134.5h121.5V256H0z"/><path fill="#FFB900" d="M134.5 134.5H256V256H134.5z"/></svg>`,
64
- snapchatPixel: `<svg width="50" height="50" viewBox="147.353 39.286 514.631 514.631" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"><path style="fill:#FFFC00;" d="M147.553,423.021v0.023c0.308,11.424,0.403,22.914,2.33,34.268 c2.042,12.012,4.961,23.725,10.53,34.627c7.529,14.756,17.869,27.217,30.921,37.396c9.371,7.309,19.608,13.111,30.94,16.771 c16.524,5.33,33.571,7.373,50.867,7.473c10.791,0.068,21.575,0.338,32.37,0.293c78.395-0.33,156.792,0.566,235.189-0.484 c10.403-0.141,20.636-1.41,30.846-3.277c19.569-3.582,36.864-11.932,51.661-25.133c17.245-15.381,28.88-34.205,34.132-56.924 c3.437-14.85,4.297-29.916,4.444-45.035v-3.016c0-1.17-0.445-256.892-0.486-260.272c-0.115-9.285-0.799-18.5-2.54-27.636 c-2.117-11.133-5.108-21.981-10.439-32.053c-5.629-10.641-12.68-20.209-21.401-28.57c-13.359-12.81-28.775-21.869-46.722-26.661 c-16.21-4.327-32.747-5.285-49.405-5.27c-0.027-0.004-0.09-0.173-0.094-0.255H278.56c-0.005,0.086-0.008,0.172-0.014,0.255 c-9.454,0.173-18.922,0.102-28.328,1.268c-10.304,1.281-20.509,3.21-30.262,6.812c-15.362,5.682-28.709,14.532-40.11,26.347 c-12.917,13.386-22.022,28.867-26.853,46.894c-4.31,16.084-5.248,32.488-5.271,49.008"/><path style="fill:#FFFFFF;" d="M407.001,473.488c-1.068,0-2.087-0.039-2.862-0.076c-0.615,0.053-1.25,0.076-1.886,0.076 c-22.437,0-37.439-10.607-50.678-19.973c-9.489-6.703-18.438-13.031-28.922-14.775c-5.149-0.854-10.271-1.287-15.22-1.287 c-8.917,0-15.964,1.383-21.109,2.389c-3.166,0.617-5.896,1.148-8.006,1.148c-2.21,0-4.895-0.49-6.014-4.311 c-0.887-3.014-1.523-5.934-2.137-8.746c-1.536-7.027-2.65-11.316-5.281-11.723c-28.141-4.342-44.768-10.738-48.08-18.484 c-0.347-0.814-0.541-1.633-0.584-2.443c-0.129-2.309,1.501-4.334,3.777-4.711c22.348-3.68,42.219-15.492,59.064-35.119 c13.049-15.195,19.457-29.713,20.145-31.316c0.03-0.072,0.065-0.148,0.101-0.217c3.247-6.588,3.893-12.281,1.926-16.916 c-3.626-8.551-15.635-12.361-23.58-14.882c-1.976-0.625-3.845-1.217-5.334-1.808c-7.043-2.782-18.626-8.66-17.083-16.773 c1.124-5.916,8.949-10.036,15.273-10.036c1.756,0,3.312,0.308,4.622,0.923c7.146,3.348,13.575,5.045,19.104,5.045 c6.876,0,10.197-2.618,11-3.362c-0.198-3.668-0.44-7.546-0.674-11.214c0-0.004-0.005-0.048-0.005-0.048 c-1.614-25.675-3.627-57.627,4.546-75.95c24.462-54.847,76.339-59.112,91.651-59.112c0.408,0,6.674-0.062,6.674-0.062 c0.283-0.005,0.59-0.009,0.908-0.009c15.354,0,67.339,4.27,91.816,59.15c8.173,18.335,6.158,50.314,4.539,76.016l-0.076,1.23 c-0.222,3.49-0.427,6.793-0.6,9.995c0.756,0.696,3.795,3.096,9.978,3.339c5.271-0.202,11.328-1.891,17.998-5.014 c2.062-0.968,4.345-1.169,5.895-1.169c2.343,0,4.727,0.456,6.714,1.285l0.106,0.041c5.66,2.009,9.367,6.024,9.447,10.242 c0.071,3.932-2.851,9.809-17.223,15.485c-1.472,0.583-3.35,1.179-5.334,1.808c-7.952,2.524-19.951,6.332-23.577,14.878 c-1.97,4.635-1.322,10.326,1.926,16.912c0.036,0.072,0.067,0.145,0.102,0.221c1,2.344,25.205,57.535,79.209,66.432 c2.275,0.379,3.908,2.406,3.778,4.711c-0.048,0.828-0.248,1.656-0.598,2.465c-3.289,7.703-19.915,14.09-48.064,18.438 c-2.642,0.408-3.755,4.678-5.277,11.668c-0.63,2.887-1.271,5.717-2.146,8.691c-0.819,2.797-2.641,4.164-5.567,4.164h-0.441 c-1.905,0-4.604-0.346-8.008-1.012c-5.95-1.158-12.623-2.236-21.109-2.236c-4.948,0-10.069,0.434-15.224,1.287 c-10.473,1.744-19.421,8.062-28.893,14.758C444.443,462.88,429.436,473.488,407.001,473.488"/><path style="fill:#020202;" d="M408.336,124.235c14.455,0,64.231,3.883,87.688,56.472c7.724,17.317,5.744,48.686,4.156,73.885 c-0.248,3.999-0.494,7.875-0.694,11.576l-0.084,1.591l1.062,1.185c0.429,0.476,4.444,4.672,13.374,5.017l0.144,0.008l0.15-0.003 c5.904-0.225,12.554-2.059,19.776-5.442c1.064-0.498,2.48-0.741,3.978-0.741c1.707,0,3.521,0.321,5.017,0.951l0.226,0.09 c3.787,1.327,6.464,3.829,6.505,6.093c0.022,1.28-0.935,5.891-14.359,11.194c-1.312,0.518-3.039,1.069-5.041,1.7 c-8.736,2.774-21.934,6.96-26.376,17.427c-2.501,5.896-1.816,12.854,2.034,20.678c1.584,3.697,26.52,59.865,82.631,69.111 c-0.011,0.266-0.079,0.557-0.229,0.9c-0.951,2.24-6.996,9.979-44.612,15.783c-5.886,0.902-7.328,7.5-9,15.17 c-0.604,2.746-1.218,5.518-2.062,8.381c-0.258,0.865-0.306,0.914-1.233,0.914c-0.128,0-0.278,0-0.442,0 c-1.668,0-4.2-0.346-7.135-0.922c-5.345-1.041-12.647-2.318-21.982-2.318c-5.21,0-10.577,0.453-15.962,1.352 c-11.511,1.914-20.872,8.535-30.786,15.543c-13.314,9.408-27.075,19.143-48.071,19.143c-0.917,0-1.812-0.031-2.709-0.076 l-0.236-0.01l-0.237,0.018c-0.515,0.045-1.034,0.068-1.564,0.068c-20.993,0-34.76-9.732-48.068-19.143 c-9.916-7.008-19.282-13.629-30.791-15.543c-5.38-0.896-10.752-1.352-15.959-1.352c-9.333,0-16.644,1.428-21.978,2.471 c-2.935,0.574-5.476,1.066-7.139,1.066c-1.362,0-1.388-0.08-1.676-1.064c-0.844-2.865-1.461-5.703-2.062-8.445 c-1.676-7.678-3.119-14.312-9.002-15.215c-37.613-5.809-43.659-13.561-44.613-15.795c-0.149-0.352-0.216-0.652-0.231-0.918 c56.11-9.238,81.041-65.408,82.63-69.119c3.857-7.818,4.541-14.775,2.032-20.678c-4.442-10.461-17.638-14.653-26.368-17.422 c-2.007-0.635-3.735-1.187-5.048-1.705c-11.336-4.479-14.823-8.991-14.305-11.725c0.601-3.153,6.067-6.359,10.837-6.359 c1.072,0,2.012,0.173,2.707,0.498c7.747,3.631,14.819,5.472,21.022,5.472c9.751,0,14.091-4.537,14.557-5.055l1.057-1.182 l-0.085-1.583c-0.197-3.699-0.44-7.574-0.696-11.565c-1.583-25.205-3.563-56.553,4.158-73.871 c23.37-52.396,72.903-56.435,87.525-56.435c0.36,0,6.717-0.065,6.717-0.065C407.744,124.239,408.033,124.235,408.336,124.235 M408.336,115.197h-0.017c-0.333,0-0.646,0-0.944,0.004c-2.376,0.024-6.282,0.062-6.633,0.066c-8.566,0-25.705,1.21-44.115,9.336 c-10.526,4.643-19.994,10.921-28.14,18.66c-9.712,9.221-17.624,20.59-23.512,33.796c-8.623,19.336-6.576,51.905-4.932,78.078 l0.006,0.041c0.176,2.803,0.361,5.73,0.53,8.582c-1.265,0.581-3.316,1.194-6.339,1.194c-4.864,0-10.648-1.555-17.187-4.619 c-1.924-0.896-4.12-1.349-6.543-1.349c-3.893,0-7.997,1.146-11.557,3.239c-4.479,2.63-7.373,6.347-8.159,10.468 c-0.518,2.726-0.493,8.114,5.492,13.578c3.292,3.008,8.128,5.782,14.37,8.249c1.638,0.645,3.582,1.261,5.641,1.914 c7.145,2.271,17.959,5.702,20.779,12.339c1.429,3.365,0.814,7.793-1.823,13.145c-0.069,0.146-0.138,0.289-0.201,0.439 c-0.659,1.539-6.807,15.465-19.418,30.152c-7.166,8.352-15.059,15.332-23.447,20.752c-10.238,6.617-21.316,10.943-32.923,12.855 c-4.558,0.748-7.813,4.809-7.559,9.424c0.078,1.33,0.39,2.656,0.931,3.939c0.004,0.008,0.009,0.016,0.013,0.023 c1.843,4.311,6.116,7.973,13.063,11.203c8.489,3.943,21.185,7.26,37.732,9.855c0.836,1.59,1.704,5.586,2.305,8.322 c0.629,2.908,1.285,5.898,2.22,9.074c1.009,3.441,3.626,7.553,10.349,7.553c2.548,0,5.478-0.574,8.871-1.232 c4.969-0.975,11.764-2.305,20.245-2.305c4.702,0,9.575,0.414,14.48,1.229c9.455,1.574,17.606,7.332,27.037,14 c13.804,9.758,29.429,20.803,53.302,20.803c0.651,0,1.304-0.021,1.949-0.066c0.789,0.037,1.767,0.066,2.799,0.066 c23.88,0,39.501-11.049,53.29-20.799l0.022-0.02c9.433-6.66,17.575-12.41,27.027-13.984c4.903-0.814,9.775-1.229,14.479-1.229 c8.102,0,14.517,1.033,20.245,2.15c3.738,0.736,6.643,1.09,8.872,1.09l0.218,0.004h0.226c4.917,0,8.53-2.699,9.909-7.422 c0.916-3.109,1.57-6.029,2.215-8.986c0.562-2.564,1.46-6.674,2.296-8.281c16.558-2.6,29.249-5.91,37.739-9.852 c6.931-3.215,11.199-6.873,13.053-11.166c0.556-1.287,0.881-2.621,0.954-3.979c0.261-4.607-2.999-8.676-7.56-9.424 c-51.585-8.502-74.824-61.506-75.785-63.758c-0.062-0.148-0.132-0.295-0.205-0.438c-2.637-5.354-3.246-9.777-1.816-13.148 c2.814-6.631,13.621-10.062,20.771-12.332c2.07-0.652,4.021-1.272,5.646-1.914c7.039-2.78,12.07-5.796,15.389-9.221 c3.964-4.083,4.736-7.995,4.688-10.555c-0.121-6.194-4.856-11.698-12.388-14.393c-2.544-1.052-5.445-1.607-8.399-1.607 c-2.011,0-4.989,0.276-7.808,1.592c-6.035,2.824-11.441,4.368-16.082,4.588c-2.468-0.125-4.199-0.66-5.32-1.171 c0.141-2.416,0.297-4.898,0.458-7.486l0.067-1.108c1.653-26.19,3.707-58.784-4.92-78.134c-5.913-13.253-13.853-24.651-23.604-33.892 c-8.178-7.744-17.678-14.021-28.242-18.661C434.052,116.402,416.914,115.197,408.336,115.197"/><rect x="147.553" y="39.443" style="fill:none;" width="514.231" height="514.23"/></svg>`
64
+ snapchatPixel: `<svg width="50" height="50" viewBox="147.353 39.286 514.631 514.631" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"><path style="fill:#FFFC00;" d="M147.553,423.021v0.023c0.308,11.424,0.403,22.914,2.33,34.268 c2.042,12.012,4.961,23.725,10.53,34.627c7.529,14.756,17.869,27.217,30.921,37.396c9.371,7.309,19.608,13.111,30.94,16.771 c16.524,5.33,33.571,7.373,50.867,7.473c10.791,0.068,21.575,0.338,32.37,0.293c78.395-0.33,156.792,0.566,235.189-0.484 c10.403-0.141,20.636-1.41,30.846-3.277c19.569-3.582,36.864-11.932,51.661-25.133c17.245-15.381,28.88-34.205,34.132-56.924 c3.437-14.85,4.297-29.916,4.444-45.035v-3.016c0-1.17-0.445-256.892-0.486-260.272c-0.115-9.285-0.799-18.5-2.54-27.636 c-2.117-11.133-5.108-21.981-10.439-32.053c-5.629-10.641-12.68-20.209-21.401-28.57c-13.359-12.81-28.775-21.869-46.722-26.661 c-16.21-4.327-32.747-5.285-49.405-5.27c-0.027-0.004-0.09-0.173-0.094-0.255H278.56c-0.005,0.086-0.008,0.172-0.014,0.255 c-9.454,0.173-18.922,0.102-28.328,1.268c-10.304,1.281-20.509,3.21-30.262,6.812c-15.362,5.682-28.709,14.532-40.11,26.347 c-12.917,13.386-22.022,28.867-26.853,46.894c-4.31,16.084-5.248,32.488-5.271,49.008"/><path style="fill:#FFFFFF;" d="M407.001,473.488c-1.068,0-2.087-0.039-2.862-0.076c-0.615,0.053-1.25,0.076-1.886,0.076 c-22.437,0-37.439-10.607-50.678-19.973c-9.489-6.703-18.438-13.031-28.922-14.775c-5.149-0.854-10.271-1.287-15.22-1.287 c-8.917,0-15.964,1.383-21.109,2.389c-3.166,0.617-5.896,1.148-8.006,1.148c-2.21,0-4.895-0.49-6.014-4.311 c-0.887-3.014-1.523-5.934-2.137-8.746c-1.536-7.027-2.65-11.316-5.281-11.723c-28.141-4.342-44.768-10.738-48.08-18.484 c-0.347-0.814-0.541-1.633-0.584-2.443c-0.129-2.309,1.501-4.334,3.777-4.711c22.348-3.68,42.219-15.492,59.064-35.119 c13.049-15.195,19.457-29.713,20.145-31.316c0.03-0.072,0.065-0.148,0.101-0.217c3.247-6.588,3.893-12.281,1.926-16.916 c-3.626-8.551-15.635-12.361-23.58-14.882c-1.976-0.625-3.845-1.217-5.334-1.808c-7.043-2.782-18.626-8.66-17.083-16.773 c1.124-5.916,8.949-10.036,15.273-10.036c1.756,0,3.312,0.308,4.622,0.923c7.146,3.348,13.575,5.045,19.104,5.045 c6.876,0,10.197-2.618,11-3.362c-0.198-3.668-0.44-7.546-0.674-11.214c0-0.004-0.005-0.048-0.005-0.048 c-1.614-25.675-3.627-57.627,4.546-75.95c24.462-54.847,76.339-59.112,91.651-59.112c0.408,0,6.674-0.062,6.674-0.062 c0.283-0.005,0.59-0.009,0.908-0.009c15.354,0,67.339,4.27,91.816,59.15c8.173,18.335,6.158,50.314,4.539,76.016l-0.076,1.23 c-0.222,3.49-0.427,6.793-0.6,9.995c0.756,0.696,3.795,3.096,9.978,3.339c5.271-0.202,11.328-1.891,17.998-5.014 c2.062-0.968,4.345-1.169,5.895-1.169c2.343,0,4.727,0.456,6.714,1.285l0.106,0.041c5.66,2.009,9.367,6.024,9.447,10.242 c0.071,3.932-2.851,9.809-17.223,15.485c-1.472,0.583-3.35,1.179-5.334,1.808c-7.952,2.524-19.951,6.332-23.577,14.878 c-1.97,4.635-1.322,10.326,1.926,16.912c0.036,0.072,0.067,0.145,0.102,0.221c1,2.344,25.205,57.535,79.209,66.432 c2.275,0.379,3.908,2.406,3.778,4.711c-0.048,0.828-0.248,1.656-0.598,2.465c-3.289,7.703-19.915,14.09-48.064,18.438 c-2.642,0.408-3.755,4.678-5.277,11.668c-0.63,2.887-1.271,5.717-2.146,8.691c-0.819,2.797-2.641,4.164-5.567,4.164h-0.441 c-1.905,0-4.604-0.346-8.008-1.012c-5.95-1.158-12.623-2.236-21.109-2.236c-4.948,0-10.069,0.434-15.224,1.287 c-10.473,1.744-19.421,8.062-28.893,14.758C444.443,462.88,429.436,473.488,407.001,473.488"/><path style="fill:#020202;" d="M408.336,124.235c14.455,0,64.231,3.883,87.688,56.472c7.724,17.317,5.744,48.686,4.156,73.885 c-0.248,3.999-0.494,7.875-0.694,11.576l-0.084,1.591l1.062,1.185c0.429,0.476,4.444,4.672,13.374,5.017l0.144,0.008l0.15-0.003 c5.904-0.225,12.554-2.059,19.776-5.442c1.064-0.498,2.48-0.741,3.978-0.741c1.707,0,3.521,0.321,5.017,0.951l0.226,0.09 c3.787,1.327,6.464,3.829,6.505,6.093c0.022,1.28-0.935,5.891-14.359,11.194c-1.312,0.518-3.039,1.069-5.041,1.7 c-8.736,2.774-21.934,6.96-26.376,17.427c-2.501,5.896-1.816,12.854,2.034,20.678c1.584,3.697,26.52,59.865,82.631,69.111 c-0.011,0.266-0.079,0.557-0.229,0.9c-0.951,2.24-6.996,9.979-44.612,15.783c-5.886,0.902-7.328,7.5-9,15.17 c-0.604,2.746-1.218,5.518-2.062,8.381c-0.258,0.865-0.306,0.914-1.233,0.914c-0.128,0-0.278,0-0.442,0 c-1.668,0-4.2-0.346-7.135-0.922c-5.345-1.041-12.647-2.318-21.982-2.318c-5.21,0-10.577,0.453-15.962,1.352 c-11.511,1.914-20.872,8.535-30.786,15.543c-13.314,9.408-27.075,19.143-48.071,19.143c-0.917,0-1.812-0.031-2.709-0.076 l-0.236-0.01l-0.237,0.018c-0.515,0.045-1.034,0.068-1.564,0.068c-20.993,0-34.76-9.732-48.068-19.143 c-9.916-7.008-19.282-13.629-30.791-15.543c-5.38-0.896-10.752-1.352-15.959-1.352c-9.333,0-16.644,1.428-21.978,2.471 c-2.935,0.574-5.476,1.066-7.139,1.066c-1.362,0-1.388-0.08-1.676-1.064c-0.844-2.865-1.461-5.703-2.062-8.445 c-1.676-7.678-3.119-14.312-9.002-15.215c-37.613-5.809-43.659-13.561-44.613-15.795c-0.149-0.352-0.216-0.652-0.231-0.918 c56.11-9.238,81.041-65.408,82.63-69.119c3.857-7.818,4.541-14.775,2.032-20.678c-4.442-10.461-17.638-14.653-26.368-17.422 c-2.007-0.635-3.735-1.187-5.048-1.705c-11.336-4.479-14.823-8.991-14.305-11.725c0.601-3.153,6.067-6.359,10.837-6.359 c1.072,0,2.012,0.173,2.707,0.498c7.747,3.631,14.819,5.472,21.022,5.472c9.751,0,14.091-4.537,14.557-5.055l1.057-1.182 l-0.085-1.583c-0.197-3.699-0.44-7.574-0.696-11.565c-1.583-25.205-3.563-56.553,4.158-73.871 c23.37-52.396,72.903-56.435,87.525-56.435c0.36,0,6.717-0.065,6.717-0.065C407.744,124.239,408.033,124.235,408.336,124.235 M408.336,115.197h-0.017c-0.333,0-0.646,0-0.944,0.004c-2.376,0.024-6.282,0.062-6.633,0.066c-8.566,0-25.705,1.21-44.115,9.336 c-10.526,4.643-19.994,10.921-28.14,18.66c-9.712,9.221-17.624,20.59-23.512,33.796c-8.623,19.336-6.576,51.905-4.932,78.078 l0.006,0.041c0.176,2.803,0.361,5.73,0.53,8.582c-1.265,0.581-3.316,1.194-6.339,1.194c-4.864,0-10.648-1.555-17.187-4.619 c-1.924-0.896-4.12-1.349-6.543-1.349c-3.893,0-7.997,1.146-11.557,3.239c-4.479,2.63-7.373,6.347-8.159,10.468 c-0.518,2.726-0.493,8.114,5.492,13.578c3.292,3.008,8.128,5.782,14.37,8.249c1.638,0.645,3.582,1.261,5.641,1.914 c7.145,2.271,17.959,5.702,20.779,12.339c1.429,3.365,0.814,7.793-1.823,13.145c-0.069,0.146-0.138,0.289-0.201,0.439 c-0.659,1.539-6.807,15.465-19.418,30.152c-7.166,8.352-15.059,15.332-23.447,20.752c-10.238,6.617-21.316,10.943-32.923,12.855 c-4.558,0.748-7.813,4.809-7.559,9.424c0.078,1.33,0.39,2.656,0.931,3.939c0.004,0.008,0.009,0.016,0.013,0.023 c1.843,4.311,6.116,7.973,13.063,11.203c8.489,3.943,21.185,7.26,37.732,9.855c0.836,1.59,1.704,5.586,2.305,8.322 c0.629,2.908,1.285,5.898,2.22,9.074c1.009,3.441,3.626,7.553,10.349,7.553c2.548,0,5.478-0.574,8.871-1.232 c4.969-0.975,11.764-2.305,20.245-2.305c4.702,0,9.575,0.414,14.48,1.229c9.455,1.574,17.606,7.332,27.037,14 c13.804,9.758,29.429,20.803,53.302,20.803c0.651,0,1.304-0.021,1.949-0.066c0.789,0.037,1.767,0.066,2.799,0.066 c23.88,0,39.501-11.049,53.29-20.799l0.022-0.02c9.433-6.66,17.575-12.41,27.027-13.984c4.903-0.814,9.775-1.229,14.479-1.229 c8.102,0,14.517,1.033,20.245,2.15c3.738,0.736,6.643,1.09,8.872,1.09l0.218,0.004h0.226c4.917,0,8.53-2.699,9.909-7.422 c0.916-3.109,1.57-6.029,2.215-8.986c0.562-2.564,1.46-6.674,2.296-8.281c16.558-2.6,29.249-5.91,37.739-9.852 c6.931-3.215,11.199-6.873,13.053-11.166c0.556-1.287,0.881-2.621,0.954-3.979c0.261-4.607-2.999-8.676-7.56-9.424 c-51.585-8.502-74.824-61.506-75.785-63.758c-0.062-0.148-0.132-0.295-0.205-0.438c-2.637-5.354-3.246-9.777-1.816-13.148 c2.814-6.631,13.621-10.062,20.771-12.332c2.07-0.652,4.021-1.272,5.646-1.914c7.039-2.78,12.07-5.796,15.389-9.221 c3.964-4.083,4.736-7.995,4.688-10.555c-0.121-6.194-4.856-11.698-12.388-14.393c-2.544-1.052-5.445-1.607-8.399-1.607 c-2.011,0-4.989,0.276-7.808,1.592c-6.035,2.824-11.441,4.368-16.082,4.588c-2.468-0.125-4.199-0.66-5.32-1.171 c0.141-2.416,0.297-4.898,0.458-7.486l0.067-1.108c1.653-26.19,3.707-58.784-4.92-78.134c-5.913-13.253-13.853-24.651-23.604-33.892 c-8.178-7.744-17.678-14.021-28.242-18.661C434.052,116.402,416.914,115.197,408.336,115.197"/><rect x="147.553" y="39.443" style="fill:none;" width="514.231" height="514.23"/></svg>`,
65
+ speedcurve: {
66
+ light: `<svg viewBox="0 0 70 70" width="32" height="32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M65.2 24.44a16.81 16.81 0 0 0-11.61-4.53c-4.39 0-8.51 1.6-11.61 4.53l-8.24 7.76c-.16.16-.3.34-.45.58l-.04.08-.08.04c-.26.14-.45.27-.61.43l-8.66 8.16c-2 1.89-4.66 2.93-7.5 2.93-2.82 0-5.48-1.04-7.49-2.93a9.6 9.6 0 0 1 0-14.13l9.05-8.53c.05-.04.09-.1.13-.15l.07-.09 12.8-12.07a3.84 3.84 0 0 1 2.65-1.03c1 0 1.94.36 2.65 1.03a3.41 3.41 0 0 1 0 5L15.43 31.14a2.64 2.64 0 0 0 0 3.88c.55.52 1.28.8 2.06.8s1.5-.28 2.06-.8l20.82-19.64a8.7 8.7 0 0 0 2.8-6.37c0-2.41-1-4.68-2.8-6.38A9.8 9.8 0 0 0 33.61 0a9.8 9.8 0 0 0-6.76 2.64l-13.9 13.1-.13.15-.07.1-7.95 7.49C1.7 26.4 0 30.28 0 34.42s1.7 8.03 4.8 10.95a16.81 16.81 0 0 0 11.6 4.53c4.4 0 8.51-1.6 11.61-4.53l8.66-8.17c.16-.15.3-.33.45-.57l.05-.08.08-.04c.25-.14.45-.27.6-.43l8.24-7.76c2-1.89 4.67-2.93 7.5-2.93s5.49 1.04 7.49 2.93c2 1.89 3.1 4.4 3.1 7.06 0 2.67-1.1 5.18-3.1 7.07L38.84 63.42a4.1 4.1 0 0 1-2.8 1.1 4.07 4.07 0 0 1-2.81-1.1 3.6 3.6 0 0 1 0-5.29l21.53-20.3a2.65 2.65 0 0 0 0-3.88 2.98 2.98 0 0 0-2.06-.8c-.77 0-1.5.28-2.05.8L29.1 54.25a8.91 8.91 0 0 0-2.86 6.53 8.91 8.91 0 0 0 2.86 6.52c1.85 1.74 4.3 2.7 6.92 2.7s5.08-.96 6.92-2.7L65.2 46.33c3.1-2.93 4.8-6.81 4.8-10.95 0-4.13-1.7-8.02-4.8-10.94" fill="#3c95c5"></path></g></svg>`,
67
+ dark: `<svg viewBox="0 0 70 70" width="32" height="32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M65.2 24.44a16.81 16.81 0 0 0-11.61-4.53c-4.39 0-8.51 1.6-11.61 4.53l-8.24 7.76c-.16.16-.3.34-.45.58l-.04.08-.08.04c-.26.14-.45.27-.61.43l-8.66 8.16c-2 1.89-4.66 2.93-7.5 2.93-2.82 0-5.48-1.04-7.49-2.93a9.6 9.6 0 0 1 0-14.13l9.05-8.53c.05-.04.09-.1.13-.15l.07-.09 12.8-12.07a3.84 3.84 0 0 1 2.65-1.03c1 0 1.94.36 2.65 1.03a3.41 3.41 0 0 1 0 5L15.43 31.14a2.64 2.64 0 0 0 0 3.88c.55.52 1.28.8 2.06.8s1.5-.28 2.06-.8l20.82-19.64a8.7 8.7 0 0 0 2.8-6.37c0-2.41-1-4.68-2.8-6.38A9.8 9.8 0 0 0 33.61 0a9.8 9.8 0 0 0-6.76 2.64l-13.9 13.1-.13.15-.07.1-7.95 7.49C1.7 26.4 0 30.28 0 34.42s1.7 8.03 4.8 10.95a16.81 16.81 0 0 0 11.6 4.53c4.4 0 8.51-1.6 11.61-4.53l8.66-8.17c.16-.15.3-.33.45-.57l.05-.08.08-.04c.25-.14.45-.27.6-.43l8.24-7.76c2-1.89 4.67-2.93 7.5-2.93s5.49 1.04 7.49 2.93c2 1.89 3.1 4.4 3.1 7.06 0 2.67-1.1 5.18-3.1 7.07L38.84 63.42a4.1 4.1 0 0 1-2.8 1.1 4.07 4.07 0 0 1-2.81-1.1 3.6 3.6 0 0 1 0-5.29l21.53-20.3a2.65 2.65 0 0 0 0-3.88 2.98 2.98 0 0 0-2.06-.8c-.77 0-1.5.28-2.05.8L29.1 54.25a8.91 8.91 0 0 0-2.86 6.53 8.91 8.91 0 0 0 2.86 6.52c1.85 1.74 4.3 2.7 6.92 2.7s5.08-.96 6.92-2.7L65.2 46.33c3.1-2.93 4.8-6.81 4.8-10.95 0-4.13-1.7-8.02-4.8-10.94" fill="#fff"></path></g></svg>`
68
+ }
65
69
  };
66
70
 
67
71
  const PRIVACY_NONE = { ip: false, userAgent: false, language: false, screen: false, timezone: false, hardware: false };
@@ -148,7 +152,8 @@ const registryMeta = [
148
152
  m("gravatar", "Gravatar", "utility", "useScriptGravatar", { bundle: true, proxy: true }, PRIVACY_IP_ONLY),
149
153
  // Usercentrics is the consent layer itself: must hit the vendor origin so
150
154
  // signature/policy lookups succeed. Bundle/proxy are intentionally absent.
151
- m("usercentrics", "Usercentrics", "utility", "useScriptUsercentrics", {}, null)
155
+ m("usercentrics", "Usercentrics", "utility", "useScriptUsercentrics", {}, null),
156
+ m("speedcurve", "SpeedCurve LUX", "analytics", "useScriptSpeedCurve", {}, null)
152
157
  ];
153
158
  const REGISTRY_CATEGORIES = [
154
159
  { key: "analytics", label: "Analytics" },
@@ -784,6 +789,14 @@ async function registry(resolve) {
784
789
  serverHandlers: [
785
790
  { route: "/_scripts/proxy/gravatar", handler: "./runtime/server/gravatar-proxy", requiresSigning: true }
786
791
  ]
792
+ }),
793
+ def("speedcurve", {
794
+ schema: SpeedCurveOptions,
795
+ label: "SpeedCurve LUX",
796
+ src: false,
797
+ category: "analytics",
798
+ envDefaults: { id: "" },
799
+ composableName: "useScriptSpeedCurve"
787
800
  })
788
801
  ]);
789
802
  }
@@ -1,10 +1,27 @@
1
1
  type __VLS_Props = {
2
2
  /**
3
3
  * Configuration options for the heatmap layer visualization.
4
+ * @deprecated Google deprecated the Maps JavaScript API `HeatmapLayer` (May 2025) and removed it in v3.65 (May 2026). Consider [deck.gl HeatmapLayer](https://deck.gl/docs/api-reference/aggregation-layers/heatmap-layer) instead.
4
5
  * @see https://developers.google.com/maps/documentation/javascript/reference/visualization#HeatmapLayerOptions
5
6
  */
6
- options?: Omit<google.maps.visualization.HeatmapLayerOptions, 'map'>;
7
+ options?: Omit<HeatmapLayerOptions, 'map'>;
7
8
  };
9
+ /**
10
+ * Configuration options for the heatmap layer visualization.
11
+ *
12
+ * The `HeatmapLayer` types were removed from `@types/google.maps` in v3.65 as part of Google's
13
+ * deprecation (the runtime feature is still available until May 2026), so we type the surface locally.
14
+ * @see https://developers.google.com/maps/documentation/javascript/reference/visualization#HeatmapLayerOptions
15
+ */
16
+ interface HeatmapLayerOptions {
17
+ data?: unknown;
18
+ dissipating?: boolean;
19
+ gradient?: string[];
20
+ map?: google.maps.Map;
21
+ maxIntensity?: number;
22
+ opacity?: number;
23
+ radius?: number;
24
+ }
8
25
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
26
  declare const _default: typeof __VLS_export;
10
27
  export default _default;
@@ -4,10 +4,16 @@ import { useGoogleMapsResource } from "./useGoogleMapsResource";
4
4
  const props = defineProps({
5
5
  options: { type: Object, required: false }
6
6
  });
7
+ if (import.meta.dev) {
8
+ console.warn(
9
+ "[nuxt-scripts] <ScriptGoogleMapsHeatmapLayer> is deprecated. Google deprecated the Maps JavaScript API HeatmapLayer (May 2025) and removed it in v3.65 (May 2026). Consider deck.gl HeatmapLayer instead: https://deck.gl/docs/api-reference/aggregation-layers/heatmap-layer"
10
+ );
11
+ }
7
12
  const heatmapLayer = useGoogleMapsResource({
8
13
  async create({ mapsApi, map }) {
9
14
  await mapsApi.importLibrary("visualization");
10
- return new mapsApi.visualization.HeatmapLayer({
15
+ const Layer = mapsApi.visualization.HeatmapLayer;
16
+ return new Layer({
11
17
  map,
12
18
  ...props.options
13
19
  });
@@ -1,10 +1,27 @@
1
1
  type __VLS_Props = {
2
2
  /**
3
3
  * Configuration options for the heatmap layer visualization.
4
+ * @deprecated Google deprecated the Maps JavaScript API `HeatmapLayer` (May 2025) and removed it in v3.65 (May 2026). Consider [deck.gl HeatmapLayer](https://deck.gl/docs/api-reference/aggregation-layers/heatmap-layer) instead.
4
5
  * @see https://developers.google.com/maps/documentation/javascript/reference/visualization#HeatmapLayerOptions
5
6
  */
6
- options?: Omit<google.maps.visualization.HeatmapLayerOptions, 'map'>;
7
+ options?: Omit<HeatmapLayerOptions, 'map'>;
7
8
  };
9
+ /**
10
+ * Configuration options for the heatmap layer visualization.
11
+ *
12
+ * The `HeatmapLayer` types were removed from `@types/google.maps` in v3.65 as part of Google's
13
+ * deprecation (the runtime feature is still available until May 2026), so we type the surface locally.
14
+ * @see https://developers.google.com/maps/documentation/javascript/reference/visualization#HeatmapLayerOptions
15
+ */
16
+ interface HeatmapLayerOptions {
17
+ data?: unknown;
18
+ dissipating?: boolean;
19
+ gradient?: string[];
20
+ map?: google.maps.Map;
21
+ maxIntensity?: number;
22
+ opacity?: number;
23
+ radius?: number;
24
+ }
8
25
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
26
  declare const _default: typeof __VLS_export;
10
27
  export default _default;
@@ -91,6 +91,10 @@ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
91
91
  * Additional attributes for the `<img>` element.
92
92
  */
93
93
  imgAttrs?: ImgHTMLAttributes & ReservedProps & Record<string, unknown>;
94
+ /**
95
+ * Alt text for the map image. Override to provide a more descriptive label for screen readers.
96
+ */
97
+ alt?: string;
94
98
  }, {
95
99
  src: import("vue").ComputedRef<string>;
96
100
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
@@ -181,11 +185,16 @@ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
181
185
  * Additional attributes for the `<img>` element.
182
186
  */
183
187
  imgAttrs?: ImgHTMLAttributes & ReservedProps & Record<string, unknown>;
188
+ /**
189
+ * Alt text for the map image. Override to provide a more descriptive label for screen readers.
190
+ */
191
+ alt?: string;
184
192
  }> & Readonly<{}>, {
185
193
  loading: "eager" | "lazy";
186
194
  width: number | string;
187
195
  height: number | string;
188
196
  zoom: number;
197
+ alt: string;
189
198
  objectFit: "cover" | "contain" | "fill" | "none" | "scale-down";
190
199
  scale: 1 | 2;
191
200
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
@@ -28,7 +28,8 @@ const props = defineProps({
28
28
  height: { type: [Number, String], required: false, default: 400 },
29
29
  loading: { type: String, required: false, default: "lazy" },
30
30
  objectFit: { type: String, required: false, default: "cover" },
31
- imgAttrs: { type: Object, required: false }
31
+ imgAttrs: { type: Object, required: false },
32
+ alt: { type: String, required: false, default: "Google Maps" }
32
33
  });
33
34
  defineSlots();
34
35
  const runtimeConfig = useRuntimeConfig();
@@ -132,7 +133,7 @@ const src = computed(() => {
132
133
  const imgAttributes = computed(() => {
133
134
  return defu(props.imgAttrs, {
134
135
  src: src.value,
135
- alt: "Google Maps",
136
+ alt: props.alt,
136
137
  loading: props.loading,
137
138
  style: {
138
139
  width: "100%",
@@ -148,14 +149,14 @@ const rootStyle = computed(() => ({
148
149
  maxWidth: "100%",
149
150
  overflow: "hidden"
150
151
  }));
151
- if (import.meta.server) {
152
+ if (import.meta.server && !useProxy) {
152
153
  useHead({
153
154
  link: [
154
155
  {
155
156
  rel: props.loading === "eager" ? "preconnect" : "dns-prefetch",
156
- href: useProxy ? void 0 : "https://maps.googleapis.com"
157
+ href: "https://maps.googleapis.com"
157
158
  }
158
- ].filter((l) => l.href)
159
+ ]
159
160
  });
160
161
  }
161
162
  defineExpose({ src });
@@ -91,6 +91,10 @@ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
91
91
  * Additional attributes for the `<img>` element.
92
92
  */
93
93
  imgAttrs?: ImgHTMLAttributes & ReservedProps & Record<string, unknown>;
94
+ /**
95
+ * Alt text for the map image. Override to provide a more descriptive label for screen readers.
96
+ */
97
+ alt?: string;
94
98
  }, {
95
99
  src: import("vue").ComputedRef<string>;
96
100
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
@@ -181,11 +185,16 @@ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
181
185
  * Additional attributes for the `<img>` element.
182
186
  */
183
187
  imgAttrs?: ImgHTMLAttributes & ReservedProps & Record<string, unknown>;
188
+ /**
189
+ * Alt text for the map image. Override to provide a more descriptive label for screen readers.
190
+ */
191
+ alt?: string;
184
192
  }> & Readonly<{}>, {
185
193
  loading: "eager" | "lazy";
186
194
  width: number | string;
187
195
  height: number | string;
188
196
  zoom: number;
197
+ alt: string;
189
198
  objectFit: "cover" | "contain" | "fill" | "none" | "scale-down";
190
199
  scale: 1 | 2;
191
200
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
@@ -41,6 +41,8 @@ onMounted(() => {
41
41
  >
42
42
  <span
43
43
  v-else
44
+ role="status"
45
+ aria-label="Loading avatar"
44
46
  :style="{ display: 'inline-block', width: `${size}px`, height: `${size}px`, borderRadius: '50%', background: '#e0e0e0' }"
45
47
  />
46
48
  </template>
@@ -11,7 +11,7 @@ const styles = computed(() => ({
11
11
  </script>
12
12
 
13
13
  <template>
14
- <div class="loader" :styles="styles" aria-label="Loading..." role="status" />
14
+ <div class="loader" :style="styles" aria-label="Loading..." role="status" />
15
15
  </template>
16
16
 
17
17
  <style scoped>
@@ -149,12 +149,35 @@ watch(status, (status2) => {
149
149
  emits("error");
150
150
  }
151
151
  });
152
+ const keyboardTriggerable = computed(() => {
153
+ if (ready.value)
154
+ return false;
155
+ const triggers = Array.isArray(props.trigger) ? props.trigger : [props.trigger];
156
+ return triggers.some((t) => typeof t === "string" && !["immediate", "onNuxtReady", "visibility", "visible"].includes(t));
157
+ });
158
+ function onPlaceholderKeydown(e) {
159
+ if (e.key !== "Enter" && e.key !== " ")
160
+ return;
161
+ e.preventDefault();
162
+ if (!rootEl.value)
163
+ return;
164
+ const triggers = (Array.isArray(props.trigger) ? props.trigger : [props.trigger]).filter(Boolean);
165
+ for (const t of triggers) {
166
+ if (typeof t !== "string")
167
+ continue;
168
+ if (["immediate", "onNuxtReady", "visibility", "visible"].includes(t))
169
+ continue;
170
+ rootEl.value.dispatchEvent(new Event(t, { bubbles: false }));
171
+ }
172
+ }
152
173
  const rootAttrs = computed(() => {
174
+ const interactive = keyboardTriggerable.value;
153
175
  return defu(props.rootAttrs, {
154
176
  "aria-busy": status.value === "loading",
155
- "aria-label": status.value === "awaitingLoad" ? "Vimeo Player - Placeholder" : status.value === "loading" ? "Vimeo Player - Loading" : "Vimeo Player - Loaded",
177
+ "aria-label": status.value === "awaitingLoad" ? interactive ? "Play video" : "Vimeo Player - Placeholder" : status.value === "loading" ? "Vimeo Player - Loading" : "Vimeo Player - Loaded",
156
178
  "aria-live": "polite",
157
- "role": "application",
179
+ "role": interactive ? "button" : "application",
180
+ "tabindex": interactive ? 0 : void 0,
158
181
  "style": {
159
182
  "--vimeo-ratio": props.ratio,
160
183
  "maxWidth": "100%",
@@ -170,7 +193,7 @@ const rootAttrs = computed(() => {
170
193
  const placeholderAttrs = computed(() => {
171
194
  return defu(props.placeholderAttrs, {
172
195
  src: placeholder.value,
173
- alt: "",
196
+ alt: "Play video",
174
197
  loading: props.aboveTheFold ? "eager" : "lazy",
175
198
  // @ts-expect-error untyped
176
199
  fetchpriority: props.aboveTheFold ? "high" : void 0,
@@ -186,7 +209,7 @@ onBeforeUnmount(() => player?.unload());
186
209
  </script>
187
210
 
188
211
  <template>
189
- <div ref="rootEl" v-bind="rootAttrs">
212
+ <div ref="rootEl" v-bind="rootAttrs" @keydown="keyboardTriggerable ? onPlaceholderKeydown($event) : void 0">
190
213
  <div v-show="ready" ref="elVimeo" class="vimeo-player" />
191
214
  <slot v-if="!ready" v-bind="payload" :placeholder="placeholder" name="placeholder">
192
215
  <img v-if="placeholder" v-bind="placeholderAttrs">
@@ -115,12 +115,33 @@ onMounted(() => {
115
115
  defineExpose({
116
116
  player
117
117
  });
118
+ const keyboardTriggerable = computed(() => {
119
+ if (isTriggered.value)
120
+ return false;
121
+ const triggers = Array.isArray(props.trigger) ? props.trigger : [props.trigger];
122
+ return triggers.some((t) => typeof t === "string" && !["immediate", "onNuxtReady", "visibility", "visible"].includes(t));
123
+ });
124
+ function onPlaceholderKeydown(e) {
125
+ if (e.key !== "Enter" && e.key !== " ")
126
+ return;
127
+ e.preventDefault();
128
+ if (!rootEl.value)
129
+ return;
130
+ const triggers = (Array.isArray(props.trigger) ? props.trigger : [props.trigger]).filter(Boolean);
131
+ for (const t of triggers) {
132
+ if (["immediate", "onNuxtReady", "visibility", "visible"].includes(t))
133
+ continue;
134
+ rootEl.value.dispatchEvent(new Event(t, { bubbles: false }));
135
+ }
136
+ }
118
137
  const rootAttrs = computed(() => {
138
+ const interactive = keyboardTriggerable.value;
119
139
  return defu(props.rootAttrs, {
120
140
  "aria-busy": status.value === "loading",
121
- "aria-label": status.value === "awaitingLoad" ? "YouTube Player - Placeholder" : status.value === "loading" ? "YouTube Player - Loading" : "YouTube Player - Loaded",
141
+ "aria-label": status.value === "awaitingLoad" ? interactive ? "Play video" : "YouTube Player - Placeholder" : status.value === "loading" ? "YouTube Player - Loading" : "YouTube Player - Loaded",
122
142
  "aria-live": "polite",
123
- "role": "application",
143
+ "role": interactive ? "button" : "application",
144
+ "tabindex": interactive ? 0 : void 0,
124
145
  "style": {
125
146
  cursor: "pointer",
126
147
  position: "relative",
@@ -154,7 +175,7 @@ if (import.meta.server) {
154
175
  const placeholderAttrs = computed(() => {
155
176
  return defu(props.placeholderAttrs, {
156
177
  src: isFallbackPlaceHolder.value ? fallbackPlaceHolder.value : placeholder.value,
157
- alt: "",
178
+ alt: "Play video",
158
179
  loading: props.aboveTheFold ? "eager" : "lazy",
159
180
  // @ts-expect-error untyped
160
181
  fetchpriority: props.aboveTheFold ? "high" : void 0,
@@ -174,7 +195,7 @@ const placeholderAttrs = computed(() => {
174
195
  </script>
175
196
 
176
197
  <template>
177
- <div ref="rootEl" v-bind="rootAttrs">
198
+ <div ref="rootEl" v-bind="rootAttrs" @keydown="keyboardTriggerable ? onPlaceholderKeydown($event) : void 0">
178
199
  <div ref="youtubeEl" style="width: 100%; height: 100%; position: absolute; top: 0; left: 0;" />
179
200
  <slot v-if="!ready" :placeholder="placeholder" name="placeholder">
180
201
  <img v-bind="placeholderAttrs">
@@ -181,6 +181,7 @@ export function useScript(input, options) {
181
181
  if (!options.head) {
182
182
  throw new Error("useScript() has been called without Nuxt context.");
183
183
  }
184
+ const headHooks = options.head.hooks;
184
185
  ensureScripts(nuxtApp);
185
186
  const exists = !!nuxtApp.$scripts?.[id];
186
187
  const err = options._validate?.();
@@ -246,7 +247,7 @@ export function useScript(input, options) {
246
247
  ...ctx,
247
248
  trigger: typeof trigger === "object" ? trigger instanceof Promise ? "promise" : JSON.stringify(trigger) : trigger
248
249
  });
249
- options.head.hooks.hook("script:updated", (entry) => {
250
+ headHooks.hook("script:updated", (entry) => {
250
251
  if (entry.script.id !== instance.id)
251
252
  return;
252
253
  const status = entry.script.status;
@@ -292,7 +293,7 @@ export function useScript(input, options) {
292
293
  };
293
294
  nuxtApp._scripts = nuxtApp._scripts || {};
294
295
  if (!nuxtApp._scripts[instance.id]) {
295
- options.head.hooks.hook("script:updated", (ctx) => {
296
+ headHooks.hook("script:updated", (ctx) => {
296
297
  if (ctx.script.id !== instance.id)
297
298
  return;
298
299
  payload.events.push({
@@ -303,7 +304,7 @@ export function useScript(input, options) {
303
304
  payload.$script = instance;
304
305
  syncScripts();
305
306
  });
306
- options.head.hooks.hook("script:instance-fn", (ctx) => {
307
+ headHooks.hook("script:instance-fn", (ctx) => {
307
308
  if (ctx.script.id !== instance.id || String(ctx.fn).startsWith("__v_"))
308
309
  return;
309
310
  payload.events.push({
@@ -988,6 +988,75 @@ export declare const InitObjectPropertiesSchema: import("valibot").ObjectSchema<
988
988
  */
989
989
  readonly age: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
990
990
  }, undefined>;
991
+ export declare const SpeedCurveOptions: import("valibot").ObjectSchema<{
992
+ /**
993
+ * Your SpeedCurve customer ID.
994
+ * @see https://support.speedcurve.com/docs/add-rum-to-your-site
995
+ */
996
+ readonly id: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MinLengthAction<string, 1, undefined>]>;
997
+ /**
998
+ * Enable SPA (single-page application) mode.
999
+ * When true, lux.js tracks soft navigations instead of full page loads.
1000
+ * @see https://support.speedcurve.com/docs/single-page-applications
1001
+ */
1002
+ readonly spaMode: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1003
+ /**
1004
+ * Automatically wire Vue Router hooks for SPA tracking when spaMode is true.
1005
+ * Set to false to instrument navigations manually.
1006
+ * @default true (when spaMode is true)
1007
+ */
1008
+ readonly autoTrackSpaNavigations: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1009
+ /**
1010
+ * Page label shown in the SpeedCurve dashboard.
1011
+ * Accepts a static string, a function `(to) => string | false` for per-navigation labels,
1012
+ * or `false` to disable labeling entirely. A callback returning `false` skips updating
1013
+ * the label for that navigation.
1014
+ * @default String(to.name ?? to.path)
1015
+ */
1016
+ readonly label: import("valibot").OptionalSchema<import("valibot").UnionSchema<[import("valibot").StringSchema<undefined>, import("valibot").FunctionSchema<undefined>, import("valibot").LiteralSchema<false, undefined>], undefined>, undefined>;
1017
+ /**
1018
+ * Sampling rate (0–100). Percentage of sessions that send beacons.
1019
+ * Upstream spelling is lowercase — matches LUX UserConfig.
1020
+ */
1021
+ readonly samplerate: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").NumberSchema<undefined>, import("valibot").MinValueAction<number, 0, undefined>, import("valibot").MaxValueAction<number, 100, undefined>]>, undefined>;
1022
+ /**
1023
+ * Send the beacon when the page is hidden (pagehide event).
1024
+ * @default true
1025
+ */
1026
+ readonly sendBeaconOnPageHidden: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1027
+ /**
1028
+ * Track JavaScript errors.
1029
+ * @default true
1030
+ */
1031
+ readonly trackErrors: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1032
+ /**
1033
+ * Maximum number of errors to track per page view.
1034
+ * @default 5
1035
+ */
1036
+ readonly maxErrors: import("valibot").OptionalSchema<import("valibot").NumberSchema<undefined>, undefined>;
1037
+ /**
1038
+ * Minimum time (ms) before a beacon can be sent.
1039
+ */
1040
+ readonly minMeasureTime: import("valibot").OptionalSchema<import("valibot").NumberSchema<undefined>, undefined>;
1041
+ /**
1042
+ * Maximum time (ms) after which the beacon is sent regardless of load state.
1043
+ * @default 60000
1044
+ */
1045
+ readonly maxMeasureTime: import("valibot").OptionalSchema<import("valibot").NumberSchema<undefined>, undefined>;
1046
+ /**
1047
+ * Start a new beacon when the page becomes visible after being hidden.
1048
+ */
1049
+ readonly newBeaconOnPageShow: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1050
+ /**
1051
+ * Track pages loaded in background tabs.
1052
+ * @default false
1053
+ */
1054
+ readonly trackHiddenPages: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1055
+ /**
1056
+ * Cookie domain for cross-subdomain session tracking.
1057
+ */
1058
+ readonly cookieDomain: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
1059
+ }, undefined>;
991
1060
  export declare const SnapTrPixelOptions: import("valibot").ObjectSchema<{
992
1061
  /**
993
1062
  * The user's email address (for matching).
@@ -1055,6 +1124,13 @@ export declare const StripeOptions: import("valibot").ObjectSchema<{
1055
1124
  * @see https://docs.stripe.com/disputes/prevention/advanced-fraud-detection
1056
1125
  */
1057
1126
  readonly advancedFraudSignals: import("valibot").OptionalSchema<import("valibot").BooleanSchema<undefined>, undefined>;
1127
+ /**
1128
+ * The Stripe.js SDK version to load.
1129
+ * Named releases get autocomplete; any future codename is also accepted.
1130
+ * @default 'basil'
1131
+ * @see https://docs.stripe.com/sdks/stripejs-versioning
1132
+ */
1133
+ readonly version: import("valibot").OptionalSchema<import("valibot").UnionSchema<[import("valibot").LiteralSchema<"v3", undefined>, import("valibot").LiteralSchema<"acacia", undefined>, import("valibot").LiteralSchema<"basil", undefined>, import("valibot").LiteralSchema<"clover", undefined>, import("valibot").LiteralSchema<"dahlia", undefined>, import("valibot").StringSchema<undefined>], undefined>, undefined>;
1058
1134
  }, undefined>;
1059
1135
  export declare const TikTokPixelOptions: import("valibot").ObjectSchema<{
1060
1136
  /**