@bagelink/blox 1.15.677 → 1.15.678

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.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Google Tag Manager injection for Blox sites.
3
+ *
4
+ * GTM is a container: a single `<script>` that then loads every marketing tag
5
+ * configured in the UI (HubSpot, Facebook Pixel, Hotjar, Clarity, Taboola,
6
+ * Cookiebot, …). On a typical marketing site that chain is 1.5–2.5 MB of
7
+ * third-party JavaScript and seconds of main-thread work — all of it blocking
8
+ * the first interaction on mobile.
9
+ *
10
+ * Most of it is pure instrumentation that no visitor needs before they
11
+ * actually do something, so the default strategy defers the container until
12
+ * the first real interaction. Events queued in `window.dataLayer` before that
13
+ * point are replayed by GTM when it starts, so no analytics is lost for
14
+ * visitors who do interact.
15
+ *
16
+ * SSR-safe: all functions no-op without a `document`.
17
+ */
18
+ export type GtmStrategy = 'immediate' | 'interaction';
19
+ export interface GtmOptions {
20
+ /** Container id, e.g. `GTM-5SKV4D7`. */
21
+ id: string;
22
+ /**
23
+ * When to inject the container.
24
+ *
25
+ * - `interaction` (default) — first pointer/key/scroll input. Keeps the tag
26
+ * chain entirely off the critical path.
27
+ * - `immediate` — inject at boot (classic behaviour).
28
+ */
29
+ strategy?: GtmStrategy;
30
+ }
31
+ /** True when a GTM container script is already on the page. */
32
+ export declare function isGtmInstalled(): boolean;
33
+ /** Inject the container now. Idempotent. */
34
+ export declare function injectGtm(id: string): void;
35
+ /**
36
+ * Install Google Tag Manager according to `strategy`.
37
+ *
38
+ * Safe to call during SSR and to call more than once. Returns a cleanup
39
+ * function that removes any pending interaction listeners.
40
+ */
41
+ export declare function installGtm(config: string | GtmOptions | null | undefined, strategyOverride?: GtmStrategy): () => void;
42
+ //# sourceMappingURL=gtm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gtm.d.ts","sourceRoot":"","sources":["../../src/analytics/gtm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,CAAA;AAErD,MAAM,WAAW,UAAU;IAC1B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAA;CACtB;AAOD,+DAA+D;AAC/D,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAc1C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACzB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,EAC9C,gBAAgB,CAAC,EAAE,WAAW,GAC5B,MAAM,IAAI,CAiCZ"}
@@ -2,6 +2,7 @@ import { App, Component, Plugin } from 'vue';
2
2
  import { Router } from 'vue-router';
3
3
  import { BloxOptions, BloxInstance } from './core';
4
4
  import { BlockModule } from './defineBlock';
5
+ import { GtmOptions } from './analytics/gtm';
5
6
  export interface CreateBloxAppOptions {
6
7
  /** Root Vue component (App.vue). */
7
8
  rootComponent: Component;
@@ -64,6 +65,22 @@ export interface CreateBloxAppOptions {
64
65
  * plausible: 'auctentic2.netlify.app'
65
66
  */
66
67
  plausible?: string | PlausibleOptions;
68
+ /**
69
+ * Google Tag Manager. When set, the container is injected on the client.
70
+ *
71
+ * - `string` shorthand (`'GTM-XXXXXX'`) → deferred until first interaction.
72
+ * - object → `{ id, strategy }` to opt into `'immediate'` (load at boot).
73
+ *
74
+ * GTM pulls in every marketing tag configured in the container, so the
75
+ * default `interaction` strategy keeps that whole chain off the critical
76
+ * path. Events already pushed to `window.dataLayer` are replayed when the
77
+ * container starts.
78
+ *
79
+ * @example
80
+ * gtm: 'GTM-5SKV4D7'
81
+ * gtm: { id: 'GTM-5SKV4D7', strategy: 'immediate' }
82
+ */
83
+ gtm?: string | GtmOptions;
67
84
  /**
68
85
  * CMS navigation mode. @default 'document'
69
86
  *
@@ -1 +1 @@
1
- {"version":3,"file":"createBloxApp.d.ts","sourceRoot":"","sources":["../src/createBloxApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAahD,MAAM,WAAW,oBAAoB;IACpC,oCAAoC;IACpC,aAAa,EAAE,SAAS,CAAA;IACxB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpD,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAA;IAClD;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAA;IACrC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,KAAK,CAAA;IAC/B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;IACpC,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAUtE;AAWD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAoCvE;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,GAAG,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,YAAY,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAyK1E"}
1
+ {"version":3,"file":"createBloxApp.d.ts","sourceRoot":"","sources":["../src/createBloxApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAYhD,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE7D,MAAM,WAAW,oBAAoB;IACpC,oCAAoC;IACpC,aAAa,EAAE,SAAS,CAAA;IACxB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpD,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAA;IAClD;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAA;IACrC;;;;;;;;;;;;;;OAcG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IACzB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,KAAK,CAAA;IAC/B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;IACpC,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAUtE;AAWD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAoCvE;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,GAAG,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,YAAY,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA6K1E"}
package/dist/index.cjs CHANGED
@@ -231,6 +231,53 @@ function safeRoute() {
231
231
  return null;
232
232
  }
233
233
  }
234
+ const INTERACTION_EVENTS = ["pointerdown", "keydown", "touchstart", "wheel", "scroll"];
235
+ const GTM_ID_RE = /^GTM-[A-Z0-9]+$/;
236
+ function isGtmInstalled() {
237
+ if (typeof document === "undefined") return false;
238
+ return Boolean(document.querySelector('script[src*="googletagmanager.com/gtm.js"]'));
239
+ }
240
+ function injectGtm(id) {
241
+ if (typeof document === "undefined") return;
242
+ if (!GTM_ID_RE.test(id)) return;
243
+ if (isGtmInstalled()) return;
244
+ const target = window;
245
+ (target.dataLayer || (target.dataLayer = [])).push({ "gtm.start": Date.now(), event: "gtm.js" });
246
+ const script = document.createElement("script");
247
+ script.async = true;
248
+ script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(id)}`;
249
+ document.head.appendChild(script);
250
+ }
251
+ function installGtm(config, strategyOverride) {
252
+ if (typeof document === "undefined" || !config) return () => {
253
+ };
254
+ const options = typeof config === "string" ? { id: config } : config;
255
+ const { id } = options;
256
+ if (!GTM_ID_RE.test(id) || isGtmInstalled()) return () => {
257
+ };
258
+ const strategy = options.strategy ?? strategyOverride ?? "interaction";
259
+ if (strategy === "immediate") {
260
+ injectGtm(id);
261
+ return () => {
262
+ };
263
+ }
264
+ let done = false;
265
+ const cleanup = () => {
266
+ done = true;
267
+ for (const event of INTERACTION_EVENTS) {
268
+ window.removeEventListener(event, fire, { capture: true });
269
+ }
270
+ };
271
+ const fire = () => {
272
+ if (done) return;
273
+ cleanup();
274
+ injectGtm(id);
275
+ };
276
+ for (const event of INTERACTION_EVENTS) {
277
+ window.addEventListener(event, fire, { capture: true, passive: true, once: true });
278
+ }
279
+ return cleanup;
280
+ }
234
281
  const DEFAULT_PLAUSIBLE_HOST = "https://analytics.bagel.to";
235
282
  function matchesRealRoute(router, slug) {
236
283
  var _a;
@@ -291,11 +338,13 @@ function createBloxApp(options) {
291
338
  globalComponents = {},
292
339
  setup: userSetup,
293
340
  plausible,
341
+ gtm,
294
342
  navigation = "document",
295
343
  adminEdit,
296
344
  chunkLoadRecovery = true
297
345
  } = options;
298
346
  if (plausible) injectPlausible(plausible);
347
+ if (gtm) installGtm(gtm);
299
348
  if (options.createApi) {
300
349
  options.createApi({ baseURL: apiBaseURL });
301
350
  }
@@ -504,8 +553,11 @@ exports.buildBloxManifest = buildBloxManifest;
504
553
  exports.createBloxApp = createBloxApp;
505
554
  exports.defineBlock = defineBlock;
506
555
  exports.defineBloxSite = defineBloxSite;
556
+ exports.injectGtm = injectGtm;
507
557
  exports.injectPlausible = injectPlausible;
508
558
  exports.installDocumentNavigation = installDocumentNavigation;
559
+ exports.installGtm = installGtm;
560
+ exports.isGtmInstalled = isGtmInstalled;
509
561
  exports.serializeRegistry = serializeRegistry;
510
562
  exports.useBloxRuntime = useBloxRuntime;
511
563
  exports.useContentSeo = useContentSeo;
package/dist/index.d.ts CHANGED
@@ -25,6 +25,8 @@ export { BloxInstance, createBlox } from './core';
25
25
  export type { BloxComponent, BloxOptions } from './core';
26
26
  export { createBloxApp, injectPlausible } from './createBloxApp';
27
27
  export type { BloxAppResult, CreateBloxAppOptions, PlausibleOptions } from './createBloxApp';
28
+ export { injectGtm, installGtm, isGtmInstalled } from './analytics/gtm';
29
+ export type { GtmOptions, GtmStrategy } from './analytics/gtm';
28
30
  export { defineBloxSite } from './siteConfig';
29
31
  export type { BloxSiteConfig } from './siteConfig';
30
32
  export { defineBlock } from './defineBlock';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -231,6 +231,53 @@ function safeRoute() {
231
231
  return null;
232
232
  }
233
233
  }
234
+ const INTERACTION_EVENTS = ["pointerdown", "keydown", "touchstart", "wheel", "scroll"];
235
+ const GTM_ID_RE = /^GTM-[A-Z0-9]+$/;
236
+ function isGtmInstalled() {
237
+ if (typeof document === "undefined") return false;
238
+ return Boolean(document.querySelector('script[src*="googletagmanager.com/gtm.js"]'));
239
+ }
240
+ function injectGtm(id) {
241
+ if (typeof document === "undefined") return;
242
+ if (!GTM_ID_RE.test(id)) return;
243
+ if (isGtmInstalled()) return;
244
+ const target = window;
245
+ (target.dataLayer || (target.dataLayer = [])).push({ "gtm.start": Date.now(), event: "gtm.js" });
246
+ const script = document.createElement("script");
247
+ script.async = true;
248
+ script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(id)}`;
249
+ document.head.appendChild(script);
250
+ }
251
+ function installGtm(config, strategyOverride) {
252
+ if (typeof document === "undefined" || !config) return () => {
253
+ };
254
+ const options = typeof config === "string" ? { id: config } : config;
255
+ const { id } = options;
256
+ if (!GTM_ID_RE.test(id) || isGtmInstalled()) return () => {
257
+ };
258
+ const strategy = options.strategy ?? strategyOverride ?? "interaction";
259
+ if (strategy === "immediate") {
260
+ injectGtm(id);
261
+ return () => {
262
+ };
263
+ }
264
+ let done = false;
265
+ const cleanup = () => {
266
+ done = true;
267
+ for (const event of INTERACTION_EVENTS) {
268
+ window.removeEventListener(event, fire, { capture: true });
269
+ }
270
+ };
271
+ const fire = () => {
272
+ if (done) return;
273
+ cleanup();
274
+ injectGtm(id);
275
+ };
276
+ for (const event of INTERACTION_EVENTS) {
277
+ window.addEventListener(event, fire, { capture: true, passive: true, once: true });
278
+ }
279
+ return cleanup;
280
+ }
234
281
  const DEFAULT_PLAUSIBLE_HOST = "https://analytics.bagel.to";
235
282
  function matchesRealRoute(router, slug) {
236
283
  var _a;
@@ -291,11 +338,13 @@ function createBloxApp(options) {
291
338
  globalComponents = {},
292
339
  setup: userSetup,
293
340
  plausible,
341
+ gtm,
294
342
  navigation = "document",
295
343
  adminEdit,
296
344
  chunkLoadRecovery = true
297
345
  } = options;
298
346
  if (plausible) injectPlausible(plausible);
347
+ if (gtm) installGtm(gtm);
299
348
  if (options.createApi) {
300
349
  options.createApi({ baseURL: apiBaseURL });
301
350
  }
@@ -481,11 +530,14 @@ export {
481
530
  getItemBySlug,
482
531
  getWebsiteId,
483
532
  getWebsiteIdSync,
533
+ injectGtm,
484
534
  injectPlausible,
485
535
  K as installContentFallback,
486
536
  installDocumentNavigation,
537
+ installGtm,
487
538
  installSmartLinks,
488
539
  L as isAbsoluteExternal,
540
+ isGtmInstalled,
489
541
  M as isSoloContentPage,
490
542
  N as isSpecialScheme,
491
543
  listItems,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/blox",
3
3
  "type": "module",
4
- "version": "1.15.677",
4
+ "version": "1.15.678",
5
5
  "description": "Blox page builder library for drag-and-drop page building and static data management",
6
6
  "author": {
7
7
  "name": "Bagel Studio",